System limit for number of file watchers reached, 我想知道当前打开了多少 file watchers

2020-05-26 22:53:16 +08:00
 asanelder

在运行 node 程序时 stderr 报以上错误。

俺知道如何修改内核参数。

但就是想知道系统当前打开了多少的 file watchers. 俺想知道是哪些程序在大量使用 file watchers

google 和百度都没找到答案。

于是求助于此

1355 次点击
所在节点    程序员
14 条回复
ManjusakaL
2020-05-26 23:26:22 +08:00
lsof | grep inotify | wc -l
asanelder
2020-05-26 23:30:05 +08:00
@ManjusakaL 这个俺在 google 查到过,就是不明白原理。

俺系统的 max_user_watchers = 8192,

但使用 lsof | grep inotify | wc -l 的结果是 101,还有 8000 多可以用啊!

为啥就报错了呢?

对这一块不熟悉啊,还望详细指教
ManjusakaL
2020-05-26 23:31:07 +08:00
Google 搜索 get Linux file watcher number 第一个就是
里面还有人提供了脚本直接跑
himself65
2020-05-26 23:32:06 +08:00
看这行代码

https://github.com/nodejs/node/blob/9949a2e1e3100c4ff1f228bac57c1af95cdc3e9d/lib/fs.js#L1458

这个东西貌似没有 expose 出来,你提交个 issue 看看 nodejs member 什么看法
ManjusakaL
2020-05-26 23:38:23 +08:00
我不太清楚你的库是啥,但是我猜是做了严格的限制导致的,按道理说应该是给一个 warning

而 inotify 不支持递归监听,所以递归监听一个 N 级目录需要 N 个描述符,而如果监听 N 级目录中总共 M 个文件需要 N*M 个描述符,所以我猜这是它做严格限制的原因

/proc/sys/fs/inotify/max_user_watches 限制每个 User ID 能够创建的 watcher 数,以免监听过多导致内存爆炸

https://manjusaka.itscoder.com/posts/2019/07/02/something-about-file-system-watch/

具体可以看我这篇文章
ManjusakaL
2020-05-26 23:42:53 +08:00
@ManjusakaL 更正一下,描述符写错了,是 watcher,具体我不太熟悉 Node,估计还得 @himself65 看看
asanelder
2020-05-26 23:44:14 +08:00
@ManjusakaL @himself65 感谢二位回复,俺自己再看看,辛苦辛苦
himself65
2020-05-26 23:45:19 +08:00
仔细考虑了一下,nodejs 支持监听这个好像没有什么意义。毕竟 fs watcher 是系统调用,nodejs 只是 caller
himself65
2020-05-26 23:47:45 +08:00
我才发现 1L 是 manjusaka 大佬!我献丑了
asanelder
2020-05-26 23:50:12 +08:00
@himself65 这个应该是关于系统调用相关的知识,但俺对 inotify 是很不熟悉的,所以想问个有没有人了解。
asanelder
2020-05-26 23:51:28 +08:00
@ManjusakaL 原来是大佬!在下有眼无珠,失敬失敬!
himself65
2020-05-26 23:59:58 +08:00
我提交了一个 issue,能够监听 watchFile 的 API,这样就可以跟踪那些代码调用多次 watch

https://github.com/nodejs/node/issues/33569
asanelder
2020-05-27 00:03:14 +08:00
@himself65 666,铁汁早点休息
asanelder
2020-05-27 00:38:40 +08:00
@ManjusakaL @himself65 说的没错,可以使用
https://github.com/fatso83/dotfiles/blob/master/utils/scripts/inotify-consumers

这个脚本来查看某一进程到底消费了多少 inotify watcher

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675772

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX