sword

accept4: too many open files报错linux问题排除
说明最近共享的frp服务器(freenat.bid和freenat.club)老是运行一段时间就cpu满载100了...
扫描右侧二维码阅读全文
23
2019/02

accept4: too many open files报错linux问题排除

说明

最近共享的frp服务器(freenat.bid和freenat.club)老是运行一段时间就cpu满载100了,使用中各种问题,面板无响应。甚至被vps服务商判定为滥用停止了机器。就把排查问题的过程记录一下吧。

1、查看系统目前资源限制的设定

ulimit -a

请输入图片描述
可以看到默认是1024,数值有点小,这时候我们可以用ulimit -n 655360命令来修改限制值,不过这样修改退出ssh远程连接以后就会失效!!!,并不是长久之计。

2、查看frps进程的open file限制
2.1、首先用top命令查看frps的进程id
请输入图片描述
可以看到frps的进程id为11919

2.2、获取frps的文件数限制(进程id为11919)

cat /proc/11919/limits

请输入图片描述

可以看到软件限制为1024,硬件限制为4096

3、永久修改文件打开数限制
3.1、修改/etc/security/limits.conf,在文件底部添加:

* soft nofile 655360
* hard nofile 655360

或者

* - nofile 65536

星号代表全局, soft为软件,hard为硬件,nofile为这里指可打开文件数。如果想代表某个用户的话,则 user soft/hard nofile 655360

3.2、要使limits.conf文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
查看/etc/pam.d/login文件中,在底部添加

session required /lib/security/pam_limits.so

这样,问题就迎刃而解了!

3.3、检查是否修改成功
(退出shell登陆,重新登陆一次即系统生效)

运行ulimit -a检查发现已经是655360了,但是程序限制显示还没改,其实是已经生效了,后台看到cpu占用已经不是100了

请输入图片描述

请输入图片描述

为了保险起见,重启一下frps或系统后,重新检查,好了!!!
请输入图片描述

4、修改方法2
(系统优化,设置最大进程数和最大文件打开数)

4.1、修改/etc/security/limits.conf文件, 在文件末尾添加

* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360

*代表针对所有用户,noproc是代表最大进程数,nofile是代表最大文件打开数。如上修改后重启服务或服务器,如果发现没更改过来, 还需要修改下面文件。

4.2、在/etc/security/limits.d/20-nproc.conf文件末尾添加(centos7系统中默认进程限制为4096,系统启动加载时会被limits.conf覆盖)

* soft nproc 655360
* hard nproc 655360

4.3、在/etc/security/limits.d/def.conf文件末尾添加

* soft nofile 655360
* hard nofile 655360

然后重启后生效!

5、实际测试以上对于centos5/6是有效的,centos7貌似还是有问题
我这里用的宝塔的计划任务,写的进程守护来启动的frps,启动后发现系统的打开文件数限制已经是655360了,但是frps进程的还是默认的1024,查了一下:

在CentOS 7/RHEL 7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf文件的配置作用域缩小了一些。limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,与上面讲的一样,通过/etc/security/limits.conflimits.d来配置即可。

对于systemd service的资源限制,如何配置呢?

全局的配置,放在文件/etc/systemd/system.conf/etc/systemd/user.conf

同时,也会加载两个对应的目录中的所有.conf文件(有时可能没有这个目录,不过没关系,忽略就好)/etc/systemd/system.conf.d/.conf/etc/systemd/user.conf.d/.conf

其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

打开system.conf文件,把DefaultLimitNOFILE的注释去掉,并写上值

DefaultLimitNOFILE=655360

然后保存,重启系统就OK了。

Last modification:March 11th, 2019 at 05:14 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment