2017
Jun
06
Everything is a file 這是 Linux 系統設計的基本原則,任何一個 sockets/hardware devices/process/pipes 都是一個檔案,而且這些操作 kernal 的系統擋案是有上限的,你可以用 "cat /proc/sys/fs/file-max" 來查看系統 kernal open files 上限。
file-max
- $ cat /proc/sys/fs/file-max
- 99117
伺服器每開一個 Socket 也會消耗掉一個 Kernal open files,當 Kernal open files 全部都在使用中,那麼 Linux 系統就再也無法作任何事情,如果你使用 Java 開發 socket 相關服務,當 Kernal open files 被用完了,你就會收到像下面這種錯誤訊息。
error
- Caused by: java.net.SocketException: Too many open files
或是你可以在 Linux 系統 Log 中看到
error
- too many open files
我們可以查看 Linux 系統中,有多少 Kernal files 被開啟,使用指令 sysctl fs.file-nr ,像下面這個範例就顯示目前開啟 2304 個 files ,上限是 99117 。
- $ sysctl fs.file-nr
- fs.file-nr = 2304 0 99117
修改 max open files
打開 /etc/sysctl.conf 這個檔案,加入 fs.file-max = xx , 再執行 "sysctl -p
" 這可以調高系統 open files 上限。
ulimit
ulimit 是另一個檢查 linux 設定的指令,這個指令可以印出每個 user 使用的上限值。
- core file size: memory for core dump,如果這個值是 0 ,那代表你不能使用 corp dump.
- $ 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) 3898
- 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) 8192
- cpu time (seconds, -t) unlimited
- max user processes (-u) 3898
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
ulimit 的設定也可以直接讀這個檔案 /etc/security/limits.conf