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
  1. $ cat /proc/sys/fs/file-max
  2. 99117

伺服器每開一個 Socket 也會消耗掉一個 Kernal open files,當 Kernal open files 全部都在使用中,那麼 Linux 系統就再也無法作任何事情,如果你使用 Java 開發 socket 相關服務,當 Kernal open files 被用完了,你就會收到像下面這種錯誤訊息。

error
  1. Caused by: java.net.SocketException: Too many open files

或是你可以在 Linux 系統 Log 中看到

error
  1. too many open files

我們可以查看 Linux 系統中,有多少 Kernal files 被開啟,使用指令 sysctl fs.file-nr ,像下面這個範例就顯示目前開啟 2304 個 files ,上限是 99117 。

  1. $ sysctl fs.file-nr
  2.  
  3. 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.
  1. $ ulimit -a
  2.  
  3. core file size (blocks, -c) 0
  4. data seg size (kbytes, -d) unlimited
  5. scheduling priority (-e) 0
  6. file size (blocks, -f) unlimited
  7. pending signals (-i) 3898
  8. max locked memory (kbytes, -l) 64
  9. max memory size (kbytes, -m) unlimited
  10. open files (-n) 1024
  11. pipe size (512 bytes, -p) 8
  12. POSIX message queues (bytes, -q) 819200
  13. real-time priority (-r) 0
  14. stack size (kbytes, -s) 8192
  15. cpu time (seconds, -t) unlimited
  16. max user processes (-u) 3898
  17. virtual memory (kbytes, -v) unlimited
  18. file locks (-x) unlimited

ulimit 的設定也可以直接讀這個檔案 /etc/security/limits.conf


回應 (Leave a comment)