Socket accept - 「Too many open files」
什麼是 "too many open files" 錯誤,這是因為 linux 有限制每個用戶、每個系統可以開啟資源的數量,socket 連線和 file 都算是資源的一種
用 centos7 (Systemd) 必須要修改 /etc/systemd/system.conf
和 /etc/systemd/user.conf
(只用在 GUI 介面登入有效),另外非 GUI 介面 ( terminal ) 需要再修改 /etc/security/limit.conf
1. 首先怎麼查詢 open file 目前的上限 (這是以 user 為單位, 如果一個用戶開啟多個 process 都是共用這一個數據)?
ulimit -n
或 ulimit -a
2. 如何修改 open file 的上限值 (This file sets the resource limits for the users logged in via PAM, 系統共用的需要另外找)
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
(背景任務不受影響)
- 打開 /etc/security/limit.conf
- 加入
* hard nofile 65535
* soft nofile 65535
soft limit 是警告的設定,可以被處理程序在使用前自己修改,但不能超過 hard limit2。比如,如果 soft limit 是 80,hard limit 是 100,那麼處理程序可以使用到 90,但介於 80 ~ 100 之間時,系統會有警告資訊通知你。
hard limit 是嚴格的設定,不能被處理程序修改,除非處理程序有 root 權限2。比如,如果 hard limit 是 100,那麼處理程序不能使用超過 100 的資源,即使 soft limit 是 120。
3. 查詢某個 process 使用的資源量
lsof -p {$pid}|wc -l
4. 查詢系統的總上限
- 執行
cat /proc/sys/fs/file-max
來查詢系統上可以開啟的檔案數目的總上限 - 執行 cat /proc/sys/fs/file-nr 來查詢系統上目前已經開啟的檔案數目,以及還有多少可用的檔案描述符(file descriptor)
- 執行 lsof | wc -l 來查詢系統上目前已經開啟的檔案數目,包括普通檔案、目錄、socket、管道等
Reference:
https://superuser.com/questions/1200539/cannot-increase-open-file-limit-past-4096-ubuntu/1200818#1200818
http://unix.stackexchange.com/questions/36841/why-is-number-of-open-files-limited-in-linux
https://onebitbug.me/2014/06/23/setting-limit-in-linux/
http://www.cnblogs.com/derekchen/archive/2012/04/13/2445516.html