linux /proc/sys/fs/file-nr /proc/sys/fs/file-max /etc/security/limits.conf 三者的关联

ulimit -n 对应 /etc/security/limits.conf 文件设置
问题: Can’t open so many files 对于linux运维的同学们,相信都遇到过这个问题。
在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。系统默认设置成1024,但是这个数字对于服务器特别是大并发的远远是不够的,所以,我们需要结合实际情况修改成一个更大更合理的值。
修改方法

临时解决方案: ulimit -SHn 65535

永久解决方案,注意,切勿设置过大,造成服务器无法启动,小于 /proc/sys/fs/file-max
vim /etc/security/limits.conf

# 确认包含下面的内容:
* soft nofile 65536
* hard nofile 65536
保存,然后重启
注:65536 是我这边的设定值,读者也可以自行设置一个合适的值,* 代表针对所有用户

另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量

ulimit -u
比如我们在模拟大规模http并发测试的时候,客户端会报一个无法fork new proc异常,原因是受到了最大进程1024的限制
解除 Linux 系统的最大进程数
方法如下
vim /etc/security/limits.d/90-nproc.conf

# 添加如下的行
* soft nproc 102400
root soft nproc 102400

ulimit中硬限制是实际的限制,而软限制,是warnning限制,只会做出warning,其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软。
默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改
配置文件最前面的一位是domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制
但是ulimit其实就是对单一程序的限制,进程级别的
那系统总限制呢
其实是在这里,/proc/sys/fs/file-max
通过 man 5 proc 找到file-max的解释: file-max指定了系统范围内所有进程可以打开的文件句柄的数量限制。kernel-level。
可以通过cat查看目前的值,echo来立刻修改
echo 10000 > /proc/sys/fs/file-max
另外还有一个,/proc/sys/fs/file-nr
只读,可以看到整个系统目前使用的文件句柄数量
ps :
[root@qike ~]# cat /proc/sys/fs/file-nr
1024 0 101269
其中分别表示
已分配文件句柄的数目 / 分配了但没有使用的句柄数目 / 文件句柄的最大数目
具体解释参考http://www.dewen.io/q/14740

http://stackoverflow.com/questions/3991223/how-does-linux-file-descriptor-limits-work

[root@qike ~]# cat /proc/sys/fs/file-max
101269
可以看到file-nr的最后一项 和file-max是一致的

参考链接 https://gitsea.com/2013/05/23/linux-ulimit%E8%AF%A6%E8%A7%A3/

http://blog.sina.com.cn/s/blog_605f5b4f01013lad.html

posted @ 2015-11-30 17:18  dantes博客  阅读(2796)  评论(0编辑  收藏  举报