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