Too many open files 问题排查和解决

众所周知 linux 对单个进程能打开的文件数是有限制的, 默认是 1024, 最大 65536. 用命令 ulimit -a 查看.
$ 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) 13039
max locked memory       (kbytes, -l) 65536
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) 13039
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

最近公司的项目升级了之后发现有 Too many open files 的报错, 当然最直接的想法是用 ulimit -n 命令修改文件数的限制, 但不是最好的解决办法. 联想到这个问题的结果, 肯定是由于程序错误没有关闭文件造成的. 所以关键在于找出进程打开了哪些文件没有关闭.

linux 下 /proc/进程 id/fd 目录下保存了进程打开的全部文件描述符, 用命令 ls -l 查看
………………..
lrwx------ 1 pi pi 64 Jul 13 02:32 31 -> '/tmp/scanner_5yiqii_p.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 32 -> '/tmp/scanner_udg3tvt9.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 33 -> '/tmp/scanner_q9uwakwz.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 34 -> '/tmp/scanner_trbq2tkq.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 35 -> '/tmp/scanner_9u7py9ut.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 36 -> '/tmp/scanner_wsk7psch.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:33 38 -> '/tmp/scanner_qfj3mks8.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:35 39 -> '/tmp/scanner_qfcmw7dl.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:32 4 -> 'socket:[346177]'
lrwx------ 1 pi pi 64 Jul 13 02:33 40 -> '/tmp/scanner_h9cwfmk_.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:33 41 -> '/tmp/scanner_0zs_srey.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:33 42 -> '/tmp/scanner_ylzdhjjk.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:35 44 -> '/tmp/scanner_vamc7pny.jpg (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:35 45 -> '/tmp/scanner_3_0axj4k.html (deleted)'
lrwx------ 1 pi pi 64 Jul 13 02:35 46 -> '/tmp/scanner_5stdjor3.jpg (deleted)'

由此看出大量的 /tmp/scanner_* 是没有关闭的文件, 造成了进程打开文件数超出限制了.

马上就猜到问题出在哪儿了. 修改代码重新测试, 问题解决.
 
 
关注我的公众号, 分享好的经验
 

你可能感兴趣的:(linux)