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> 很好用
//blog.hsojo.com/post/jie-jue-ssh-session-zhong-open-files-xian-zhi-wen-ti/
分析升級 OpenSSH后 Linux open files配置不生效問題
解決 SSH Session 中 open files 限制問題