背景:

      线上有个服务用作视频通信用,偶尔会产生大量的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文件,生效了,问题终于解决。

Logo

更多推荐