lsof的非cpu密集型替代方案?


12

我们运行一个Apache Cassandra集群,其中每个主机在任何给定时间都有数十万打开的文件。

我们希望能够定期获取打开文件的数量并将其输入到石墨中,但是当我们lsofcollectdWindows XP 下运行时,它需要花费几分钟才能完成,并消耗大量CPU。 。

我想知道是否还有另一种更友好的方法来获取lsof提供的相同数据,或者甚至是一种运行lsof的方式而不会明显占用CPU?(尽管我认为后一种方法可能需要比目前完成的时间长得多……不理想)。

也许内核在包含打开文件数量的某个地方维护了一些变量?妄想?

更新:

为了回答其中一个问题,我们已经在使用-band -n标志。这是我在以下命令下运行的完整命令collectd

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

Answers:


12

您可能不需要解析套接字的网络地址,因此至少使用-n开关。然后,您可能还想跳过的阻塞操作-b

这两个第一个开关应该确实可以使它更快。

然后-l避免解决uid。并-L避免计算链接。等等,见男子lsof

另外,在Linux中,您可以制作一个脚本来简单地计算下的链接,/proc/<PID>/fd如下所示:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


我总是得到-找到:/proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5':没有这样的文件或目录-问@Benoît我该如何避免呢?
BG Bruno

2
@BrunoBG:尝试:echo /proc/*/fd/* | wc -w
奥利维尔·杜拉克

Thx @OlivierDulac显然是一个:-)
BG Bruno

很好的建议,但已经使用-n和-b选项了……。我需要更多建议
Michael Martinez

1
如果您有大量的fd,@ OlivierDulac可能无法正常工作。
伯努瓦

5

你这样做是错的。

man proc

   /proc/sys/fs/file-nr

该(只读)文件包含三个数字:已分配文件句柄的数量(即当前打开的文件数量);空闲文件句柄的数量;和最大文件句柄数(即,与/ proc / sys / fs / file-max相同的值)。如果分配的文件句柄数量接近最大值,则应考虑增加最大值。在Linux 2.6之前,内核分配的文件是动态处理的,但是并没有再次释放它们。而是将免费文件句柄保留在列表中以进行重新分配。“免费文件句柄”值指示该列表的大小。大量的免费文件句柄表明打开文件句柄的使用已达到峰值。从Linux 2.6开始,内核会释放释放的文件句柄,并且“

如果第一个值是cat,它将精确显示您所要获得的结果。

为了记录lsof,即使经过一定程度的伪造,我也无法获得与之匹配的输出,但是我收集的是内核说它比您从列表中得到的列表更具权威性的内容lsof


1
这里是我的lsof的输出:[root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065。这是file-nr所说的:[root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428。差异较大(1,000,000+与2784),是由于以下事实造成的lsof:没有与之关联的所有文件描述符:库文件,可执行文件等。因此,如果您仅对文件描述符感兴趣,那么file-nr是要走的路,否则您需要lsof或同等学历。
Michael Martinez

inode-nr然后在同一位置尝试。
马修·伊夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.