journalctl -f 报 Insufficient watch descriptors available. Reverting to -n.

what 发表于: 2023-11-13   最后更新时间: 2023-11-14 15:08:41   692 游览

我在 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 内核参数值,

我不确定此应用程序启动时到底创建了多少,但似乎过多了,因为我以前从未见过。

发表于 2023-11-13

"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 的限制。以下是操作步骤:

  1. 临时解决方案:
    你可以通过执行以下命令临时增加限制:

    sudo sysctl fs.inotify.max_user_watches=524288
    sudo sysctl fs.inotify.max_user_instances=8192
    

    这将将最大的 inotify watches 数量设置为 524,288。你可以根据需要调整这个数字。

  2. 永久解决方案:
    如果你希望使更改永久生效,可以将以下行添加到 /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" 问题。

你的答案

查看Linux相关的其他问题或提一个您自己的问题