首页 > 其他分享 >notify

notify

时间:2022-09-23 10:34:15浏览次数:36  
标签:fs sysctl inotify max watches user notify

 

 

一种说是用户,一种说是进程。不知道用户是不是指的就是进程。

 

 

我目前在linux机器上遇到问题,因为我的root用户已经返回命令,因为已经达到了inotify监视限制。

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 



我用Google搜索了一下我发现的解决方案是使用以下方法提高限额:

sudo sysctl fs.inotify.max_user_watches=<some random high number>



,但是我找不到任何有关提高该值的后果的信息。我猜默认的内核值设置是有原因的,但是对于特定的用法似乎还不够。 (例如,当使用具有大量文件夹的Dropbox或监视大量文件的软件时)

所以这是我的问题:


可以安全地提高该价值,过高的价值会带来什么后果?
有没有办法找出当前设置的手表是什么,以及通过哪些过程设置它们,以便能够确定达到的极限不是由错误的软件引起的?


评论

既然您已经检查了8个月,您可能已经检查过了,但是驱动器是否已满? “尾巴:无法观看'/ var / log / messages':设备上没有剩余空间”

#1 楼

提高价值是否安全?价值过高会带来什么后果?

是的,提高价值很安全,并且以下是可能的成本[来源]:


每个使用的inotify监视占用540字节(32位系统)或1 kB(64位上的双精度)[来源:1、2]
这来自内核内存,这是不可交换的。
假设您将最大值设置为524288,并且全部使用(不可能),那么您将使用大约256MB / 512MB的32位/ 64位内核内存。


请注意,您的应用程序还将使用额外的内存来跟踪inotify句柄,文件/目录路径等-多少取决于其设计。



要检查有声手表的最大数量:

cat /proc/sys/fs/inotify/max_user_watches


设置有声手表的最大数量

/>

以最终的首选值运行sudo sysctl fs.inotify.max_user_watches=



fs.inotify.max_user_watches=524288放入您的 sysctl设置。根据您的系统,它们可能位于以下位置之一:


Debian / RedHat:/etc/sysctl.conf

Arch:将新文件放入/etc/sysctl.d/中,例如/etc/sysctl.d/40-max-user-watches.conf



您可能希望重新加载sysctl设置以避免重启:sysctl -p(Debian / RedHat)或sysctl --system(Arch)

检查查看是否已达到inotify监视的最大数量:

在任何旧文件上使用tail-f(跟随)选项,例如tail -f /var/log/dmesg
-如果一切顺利,它将显示最后10行并暂停;用Ctrl-C放弃
-如果您不在手表范围内,它将因以下神秘错误而失败:
tail: cannot watch '/var/log/dmsg': No space left on device


查看正在用尽的inotify手表

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr


第一列显示inodify fds的数量(虽然不是手表的数量),第二列显示该进程的PID(来源:1、2]。    

 

 

 

 

 

 

 

 

 

 

 

======================

看到too many open files可能想到fs.file-max参数,其实还受下面参数影响:

fs.inotify.max_queued_events:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
fs.inotify.max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限,默认128.
fs.inotify.max_user_watches:表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)
建议修改系统默认参数,方法如下(vi /etc/sysctl.conf):

fs.inotify.max_user_instances=8192
注意: max_queued_events 是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

参考:

https://linuxeye.com/443.html

http://129.226.226.195/post/17722.html

 

标签:fs,sysctl,inotify,max,watches,user,notify
From: https://www.cnblogs.com/rebrobot/p/16721825.html

相关文章