这是一篇很是好的文章,对ulimit的各个限制参数讲得很是透彻。原文连接:http://home.lupaworld.com/home-space-uid-56821-do-blog-id-232810.htmlhtml
通常能够经过ulimit命令或编辑/etc/security/limits.conf从新加载的方式使之生效
经过ulimit比较直接,但只在当前的session有效,limits.conf中能够根据用户和限制项使用户在下次登陆中生效.
对于limits.conf的设定是经过pam_limits.so的加载生效的,好比/etc/pam.d/sshd,这样经过ssh登陆时会加载limit.
又或者在/etc/pam.d/login加载生效.
下面将对各类限制进行分析
core file size
data seg size
scheduling priority
file size
pending signals
max locked memory
max memory size
open files
pipe size
POSIX message queues
real-time priority
stack size
cpu time
max user processes
virtual memory
file locks
一)限制进程产生的文件大小(file size)
先来讲说ulimit的硬限制和软限制
硬限制用-H参数,软限制用-S参数.
ulimit -a看到的是软限制,经过ulimit -a -H能够看到硬限制.
若是ulimit不限定使用-H或-S,此时它会同时把两类限制都改掉的.
软限制能够限制用户/组对资源的使用,硬限制的做用是控制软限制.
超级用户和普通用户均可以扩大硬限制,但超级用户能够缩小硬限制,普通用户则不能缩小硬限制.
硬限制设定后,设定软限制时只能是小于或等于硬限制.
下面的测试应用于硬限制和软限制.
1)软限制不能超过硬限制
在超级用户下,同时修改硬/软限制,使当前会话只能建100KB的文件
ulimit -f 100
查看当前建立文件大小的硬限制为100KB
ulimit -H -f
100
此时限制当前会话的软限制为1000KB,出现不能修改的报错
ulimit -S -f 1000
-bash: ulimit: file size: cannot modify limit: Invalid argument
2)硬限制不能小于软限制
在超级用户下,用户查看当前的软限制,此时为unlmiited
ulimit -S -f
unlimited
此时修改当前会话建立文件大小的硬限制为1000KB,出现不能修改的报错,说明硬限制不能小于软限制
ulimit -H -f 1000
-bash: ulimit: file size: cannot modify limit: Invalid argument
若是咱们把建立文件大小的软限制改成900KB,此后就能够修改它的硬限制了
ulimit -S -f 900
ulimit -H -f 1000
3)普通用户只能缩小硬限制,超级用户能够扩大硬限制
用普通用户进入系统
su - test
查看建立文件大小的硬限制
ulimit -H -f
unlimited
此时能够缩小该硬限制
ulimit -H -f 1000
但不能扩大该硬限制
ulimit -H -f 10000
4)硬限制控制软限制,软限制来限制用户对资源的使用
用软限制限制建立文件的大小为1000KB
ulimit -S -f 1000
用硬限制限制建立文件的大小为2000KB
ulimit -H -f 2000
建立3MB大小的文件
dd if=/dev/zero of=/tmp/test bs=3M count=1
File size limit exceeded
查看/tmp/test的大小为1000KB,说明软限制对资源的控制是起决定性做用的.
ls -lh /tmp/test
-rw-r--r-- 1 root root 1000K 2010-10-15 23:04 /tmp/test
file size单位是KB.
二)关于进程优先级的限制(scheduling priority)
这里的优先级指NICE值
这个值只对普通用户起做用,对超级用户不起做用,这个问题是因为CAP_SYS_NICE形成的.
例如调整普通用户可使用的nice值为-10到20之间.
硬限制nice的限制为-15到20之间.
ulimit -H -e 35
软限制nice的限制为-10到20之间
ulimit -S -e 30
用nice命令,使执行ls的nice值为-10
nice -n -10 ls /tmp
ssh-BossiP2810
用nice命令,使执行ls的nice值为-11,此时超过了ulimit对nice的软限制,出现了异常.
nice -n -11 ls /tmp
nice: cannot set niceness: Permission denied
三)内存锁定值的限制(max locked memory)
这个值只对普通用户起做用,对超级用户不起做用,这个问题是因为CAP_IPC_LOCK形成的.
linux对内存是分页管理的,这意味着有不须要时,在物理内存的数据会被换到交换区或磁盘上.
有须要时会被交换到物理内存,而将数据锁定到物理内存能够避免数据的换入/换出.
采用锁定内存有两个理由:
1)因为程序设计上须要,好比oracle等软件,就须要将数据锁定到物理内存.
2)主要是安全上的须要,好比用户名和密码等等,被交换到swap或磁盘,有泄密的可能,因此一直将其锁定到物理内存.
锁定内存的动做由mlock()函数来完成
mlock的原型以下:
int mlock(const void *addr,size_t len);
测试程序以下:
#include <stdio.h>
#include <sys/mman.h>
int main(int argc, char* argv[])
{