如何查找每个进程打开的文件数

如何查找每个进程打开的文件数

我们有 kafka 服务(作为systemctl服务)

我们在该服务中配置了打开文件的数量

例子:

[Service]
LimitMEMLOCK=infinity
LimitNOFILE=1500000
Type=forking
User=root
Group=kafka

现在当服务启动时,我们想要了解kafka服务消耗的文件数量

从谷歌搜索,我了解到 -https://www.cyberciti.biz/faq/howto-linux-get-list-of-open-files/

我们可以使用该命令fstat来捕获打开文件的数量

作为

fstat -p {PID}

由于我们使用的是生产 RHEL 7.6 安全服务器,因此不清楚是否fstat可以安装在我们的服务器上

因此我们想了解其他想法?

感谢采取其他方法

建议的其他方法是 -ls "/proc/$pid/fd"

但这是我机器上的真实例子

ls /proc/176909/fd  |more
0
1
10
100
1000
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
1001
10010
10011
10012
.
.
.

所以我们得到了一长串数字,那么如何找到打开文件的数量呢?

答案1

正如评论中提到的,您可以使用wc命令:

ls  "/proc/$pid/fd"|wc -l

-l计算行数(ls命令的结果)

答案2

(请参阅)LimitNOFILE中的指令对应于(请参阅)设置的资源限制。可以在某些 shell 中使用或进行设置。systemdman systemd.execRLIMIT_NOFILEsetrlimit()man setrlimitulimit -nlimit descriptors

这指定一个比该进程可以打开的最大文件描述符数大一的值。尝试(open(2)、pipe(2)、dup(2) 等)超过此限制会产生错误 EMFILE。 (历史上,这个限制在 BSD 上被命名为 RLIMIT_OFILE。)

因此,严格来说,这并不是打开文件描述符(更不用说打开文件)数量的限制,因为具有该限制的进程如果在设置该限制(或在创建时继承时继承)的 fd 高于该限制,则可以拥有更多打开的文件(clone()/ fork())),即使打开的 fd 很少,也无法获得超出限制的 fd。

在 Linux 上,/proc/<pid>/fd它是一个特殊的目录,其中包含进程打开的每个 fd 的一个神奇符号链接文件。

您可以通过计数来获得它们的数量:

() {print $#} /proc/$pid/fd/*(NoN)

例如zsh(或ls "/proc/$pid/fd" | wc -l如罗密欧已经展示的那样)。

将它们按数字倒序排序即可得到最高的pid值,并得到第一个。

() {print $1} /proc/$pid/fd/*(NnOn:t)

或者使用 GNU lsls -rv "/proc/$pid/fd" | head -n1

要获取所有进程的打开 fd 数量的报告,您可以执行以下操作:

(for p (/proc/<->) () {print -r $# $p:t $(<$p/comm) $p/exe(:P)} $p/fd/*(NoN)) | sort -n

更方便的是,您可以求助于lsof

lsof -ad0-2147483647 -Ff -p "$pid" | grep -c '^f'

对于打开的文件描述符的数量和:

lsof -ad0-2147483647 -Ff -p "$pid" | sed -n '$s/^f//p'

为最高。

相关内容