Linux ulimit 设置


[root@myserver test]# 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) 14846
max locked memory       (kbytes, -l) 64
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) 14846
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

其中 "open files (-n)" 是 Linux 操作系统对一个进程打开的文件句柄数量的限制,也包含打开的 socket 数量。
这个值可用 ulimit 命令来修改,但 ulimit 命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效。

系统总限制是在这里,/proc/sys/fs/file-max。可以通过 cat 查看目前的值,修改 /etc/sysctl.conf 中也可以控制。
另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量。
查找文件句柄问题的时候,还有一个很实用的程序 lsof。
可以很方便看到某个进程开了那些句柄,也可以看到某个文件/目录被什么进程占用了。

若要修改 ulimits 的数值永久生效,修改 /etc/sysctl.conf。
但对用户的 ulimits -a 是不会改变的,只是 /proc/sys/fs/file-max 的值变了。

正确的做法,是修改 /etc/security/limits.conf。
里面有很详细的注释,比如

* soft nofile 32768
* hard nofile 65536

就可以将文件句柄限制统一改成软 32768,硬 65536。
配置文件最前面的是指 domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制。

这个当中的硬限制是实际的限制,而软限制,是 warnning 限制,只会做出 warning。
其实 ulimit 命令本身就有分软硬设置,加 -H 就是硬限制,加 -S 就是软限制。
默认显示的是软限制,如果运行 ulimit 命令修改的时候没有加上的话,就是两个参数一起改变。

分享:

评论