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)