searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

超大集群max-open-file问题排查方法

2024-09-25 09:31:58
1
0

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认证登录用户的资源限制,它对systemdservice的资源限制不生效。因此登录用户的限制,通过/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

domainusername|@groupname设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。

type softhard -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次,但是它可能会在10100次之间被重启。这通常是因为系统管理员设置了自动重启机制,以确保 SSH 服务器在意外崩溃或其他故障时能够自动恢复。

 

 

cat /proc/`pidof dockerd`/limits |grep files

 

sshd: root@notty 限制了 max openfile

 

 

网上的大部分文章都只提到了使用 ulimit命令或者修改 limits.conf文件来实现修改 open files配置,但是通过细心查看发现 PAM可能跟这个配置项也有关。PAMPluggable 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 限制问题

 

 

0条评论
作者已关闭评论
Top123
17文章数
3粉丝数
Top123
17 文章 | 3 粉丝
Top123
17文章数
3粉丝数
Top123
17 文章 | 3 粉丝
原创

超大集群max-open-file问题排查方法

2024-09-25 09:31:58
1
0

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认证登录用户的资源限制,它对systemdservice的资源限制不生效。因此登录用户的限制,通过/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

domainusername|@groupname设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。

type softhard -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次,但是它可能会在10100次之间被重启。这通常是因为系统管理员设置了自动重启机制,以确保 SSH 服务器在意外崩溃或其他故障时能够自动恢复。

 

 

cat /proc/`pidof dockerd`/limits |grep files

 

sshd: root@notty 限制了 max openfile

 

 

网上的大部分文章都只提到了使用 ulimit命令或者修改 limits.conf文件来实现修改 open files配置,但是通过细心查看发现 PAM可能跟这个配置项也有关。PAMPluggable 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 限制问题

 

 

文章来自个人专栏
云原生最佳实践
17 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0