Files
StudyDiary/10-WebClipper/fs.inotify.max_user_watches默认值太小,导致too many open files_user watch files-CSDN博客.md
T
2026-07-23 20:36:13 +08:00

105 lines
5.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
看到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太小需要调整参数后再次使用。
**关于重启inotify配置max\_user\_watches无效被恢复默认值8192的正确修改方法**
一般网上修改方法就是直接修改文件:
/proc/sys/fs/inotify/max\_user\_watches
或者修改方法:
sysctl -w fs.inotify.max\_user\_watches="99999999"
但是这些修改后,Linux系统重启inotify配置max\_user\_watches无效被恢复默认值8192,这个可能很多的新手不是很明白,这个不详细讲解,有空大家去了解下:sysctl
Linux系统重启inotify配置max\_user\_watches无效被恢复默认值8192的正确修改方法为:
vim /etc/sysctl.conf 
注意添加的内容:
fs.inotify.max\_user\_watches=99999999(你想设置的值)
haole ,好了,很简单。。
**在Linux中打开了太多文件(Too many open files)的解决方法**
回答一、
\[root@lxadmin nginx\]# cat /proc/sys/fs/file-max
8192
文件系统最大可打开文件数
\[root@lxadmin nginx\]# ulimit -n
1024
程序限制只能打开1024个文件
使用\[root@lxadmin nginx\]# ulimit -n 8192调整一下
或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)
ulimit -n 8192
回答二、
Linux内核有时会报告“Too many open files”,起因是file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/\*下的init脚本。)
\# echo "65536"  > /proc/sys/fs/file-max  # 适用于2.2和2.4版内核
\# echo "131072" > /proc/sys/fs/inode-max # 仅适用于2.2版内核
回答三、
办法是修改操作系统的打开文件数量限制,方法如下:
1\. 按照最大打开文件数量的需求设置系统, 并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。 
\# cat /proc/sys/fs/file-max
如果设置值太小, 修改文件/etc/sysctl.conf的变量到合适的值。 这样会在每次重启之后生效。 如果设置值够大,跳过下步。 
\# echo 2048 > /proc/sys/fs/file-max
编辑文件/etc/sysctl.conf,插入下行。 
fs.file-max = 8192
2\. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示: 
# 
添加如下这行。 
\* - nofile 8192
这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定, 则hard和soft设定会同时被设定。 
硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。 
当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。
另外一种情况是在创建索引的时候,也有两种可能,一种是 合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另外一种是合并因子受虚拟机内存的限制,无法调整到更大,而 需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。
在此基础上,我还修改了以下一个配置文件
vi /etc/sysctl.conf 
添加:
\# Decrease the time default value for tcp\_fin\_timeout connection
net.ipv4.tcp\_fin\_timeout = 30
\# Decrease the time default value for tcp\_keepalive\_time connection
net.ipv4.tcp\_keepalive\_time = 1800
\# Turn off tcp\_window\_scaling
net.ipv4.tcp\_window\_scaling = 0
\# Turn off the tcp\_sack
net.ipv4.tcp\_sack = 0
#Turn off tcp\_timestam[ps](http://www.111cn.net/fw/photo.html)
net.ipv4.tcp\_timestamps = 0
然后 service network restart,这些都和TCP sockets有关的优化。
另外需要在 /etc/rc.d/rc.local里添加已使得重启的时候生效。
echo "30">/proc/sys/net/ipv4/tcp\_fin\_timeout
echo "1800">/proc/sys/net/ipv4/tcp\_keepalive\_time
echo "0">/proc/sys/net/ipv4/tcp\_window\_scaling
echo "0">/proc/sys/net/ipv4/tcp\_sack
echo "0">/proc/sys/net/ipv4/tcp\_timestamps
因为不是所有的程序都在root下跑的,所有linux有对hard 与soft open files 的区分,普通用户受hard的限制,无论ulimit -n $数值调到多高,都跑不到 /etc/security/limits.conf里nofile的值.
这样的优化后 lsof -p $java\_pid|wc -l可以跑到4千以上都不会抛出too many open files。