moyan/2020-09
使用网上流行的lsof -n|grep pid
命令来查看打开的文件句柄数,得到结果如下:
lsof -n|grep 4847|wc -l
# 执行结果
134574
通过统计freeswitch
进程(进程id:4847
)占用的句柄数,达到134574
。
于是引发一系列联想, 这么高的句柄数,会不会引发什么问题,目前我的xx问题是不是由这么高的句柄数引起的。。。总之,这是一个杯具的开始。
如果真要查看实际的句柄, 使用下面的命令来查找:
lsof -p 4847|wc -l
下面是具体的返回结果:
lsof -p 4847|wc -l
# 执行结果
1086
可以看出,真实使用的句柄总数也才1086
,虚惊一场.
而为什么lsof -n|grep 4847
返回的句柄数超高,直接贴一段引用:
lsof
的结果包含了并非以fd
形式打开的文件,比如用mmap
方式访问文件(FD一栏显示为mem
),实际并不占用fd。其中包括了像.so
这样的文件。从结果看.jar
文件也是以FD为mem
和具体fd
编号分别打开了一次。- CentOS 7的
lsof
(我这里lsof -v
的版本号是4.87
)是按PID/TID/file的组合对应一行,不是一行一个fd
。同一个进程如果多个线程访问同一个文件通常只需要打开一次、占用一个fd
,但在lsof
中就显示多行。如果用lsof -p <pid>
,则不按TID显示,结果数少很多。但仍包含了没有使用fd
的文件。
使用lsof -n|grep xxx
查看文件句柄数就是一个巨坑,慎重!
下面是作者
推荐的查看占用fd
最多进程的方法:
find /proc -print | grep -P '/proc/\d+/fd/'| awk -F '/' '{print $3}' | uniq -c | sort -rn | head