1.前言
工作中遇到过linux系统某个进程“打开文件数过多”的告警或者报错。这个问题临时解决好办:重启进程、重启节点、ulimit -n num命令 临时扩大限制都可以解决。根本解决当然是检查进程是否存在打开文件描述后未释放,以及linux设置的资源限制是否合理才是关键。
2.排查
- 查看当前进程已经打开的文件描述符数量,以及检查打开的文件是否预期:
①lsof -pPID
|wc -l
或者②ls -l /proc/PID
/fd/ | wc -l
如上排查可知,文件已经删除,但是文件描述为关闭,导致文件描述符泄露了。
辅助命令扩展:
- 查看当前用户最大允许打开的文件数:
[appdeploy@****411]$ulimit -n
526488
[appdeploy@****411]$ulimit -a | grep "open files"
open files (-n) 526488
- 查看当前进程最大允许打开的文件数:cat /proc/
PID
/limits - 查看当前系统最大允许打开的文件数:cat /proc/sys/fs/file-max
- 查看当前系统各个用户创建的进程数:ps h -Led -o user | sort | uniq -c | sort -n
3.调整设置
1)临时设置用户允许打开的最大文件数:
#soft limit,注意:注意soft limit必须小于hard limit
ulimit -n 40960 (同ulimit -Sn 40960)
#hard limit
ulimit -Hn 50000
2)永久设置用户允许打开的最大文件数:
[appdeploy@**** 411]$cat>>/etc/security/limits.conf<<-EOF
#soft是软限制,超过只会告警;hard是硬限制,超过就报错。
>#<domain> <type> <item> <value>
>#appdeploy用户的限制
>appdeploy hard nofile 65535
>appdeploy soft nofile 4096
>#mwopr组的限制
>#@mwopr hard nofile 65535
>#@mwopr soft nofile 4096
>EOF ```
4.扩展:linux资源控制
linux可以实现组、用户、进程级别的各种资源进行控制,如cgroup工具,ulimit命令等,但两者有一定的区别。
- ulimit命令出现较早,主要可以实现如最大允许打开文件、CPU使用时间、CPU调度亲和性等的控制,(清单如下)。单ulimit控制也是比较有限的,比如ulimit就无法实现磁盘允许使用的控制,而cgroup就可以实现。
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31154
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 524288
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) 524288
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
- cgroups(即control groups)是2007年从2.6.24引入linux内核主线,目前默认已启用该特性。 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部分的资源控制。