我在 Ubuntu Touch 20.04 时,我发现 journalctl -f
无法正常工作,而是打印出 "Insufficient watch descriptors available(可用的监视描述符不足)"。恢复到-n
.后,在程序运行期间没有跟踪日志;
错误描述如下:
# journalctl -f
Insufficient watch descriptors available. Reverting to -n.
Nov 14 15:03:22 node03 systemd[1]: session-13.scope: Deactivated successfully.
Nov 14 15:03:22 node03 systemd-logind[1554]: Session 13 logged out. Waiting for processes to exit.
Nov 14 15:03:22 node03 systemd-logind[1554]: Removed session 13.
https://www.reddit.com/r/Fedora/comments/kgb6sh/comment/ggecv04/ 我看到 fs.inotify.max_user_watches = 8192
内核参数值,
我不确定此应用程序启动时到底创建了多少,但似乎过多了,因为我以前从未见过。
"Insufficient watch descriptors available. Reverting to -n." 的错误表示
journalctl
命令无法有效使用 inotify watch 描述符。Inotify 是 Linux 内核的一个子系统,它帮助应用程序监视文件系统的更改。sudo find /proc/*/fd -lname anon_inode:inotify | cut -d/ -f3 | xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' | uniq -c | sort -nr
5 875708 root java 5 681845 root java 5 63880 root java 5 61450 root java 5 61448 root java 5 40553 root java 5 3951445 root java 5 3938788 root java 5 3626989 root java 5 3582307 root java 5 34833 root java 5 34818 root java 5 3362735 root java 5 254863 root java 5 250666 root java 5 244775 root java 5 234905 root java 5 224418 root java 5 1 root systemd 5 185994 root java 5 1827734 root java 5 1326212 root java 4 63878 root java 2 2722168 root cadvisor 2 1791 root polkitd 1 9828 root agetty 1 906 root systemd-udevd 1 3010109 wgf systemd 1 182943 root java 1 1794 dnsmasq dnsmasq 1 1737 message+ dbus-daemon 1 1720 root acpid 1 1718 root accounts-daemon 1 1564 systemd+ systemd-timesyn ...
可以看到,应用程序确实会导致所有可用的Watch描述符被使用;而默认的
cat /proc/sys/fs/inotify/max_user_watches
上的 fwiw 是8192
。所以错误可能是因为系统已经达到了同时使用的 inotify watch 描述符的限制。这个限制是由内核设置的,可能默认限制对于你的系统来说太低了。
要解决这个问题,可以尝试增加 inotify watch 的限制。以下是操作步骤:
临时解决方案:
你可以通过执行以下命令临时增加限制:
sudo sysctl fs.inotify.max_user_watches=524288 sudo sysctl fs.inotify.max_user_instances=8192
这将将最大的 inotify watches 数量设置为 524,288。你可以根据需要调整这个数字。
永久解决方案:
如果你希望使更改永久生效,可以将以下行添加到
/etc/sysctl.conf
或/etc/sysctl.d/
目录中的文件(例如/etc/sysctl.d/99-my-custom.conf
):fs.inotify.max_user_watches = 524288 fs.inotify.max_user_instances = 8192
在做出这些更改后,你可以运行以下命令应用新的设置:
sudo sysctl -p
这应该解决
journalctl
的 "Insufficient watch descriptors available" 问题。你的答案