最近在 Nginx Error Log 看到一則錯誤 “Too many open files in system”,造成網站頁面無法載入
2015/06/26 01:00:23 [error] 11064#0: *384012 FastCGI sent in stderr: "PHP message: PHP Warning: require_once(/usr/share/nginx/html/session.php): failed to open stream: Too many open files in system in /usr/share/nginx/html/user.php on line 25
解決方式
在 Linux 中 ulimit 就像是系統的 Qos,可以用來限制系統的各項資源如 CPU、file size、processes、mem …等,在預設就有一項是比較保守的限制,在大量存取的系統會需要調整就是 open files
預設 Linux 最高可打開的檔案數量為 1024 個,必須調整 limit.conf
Step.1 查看目前系統 ulimit 限制
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 23078 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 23078 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
這邊很貼心的幫你加上參數說明,如果你要看 open files 就 -n、pipe size 就 -p 以此類推
Step.2 修改 limit.conf 設定
$ vim /etc/secuity/limit.conf * soft nofile 655360 * hard nofile 655360
- soft 是設定 “軟體” 資源限制
- hard 是設定 “硬體” 資源限制
Step.3 設定生效
設定完之後可以登出後在登入就生效,reboot 測試也可以
如果想要立即生效也可以下命令直接修改當前限制
$ ulimit -Hn 655360 $ ulimit -Sn 655360
如果調高了還是不夠,那就必須從問題源去查起,用 lsof 就可以查看目前檔案開啟的數量,找到根源
$ lsof | wc -l 4000