一、查看进程打开文件数量
查看当前shell进程打开文件数量(open files行,也可以只查询nofile:ulimit -n):
# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 13583
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) 13583
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
查看某个进程1124打开文件数量(Max open files行):
# cat /proc/1124/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 13583 13583 processes
Max open files 1024 524288 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 13583 13583 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
二、修改进程打开文件数量
已运行的进程无法直接修改打开文件数量,需要修改shell下进程打开文件数量后重新启动原来的程序才行,
首先我们用ulimit修改当前bash进程的打开文件数量为5,然后测试一下在这个bash进程下启动的子进程打开文件数量是不是会出现问题:
# ulimit -n 5
# tail -n 1 -f /var/log/*.log
==> /var/log/boot.log <==
==> /var/log/dnf.librepo.log <==
2023-07-21T10:10:37Z INFO Downloading: http://mirrors.bclinux.org/bclinux/oe21.10/extras/x86_64/repodata/repomd.xml
tail: cannot open '/var/log/dnf.log' for reading: Too many open files
tail: cannot open '/var/log/dnf.rpm.log' for reading: Too many open files
可以看到在成功打开两个文件后tail再打开的文件就会报错(Too many open files),因为进程默认都会打开标准输入、输出和错误三个文件。
因此我们通过ulimit修改bash进程的打开文件数量后,在这个bash进程启动的子进程也会修改,但是这个是临时的,重新登录或者换一个shell就失效了。
如何永久修改这个进程打开文件数量呢?我们需要修改/etc/security/limits.conf这个配置文件,例如将进程打开文件数量设置为65535:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
* soft nofile 65535
* hard nofile 65535
重启系统后会发现shell进程默认的进程打开文件数量已经被修改为65535:
# ulimit -n
65535
三、修改systemd启动服务进程打开文件数量
我们修改了/etc/security/limits.conf之后以为万事大吉了,但是当你的程序是用systemd来管理的时候你会发现事与愿违。原因是systemd有自己的进程打开文件数量配置,当你的程序是用systemd来管理的时候需要修改/etc/systemd/system.conf,例如我们将nofile修改为2048(如果soft和hard值不一样可以用冒号分隔,2048:65535):
DefaultLimitNOFILE=2048