我们有 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 中使用或进行设置。systemd
man systemd.exec
RLIMIT_NOFILE
setrlimit()
man setrlimit
ulimit -n
limit 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 ls
:ls -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'
为最高。