注: 部分概念介绍来源于网络

一、问题阐述:
当你的服务器在大并发达到极限时,就会报出“too many open files”:打开过多文件数。
不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
二、产生的原因:
经常在使用linux的时候出现,大多数情况是由于程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。
三、经典案例:
很多项目上线不久运行了一段时间后,服务突然宕了,经检查日志,出现了too many open files 错误。
四、基本操作:
1、单个进程默认可以打开的句柄数上限,查看进程占最大句柄数
$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
open files                      (-n) 3200
pipe size            (512 bytes, -p) 8
stack size              (kbytes, -s) 2036
cpu time               (seconds, -t) unlimited
max user processes              (-u) 256
virtual memory          (kbytes, -v) unlimited

open files                      (-n) 3200 代表每个进程
或 ulimit -n
查看某个进程的句柄数上限,命令是:
$ ulimit -a PID
临时设置:ulimit -n 1000000。
永久设置:vi /etc/security/limits.conf 添加
*  soft  nofile  65536
*  hard  nofile  65536
修改以后保存,注销当前用户,重新登录,执行ulimit -a ,ok ,参数生效了

2、查看当前系统支持打开的最大句柄数,决定了当前内核可以打开的最大的文件句柄数
more /proc/sys/fs/file-max
临时设置:echo 1000000 > /proc/sys/fs/file-max 
永久设置:修改/etc/sysctl.conf文件,增加fs.file-max = 1000000 

3、查看打开句柄总数
lsof -n|awk '{print $2}'|wc -l

4、查看系统中进程占用的句柄数,根据打开文件句柄的数量降序排列,其中第二列为进程ID:
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

5、根据获取的进程ID查看进程的详情
ps -ef |grep ID

6、查看当前进程的最大可以打开的文件数:cat /proc/PID/limits
Max open files            65536                 65536                 files 

7、查看当前进程的打开文件数量:lsof -p pid | wc -l 
严格说lsof -p pid | wc -l查询的数据不准确,里面含有重复的句柄文件数,已经mem占用也包含了

8、查看系统fd总数:
准确的查看fd使用总数的命令是:
cat /proc/sys/fs/file-nr

错误的查询fd使用总数的命令是:
lsof |wc -l

1.lsof 的结果包含了并非以fd形式打开的文件,比如用mmap方式访问文件(FD一栏显示为mem),实际并不占用fd。 
2.CentOS 7的lsof(我这里lsof -v的版本号是4.87)是按PID/TID/file的组合对应一行,不是一行一个fd。同一个进程如果多个线程访问同一个文件通常只需要打开一次、占用一个fd,但在lsof中就显示多行。如果用lsof -p <pid>,则不按TID显示,结果数少很多。但仍包含了没有使用fd的文件。

9、查询系统中指定进程占用的句柄数
$ lsof -n | grep [PID|进程名]| wc -l

10、LINUX对能够打开的文件句柄的数量做了限制。限制是分为三个层面:系统层面,用户层面和进程层面。
系统层面
$ cat /proc/sys/fs/file-max
用户层面
$ ulimit -n
进程层面
$ cat /proc/PID/limits

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐