[原创] 项目 watch EMFILE 报错处理过程
事件
公司XX游戏 S114服启动失败(使用 pomelo - node.js 框架的项目), 提示 : Caught exception: Error: watch EMFILE
处理过程
- 怀疑是 "单进程可打开的最大文件句柄数" 受限 - # 查看单个任务最多可同时打开的文件数
 ulimit -n # 65535
 - 查看各进程打开的文件句柄数 - lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr
 - 输出结果: - 228 18942 # mysqld
 125 1450
 89 29749 # 以下皆是游戏进程
 77 23603
 73 29183
 71 6912
 71 31880
 71 28674
 71 28059
 71 27888
 70 6899
 70 3212
 70 31866
 70 3083
 70 29741
 ...
 - 当前服务器已经启动多个项目实例, 唯独在启动当前这个新的实例时才报错。上面的输出结果显示, 游戏的每个进程打开的文件句柄数也才 80 左右,不可能达到上限。 
- inotify 限制? - 查看当前inotify限制: - [root@vm10-140-85-116 ~]# sysctl -a | grep fs.inotify
 fs.inotify.max_user_instances = 128
 fs.inotify.max_user_watches = 8192
 fs.inotify.max_queued_events = 16384
 - 百度了一下,项目使用 pomelo,”reloadHandlers会监听handler文件的修改,导致了这个fs.watch这个问题“ - inotify 是linux的文件系统时间监控机制。 - 在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制 - max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
- max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
- max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
 - 尝试临时修改该参数配置: - echo 256 > /proc/sys/fs/inotify/max_user_instances
 - 再次启动游戏服务端, OJBK 了, 确认没问题, 将上述修改的参数持久化(不然重启一下服务器又得重设) - echo "fs.inotify.max_user_instance=256" >> /etc/sysctl.conf
 
总结
这个问题在于, 开启过多的 pomelo 实例,导致用户(pomelo进程所属)运行的 inotify 命令数超过默认的阀值,而非单个pomelo进程打开的文件句柄数超过限制。
参考资料
小知识点
单进程文件句柄限制
Linux 是有文件句柄限制的, 默认不高, 一般是 1024。作为生产环境的话很容易超出这个数值,因此大多数时候都需要调高该限制数。
文件句柄数限制是针对:
- 针对单个进程的限制
- 修改该值时不影响当前运行中的程序
查看当前句柄数限制: ulimit -n
- 临时修改句柄数限制 (仅当前Session有效): - ulimit -n 65535- 此处设置文件句柄数限制为 65535 
- 写入配置文件 (永久生效) 
 - vim /etc/security/limits.conf
 末尾追加/修改- * hard nofile 65535
 * soft nofile 65535
 - hard 是硬限制,即实际限制 ;soft 是软限制,即warning 
分析句柄数
(1)统计各进程打开句柄数:lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
(2)统计各用户打开句柄数:lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr
(3)统计各命令打开句柄数:lsof -n|awk '{print $1}'|sort|uniq -c|sort -nr
系统总文件句柄限制
除了对单进程可打开的文件句柄数量限制外, linux还会对系统级别的能够打开的文件句柄的数量进行限制, 即是对整个系统的限制, 而非针对单用户或单进程.
查看当前系统级别能够打开的文件句柄数量:
cat /proc/sys/fs/file-max	# 794168 Centos7 的默认值
系统级打开最大文件句柄的数量永久生效的修改方法:
- /etc/sysctl.conf文件末尾追加- fs.file-max = 2000000
- 执行 sysctl -p,使修改配置立即生效
sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下
-w 临时改变某个指定参数的值
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
查看系统已分配句柄数: cat /proc/sys/fs/file-nr
已分配文件句柄的数目, 已分配但未使用的文件句柄的数目, 文件句柄的最大数目
对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。
如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。
inotify 文件系统事件监控
inotify 是linux的文件系统时间监控机制。
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
- max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
- max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
- max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
如出现 "too many open files" 提示, 记得来确认下是否是该参数配置问题
临时修改该参数配置:
echo 256 > /proc/sys/fs/inotify/max_user_instances
参数持久化
echo "fs.inotify.max_user_instance=256" >> /etc/sysctl.conf
sysctl -p
[原创] 项目 watch EMFILE 报错处理过程的更多相关文章
- ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll
		ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll “/” ... 
- maven 项目启动tomcat报错 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
		maven项目启动tomcat报错: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi ... 
- iOS-C文件添加到iOS项目中,运行报错
		iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ... 
- maven web 项目中启动报错  Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
		主要原因是maven项目里面的jar包吗,没有导入到项目中 maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframewor ... 
- eclipse运行项目,tomcat报错:Exception in thread :http-bio-8080-exec-4
		eclipse运行项目,tomcat报错:Exception in thread :http-bio-8080-exec-4 转自 https://www.cnblogs.com/yby-blogs/ ... 
- 导入项目的时候报错Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha7
		问题描述 今天在导入项目的时候报错: Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha ... 
- 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo
		新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ... 
- Eclipse的maven项目一直无故报错
		maven项目里面没报错,就是项目名称上有红色的叉叉,看着很不舒服: install都成功,但还是有红叉,刷新也没有用,最后搞了好一会才好: 操作步骤: 1.先把项目clean下: 选中要清理的项目, ... 
- java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server
		java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not creat ... 
随机推荐
- Python一行代码搞定的事情
			python -m SimpleHTTPServer 8000 http://127.0.0.1:8000/ 有了这一行代码分享本地盘内容就不需要FTP了. pydoc:Python文档工具 pyth ... 
- HttpMessageConverter和ContentNegotiatingViewResolver
			HttpMessageConverter 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,HttpMessa ... 
- 巧用渐变色打造精致移动端APP
			渐变色是指某个物体的颜色从明到暗,或由深转浅,或是从一个色彩缓慢过渡到另一个色彩,充满变幻无穷的神秘浪漫气息的颜色.在扁平化设计刚刚兴起时,渐变是设计师们避之不及的设计手法.然而自从Instagram ... 
- ceph修复osd为down的情况
			尝试一.直接重新激活所有osd 1.查看osd树 root@ceph01:~# ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-A ... 
- ASP.NET’s compilation system
			Compilation in ASP.NET applications First, let’s take a moment to revisit compilation in the context ... 
- Transferring Data Between ASP.NET Web Pages
			14 July 2012 20:24 http://www.mikesdotnetting.com/article/192/transferring-data-between-asp-net-web- ... 
- 【targeting学习笔记】Display Advertising Targeting
			背景:stanford的计算广告学(computational advertising)课程,yahoo的人主讲,课程链接:http://www.stanford.edu/class/msande23 ... 
- 阿里云vsftp安装和简单的配置
			1.系统环境 [root@jie ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@jie ~]# [root@jie ~]# ... 
- Java NIO学习-详细内容(三)
			九.nio.file 该包是1.7新出的,包含了一系列高级的文件和目录操作方法 1.控制目录属性,只读,系统之类的 2.监控文件及文件夹的改变的WatchService public void sta ... 
- IntelliJ OpenCV 开发环境搭建
			Windows下的IntelliJ + OpenCV开发环境搭建 基于IntelliJ IDEA 15 和 OpenCV 3.1.0 1. 在OpenCV官网下载OpenCV安装程序,双击解压到目标目 ... 
