同步服务跑了半天后日志开始刷 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 事件。
