centos7设置进程文件句柄数量
背景:线上有个服务用作视频通信用,偶尔会产生大量的tcp连接,在一次使用过程中发现视频无法新建通信,同时服务日志一直刷错误日志,日志内容包含open too many files。通过搜索得知,linux系统一切皆文件的原则,每产生一个tcp连接就相当于新建一个文件,于是进程的连接数超过系统设置的句柄数,导致无法增加新连接,因此也就视频通信业务异常。所以解决这个问题的最直接办法就是增加进程句柄数限
背景:
线上有个服务用作视频通信用,偶尔会产生大量的tcp连接,在一次使用过程中发现视频无法新建通信,同时服务日志一直刷错误日志,日志内容包含open too many files。通过搜索得知,linux系统一切皆文件的原则,每产生一个tcp连接就相当于新建一个文件,于是进程的连接数超过系统设置的句柄数,导致无法增加新连接,因此也就视频通信业务异常。所以解决这个问题的最直接办法就是增加进程句柄数限制,以下就是围绕这个设置过程产生的一些问题记录。
过程:
1.按照惯例,以前一般性得知,设置句柄数:
查看当前单个用户限制数量:
ulimit -Sn: 软限制数量-用户可设置的最大句柄数量,不能超过硬限制大小。
ulimit -Hn: 硬限制数量-系统给与用户可设置的最大句柄数量
查看系统文件总限制数量:
cat /proc/sys/fs/file-max
临时设置:
ulimit -SHn 65535
设置软限制和硬限制为65535。
永久设置:
/etc/security/limits.conf 添加:
* soft nofile 65535
* hard nofile 65535
2.按照上面设置完后,以为这就结束了,但是在重启服务一段时间后,又发现开始报错,查看限制ulimit命令确实是增加了,于是开始更详细的查找问题原因,经过百度一堆的误导,终于找到一些可用的命令:
1.查看系统当前打开文件数:
/proc/sys/fs/file-nr
4192 0 791172
最左边:当前系统打开文件数
中间:不管
右边:系统可打开的文件数
2.查看进程当前打开文件数:
ls -l /proc/$pid/fd/* |wc -l
这个命令是最真实的,lsof -n之类的都不准。
通过上面命令看到实际的打开文件数并没有达到自己通过ulimit所设置的数量,于是就觉得很奇怪,再次查找,通过下面命令找到了进程限制的大小:
cat /proc/$pid/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 4096 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 7259 7259 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
max open files 这条显示才4096,这才发现,原来根本就没有增加成功。 那到底为什么会这样呢,一直在没有目标的搜索,突然想到是不是和systemd有关系,因为业务的服务都是通过systemd守护进程启动的。 然后一阵搜索,终于找到问题了。
centos7里的systemd的limit是不受/etc/security/limits.conf管理的,这个在文件中其实就有描述了
#It does not affect resource limits of the system services.
所以要管理文件systemd启动服务的limit要修改/etc/systemd/system.conf才生效,具体方法如下:
方法一:
/etc/systemd/system.conf 添加
DefaultLimitNOFILE=100000
重启服务器或者
systemctl daemon-reexec
方法二:
修改相关服务的启动文件,添加:
LimitNOFILE=100000
然后
systemctl daemon-reload
systemctl restart xxx
再次查看limits文件,生效了,问题终于解决。
更多推荐
所有评论(0)