同步服务跑了半天后日志开始刷 inotify_add_watch: No space left on device,新加的子目录一个都监听不到。watch 数和实例数都已经到顶。日志里能对上时间点,这种反而好排。

每个被监听的目录占一个 watch,每个 inotify 实例还占一个文件描述符,两者都有内核上限。目录树大、或者每次事件后重新 add_watch 而不复用,数字会一直涨。这一点先确认清楚,后面就不用反复试。

sysctl fs.inotify.max_user_watches fs.inotify.max_user_instances
cat /proc/sys/fs/inotify/max_user_watches
sysctl -w fs.inotify.max_user_watches=524288

围绕「inotify 监听数上限」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

处理上按这个顺序:查当前上限和已用量 fs.inotify.max_user_watches 与 max_user_instances;按目录规模调大 sysctl 并写进 /etc/sysctl.d;代码里复用同一个 inotify 实例 别每次新建;监听根目录用递归模式 减少重复 add_watch。

结果对不对很好判断,重启服务后 inotify_add_watch 不再报错 新建子目录能立刻收到 create 事件。

作者 9823189