Skip to content

[Bug] [desktop]: File watcher exhausts system-wide inotify quota (~65k watches incl. node_modules and ~/.cargo), breaks other apps with ENOSPC #476

Closed

Description

@renguangqian1993

环境

  • MiniMax Code Desktop(Electron),Linux x64,max_user_watches=65536(Ubuntu 默认)
  • Desktop 版本进程:minimax-code --type=utility --utility-sub-type=node.mojom.NodeService(node utility 子进程)

现象

启动 MiniMax Code Desktop 一段时间后(本例 uptime 1 天 7 小时),系统 inotify 配额被吃满,其他应用全部无法启动文件监视:Obsidian / VS Code 启动即报 ENOSPC: system limit for number of file watchers reached。

实测证据(/proc 层面)

罪魁是单一的 node utility 进程,单个 inotify fd 堆了 64,981 个 watch:

# 各进程 watch 数排序(top2)
64984  pid=416910  minimax-code --type=utility --utility-sub-type=node.mojom.NodeService
    53  pid=753568  zcode-host-local-1

# 该进程只有 2 个 inotify fd:
fd=36: 3      watches
fd=46: 64981  watches   ← 全部堆积在这一个实例上

# 全系统合计:65465 / 65536

watch 目标抽样反查(fdinfo 的 ino → find -inum)命中:

  • ~/.cargo/registry/src/index.crates.io-*/...——Rust 工具链全局缓存,与任何打开的工作区无关(当前工作区是 ~/workspace/algo_study_java,纯 Java 项目)
  • ~/workspace/open_source/agency-agents-app/node_modules/svelte/types——node_modules 未被排除
  • 抽样中还出现单个普通文件(如 regex-automata-0.4.14/src/util/escape.rs)——即文件级 watch,而非只 watch 目录

本机规模参考:~/ 共 178,965 个目录,其中 150 个 node_modules/.git 内部含 28,663 个子目录——均在可监视范围内。

复现 / 诊断命令

# 按进程统计 inotify watch 数
for p in /proc/[0-9]*; do
  n=$(awk '/^inotify wd/{c++} END{print c+0}' $p/fdinfo/* 2>/dev/null)
  case "$n" in (''|*[!0-9]*) continue;; esac
  [ "$n" -gt 100 ] && printf "%7d pid=%s %s\n" "$n" "${p#/proc/}" "$(tr '\0' ' ' < $p/cmdline | cut -c1-100)"
done | sort -rn

# 抽样反查 watch 目标(把十六进制 ino 转十进制后)
find ~ -xdev \( -inum <ino1> -o -inum <ino2> ... \)

期望行为(修复建议)

对照 VS Code 等桌面应用的常规做法:

  1. 默认排除 node_modules、.git、dist、build、coverage、.cargo/包管理器全局缓存等重目录(参考 files.watcherExclude 的默认值)
  2. 限定监视范围为实际打开的工作区/项目根,而不是 home 下的递归集合
  3. 只 watch 目录(目录事件已覆盖内容变化),避免文件级 watch 导致 watch 数膨胀一个数量级
  4. 加 watch 数上限保护与降级策略:接近 max_user_watches 时明确报错提示用户(或回退轮询),而不是静默吃满全系统共享的 per-user 配额、拖垮其他应用

其中第 4 点的外部性最严重:inotify 配额是系统级共享资源,一个应用耗尽它会导致无关应用(Obsidian、VS Code 等)启动失败。

补充

无法从 /proc 外部区分 64,981 是「启动时一次性扫描到位」还是「随时间泄漏累积」(1d7h 攒到该值)。若需要区分:重启 desktop 后立即观察 watch 数即可(起步即数万 = 扫描失控;从数百缓慢增长 = 另有泄漏)。欢迎维护者指路 desktop 侧 watcher 实现(chokidar / 自研 fs.watch)以便进一步定位。

系统:Ubuntu Linux 7.0.0-38-generic x64,GNOME 桌面,同机运行 Obsidian / VS Code / Edge 均受影响。

Activity

  1. renguangqian1993 commented on Oct 10, 2026

    @renguangqian1993
    Author

    ai说是minimax的问题,看不懂啊,close了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions