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 -nulimit -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.

(背景任務不受影響)

  1. 打開 /etc/security/limit.conf
  2. 加入
* 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