使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
具体使用哪种,试试哪种有效吧,我在 CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果
其实CentOS ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软默认显示的是软限制,如果运行CentOS ulimit命令修改的时候没有加上的话,就是两个参数一起改变.生效
修改完重新登录就可以见到.(我的系统是CentOS5.1.修改了,重新登录后就立刻生效.可以用CentOS ulimit -a 查看确认.)
[root@dev ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 17513
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 17513
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
Linux文件描述符可参见笔者之前的文章:http://kumu1988.blog.51cto.com/4075018/1086210
关于RHEL6中ulimit的nproc限制,RHEL6和RHEL5还是有一些细节上的区别的:
当前shell下更改用户可打开进程数
作为临时限制,ulimit可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他shell 会话。

修改limits.conf配置文件生效
[root@kumu ~]# ulimit -a //查看当前配置文件ulimit全局系数
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1829
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@kumu ~]# vim /etc/security/limits.conf
[root@kumu ~]# grep '^*' /etc/security/limits.conf
* soft nproc 10240
* hard nproc 10240
* soft nofile 10240
* hard nofile 10240
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]# ulimit -u //发现nproc并没有像nofile一样而改变
1024
[root@kumu ~]#
经google搜索获知,RHEL6下引入了配置文件
/etc/security/limits.d/90-nproc.conf
(参见了@杨德华Devin 文章redhat5 和redhat6 root用户不同的ulimits)
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
[root@kumu ~]#
我们修改这个文件尝试是否因为该文件影响,修改如下
[root@kumu ~]# vim /etc/security/limits.d/90-nproc.conf
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#* soft nproc 1024
* soft nproc 65535
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效,执行如下命令发现修改成功
[root@kumu ~]# ulimit -u
10240
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]#
由此可知,如果要修改配置文件limits.conf中的nproc限制上限是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,但是shell终端下是不受制约的
另外笔者猜想,如果使用*号让全局用户生效是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响
[root@kumu ~]# vim /etc/security/limits.d/90-nproc.conf //恢复系统默认设置
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
#* soft nproc 65535
[root@kumu ~]# vim /etc/security/limits.conf //只针对某个用户测试(这里使用root)
[root@kumu ~]# grep '^root' /etc/security/limits.conf
root soft nproc 10240
root hard nproc 10240
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效,执行如下命令发现修改成功
[root@kumu ~]# ulimit -u
10240
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]#
笔者之前猜想正确,即只有当使用*号让全局用户生效的时候,生效的nproc的值大小是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响。