分类: Linux
Linux下有效修改最大文件句柄数 max open files及ulimit原理

limits.conf 工作原理

limits.conf 是 pam_limits.so 的配置文件,然后 /etc/pam.d/ 下的应用程序调用 pam_*.so 模块。譬如说,当用户访问服务器,服务程序将请求发送到 PAM 模块,PAM 模块根据服务名称在 /etc/pam.d 目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的 PAM 模块进行处理,先在/etc/sysctl.conf中增加fs.nr_open = 5242880配置,在调整下limit

limits.conf 文件格式

username|@groupname   type  resource  limit 
1)username|@groupname
设置需要被限制的用户名,组名前面加 @和用户名区别。也可用通配符 * 来做所有用户的限制

2)type
类型有 soft,hard 和 -,其中 soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比 hard 限制高。用 - 就表明同时设置了 soft 和 hard 的值

3)resource: 表示要限制的资源
nofile - 打开文件的最大数目
noproc - 进程的最大数目

ulimit 命令用来限制系统用户对 shell 资源的访问,常用参数解释如下

ulimit(选项):
-a:显示目前资源限制的设定;
-c <core 文件上限 & gt;:设定 core 文件的最大值,单位为区块;
-d < 数据节区大小 & gt;:程序数据节区的最大值,单位为 KB;
-f < 文件大小 & gt;:shell 所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m < 内存大小 & gt;:指定可使用内存的上限,单位为 KB;
-n < 文件数目 & gt;:指定同一时间最多可开启的文件数;
-p < 缓冲区大小 & gt;:指定管道缓冲区的大小,单位 512 字节;
-s < 堆叠大小 & gt;:指定堆叠的上限,单位为 KB;
-S:设定资源的弹性限制;
-t <CPU 时间 & gt;:指定 CPU 使用时间的上限,单位为秒;
-u < 程序数目 & gt;:用户最多可开启的程序数目;
-v < 虚拟内存大小 & gt;:指定可使用的虚拟内存上限,单位为 KB。

使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 1048576 可即时修改,但重启后就无效了。(注ulimit -SHn 1048576 等效 ulimit -n 1048576,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -SHn 1048576
2.在/etc/profile 中增加一行 ulimit -SHn 1048576
3.在/etc/security/limits.conf最后增加如下两行记

* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
---------------------------------------------
cat <<EOF>> /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
EOF

CentOS6修改线程参数:

sed -i "s/1024/1048576/g" /etc/security/limits.d/90-nproc.conf
echo 'ulimit -n 1048576' >> /etc/profile

CentOS7修改线程参数:

sed -i "s/4096/1048576/g" /etc/security/limits.d/20-nproc.conf 
echo 'ulimit -n 1048576' >> /etc/profile

具体使用哪种,试试哪种有效吧,CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果.
open file(s) kernel 级别有2个配置,分别是:
fs.nr_open,进程级别
fs.file-max,系统级别
fs.nr_open 默认设置的上限是 1048576,所以用户的 open file(s) 不可能超过这个上限。
VIA:
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/tuning_and_optimizing_red_hat_enterprise_linux_for_oracle_9i_and_10g_databases/chap-oracle_9i_and_10g_tuning_guide-setting_file_handles


相关博文:

发表新评论