V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
asanelder
V2EX  ›  程序员

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

  •  
  •   asanelder · May 26, 2020 · 1852 views
    This topic created in 2172 days ago, the information mentioned may be changed or developed.

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

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

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

    google 和百度都没找到答案。

    于是求助于此

    14 replies    2020-05-27 00:38:40 +08:00
    ManjusakaL
        1
    ManjusakaL  
       May 26, 2020 via Android   ❤️ 2
    lsof | grep inotify | wc -l
    asanelder
        2
    asanelder  
    OP
       May 26, 2020
    @ManjusakaL 这个俺在 google 查到过,就是不明白原理。

    俺系统的 max_user_watchers = 8192,

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

    为啥就报错了呢?

    对这一块不熟悉啊,还望详细指教
    ManjusakaL
        3
    ManjusakaL  
       May 26, 2020 via Android
    Google 搜索 get Linux file watcher number 第一个就是
    里面还有人提供了脚本直接跑
    himself65
        4
    himself65  
       May 26, 2020 via iPad
    看这行代码

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

    这个东西貌似没有 expose 出来,你提交个 issue 看看 nodejs member 什么看法
    ManjusakaL
        5
    ManjusakaL  
       May 26, 2020 via Android
    我不太清楚你的库是啥,但是我猜是做了严格的限制导致的,按道理说应该是给一个 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
        6
    ManjusakaL  
       May 26, 2020 via Android
    @ManjusakaL 更正一下,描述符写错了,是 watcher,具体我不太熟悉 Node,估计还得 @himself65 看看
    asanelder
        7
    asanelder  
    OP
       May 26, 2020
    @ManjusakaL @himself65 感谢二位回复,俺自己再看看,辛苦辛苦
    himself65
        8
    himself65  
       May 26, 2020 via iPad
    仔细考虑了一下,nodejs 支持监听这个好像没有什么意义。毕竟 fs watcher 是系统调用,nodejs 只是 caller
    himself65
        9
    himself65  
       May 26, 2020 via iPad
    我才发现 1L 是 manjusaka 大佬!我献丑了
    asanelder
        10
    asanelder  
    OP
       May 26, 2020
    @himself65 这个应该是关于系统调用相关的知识,但俺对 inotify 是很不熟悉的,所以想问个有没有人了解。
    asanelder
        11
    asanelder  
    OP
       May 26, 2020
    @ManjusakaL 原来是大佬!在下有眼无珠,失敬失敬!
    himself65
        12
    himself65  
       May 26, 2020 via iPad
    我提交了一个 issue,能够监听 watchFile 的 API,这样就可以跟踪那些代码调用多次 watch

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

    这个脚本来查看某一进程到底消费了多少 inotify watcher
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3810 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 04:52 · PVG 12:52 · LAX 21:52 · JFK 00:52
    ♥ Do have faith in what you're doing.