max-open-file问题排查
问题现象
[ERROR] HCCP(10460,all_reduce_test):2024-08-02-13:38:15.724.370 [rs_socket.c:570]tid:10497,rs_epoll_event_listen_in_handle(570) : IP:10.241.16.13 accept() failed ! errno:24
[ERROR] HCCP(10460,all_reduce_test):2024-08-02-13:38:15.724.404 [rs_socket.c:570]tid:10497,rs_epoll_event_listen_in_handle(570) : IP:10.241.16.13 accept() failed ! errno:24
问题现象1: 同时运行128台服务器,抛出如上错误,通过二分法查出,当同时运行小于124节点,正常运行;当大于等于124个节点,就抛出这一个错误,看起来和节点数有关系。
问题现象2:迷惑点在于, 有的进程limit是很大(1048576), 有的进程limit进程很小,被限制住了是1024 ,是服务器配置不一样导致的吗?
全局没有限制
进程级有限制
每个进程又启动6个子进程 , 那么一共有6X8=48个子进程
通过pstree 查看进程树,之后一层层的看每个进程的limits 限制
[root@ccseagent-8fff4b8c1c /]# cat /proc/6300/limits | grep "Max open files"
Max open files 1024 524288 files
[root@ccseagent-8fff4b8c1c /]#
[root@ccseagent-8fff4b8c1c /]# cat /proc/xxx/limits | grep "Max open files"
Max open files 1024 524288 files
[root@ccseagent-8fff4b8c1c /]#
验证方法1
[root@ccseagent-8fff4b8c1c /]# cat /proc/sys/fs/nr_open
1073741816
[root@ccseagent-8fff4b8c1c /]#
解决动态修改/proc/{pid}/limits
动态修改方式1
echo - n "Max open files=65535:65535" > /proc/6300/limits
动态修改方式2
prlimit --nofile=65536:65536 --pid 6300
当动态修改之后,发现立马就不再报错了,可以正常出结果了,说明确实是因为max-open-file导致的。
但是是谁限制住了max-open-file ,并且限制住在1024还不知道。
验证方法2
本人日常开发流程中常使用 PyCharm 中的 Remote Interpreter,其通过 SSH 连接到基于 systemD 的容器环境,长时间运行项目后会出现 OSError: [Errno 24] Too many open files。虽然这个问题一定程度上可能与业务代码有关,但默认限制允许单进程打开的文件数量(1024)属实也太低了,多线程场景下会超出限制也是常有的事情。
看了这个博客才知道,和我们的现象是一致的。
原来:
# cat /etc/pam.d/sshd | grep pam_limits.so
session required pam_limits.so
修改后:(注释掉了)
sed -i '/pam_limits.so/s/^/#/' /etc/pam.d/sshd
# cat /etc/pam.d/sshd | grep pam_limits.so
#session required pam_limits.so
看来很多,越来越多的信息指向了PAM模块。和PAM有千丝万缕的联系。
排查过程
[root@ccseagent-8fff4b8c1c /]# ulimit -a
[root@ccseagent-8fff4b8c1c /]# ulimit -c
unlimited
[root@ccseagent-8fff4b8c1c /]#
[root@ccseagent-8fff4b8c1c /]# cat /proc/sys/fs/file-max
10485760
[root@ccseagent-8fff4b8c1c /]#
[root@ccseagent-8fff4b8c1c /]# cat /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
* soft nproc 65535
* hard nproc 65535
[root@ccseagent-8fff4b8c1c /]#
在Centos7 & ubuntu 系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。
/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。
对于systemd service的资源设置,则需修改全局配置:
l /etc/systemd/system.conf
l /etc/systemd/user.conf
同时也会加载两个对应目录中的所有.conf文件/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf。
其中system.conf是系统实例使用的,user.conf是用户实例使用的。
例如:解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 20000 #软连接
* hard noproc 20000 #硬连接
* soft nofile 4096
* hard nofile 4096
说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
需要注意一点:/etc/security/limits.d下也有noproc最大进参数的限制:
即 /etc/security/limits.d/ 下的文件覆盖了/etc/security/limits.conf设置的值
针对用户
针对用户永久生效:
那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,方法是通过修改系统的 /etc/security/limits.conf配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述。
limits.conf的格式如下:
<domain> <type> <item> <value>
username|@groupname type resource limit
domain:username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的最大值不能超过hard的值。用 – 就表明同时设置了 soft 和 hard 的值。
cat /etc/systemd/system/sshd.service
/usr/sbin/sshd -D -R 是什么意思
"/usr/sbin/sshd -D -R" 是一个启动 SSH 服务器的命令。其中:
"/usr/sbin/sshd" 表示使用该路径下的 sshd 程序来启动 SSH 服务器;
"-D" 表示在启动后不要以守护进程方式运行(即不要后台运行),而是在当前终端窗口中显示运行日志和错误信息;
"-R" 表示在启动时开启远程端口转发功能,即允许通过 SSH 通道传输网络数据。
sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
这是一条系统日志,表示 SSH 服务器正在以后台模式(-D)启动,并且监听了一个或多个端口(listener)。后面的“0 of 10-100 startups”表示该服务已经启动了0次,但是它可能会在10到100次之间被重启。这通常是因为系统管理员设置了自动重启机制,以确保 SSH 服务器在意外崩溃或其他故障时能够自动恢复。
cat /proc/`pidof dockerd`/limits |grep files
sshd: root@notty 限制了 max openfile
网上的大部分文章都只提到了使用 ulimit命令或者修改 limits.conf文件来实现修改 open files配置,但是通过细心查看发现 PAM可能跟这个配置项也有关。PAM,Pluggable Authentication Modules,可插拔认证模块。简而言之,一种高层次的统一安全认证机制。再查阅资料后发现,openssh也是支持 PAM的。
必备工具
pstree -sp 1385226 | wc -l
48
apt-get install psmisc
yum install psmisc -y
pstree -sp <pid> 很好用
https://blog.hsojo.com/post/jie-jue-ssh-session-zhong-open-files-xian-zhi-wen-ti/
分析升级 OpenSSH后 Linux open files配置不生效问题
解决 SSH Session 中 open files 限制问题