昨天,项目的 ElasticSearch 服务挂了,我说的挂可不是进程没了,因为有 Supervisor 保护,而是服务不可用了。以前曾经出现过一次因为 ES_HEAP_SIZE 设置不当导致的服务不可用故障,于是我惯性的判断应该还是 ES_HEAP_SIZE 的问题,不过登录服务器后发现日志里显示大量的「Too many open files」错误信息。
那么 ElasticSearch 设置的最大文件数到底是多少呢?可以通过 proc 确认:
shell> cat /proc/<PID>/limits
结果是「4096」,我们还可以进一步看看 ElasticSearch 打开的都是什么东西:
shell> ls /proc/<PID>/fd
问题看上去非常简单,只要加大相应的配置项应该就可以了。此配置在 ElasticSearch 里叫做 MAX_OPEN_FILES,可惜配置后发现无效。
按我的经验,通常此类问题多半是由于操作系统限制所致,可是检查结果一切正常:
shell> cat /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
问题进入了死胡同,于是我开始尝试找一些奇技淫巧看看能不能先尽快缓解一下,我搜索到 @-神仙- 的一篇文章: 动态修改运行中进程的 rlimit,里面介绍了如何动态修改阈值的方法,虽然我测试时都显示成功了,可惜 ElasticSearch 还是不能正常工作:
shell> echo -n 'Max open files=65535:65535' > /proc/<PID>/limits
此外,我还检查了系统内核参数 fs.file-nr 及 fs.file-max,总之一切和文件有关的参数都查了,甚至在启动脚本里硬编码「ulimit -n 65535」,但一切努力都显得毫无意义。
正当山穷水尽疑无路的时候,同事 @轩脉刃 一语道破玄机:关闭 Supervisor 的进程管理机制,改用手动方式启动 ElasticSearch 进程试试看。结果一切恢复正常。
为什么会这样呢?因为使用 Supervisor 的进程管理机制,它会作为父进程 FORK 出子进程,也就是 ElasticSearch 进程,鉴于父子关系,子进程允许打开的最大文件数不能超过父进程的阈值限制,但是 Supervisor 中 minfds 指令缺省设置的允许打开的最大文件数过小,进而导致 ElasticSearch 进程出现故障。
此故障原因本来非常简单,但我却陷入了经验主义的固定思维,值得反思。
转自:http://huoding.com
分享到:
相关推荐
JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法,三种方案,临时,永久,根治
Too many open files 问题的解决.txt
转:java.net.SocketException: Too many open files解决方法最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报 java.net.SocketException: Too many open files错误,错误...
AIX关于Weblogic的报错_Too_many_open_files_的处理
NULL 博文链接:https://phl.iteye.com/blog/2256121
linux too many open files解决方案.docx
该文档是介绍访问应用很慢,访问Nginx时,报错:accept() failed (24 Too many open files)的解决方案,与大家共享!
本文主要介绍Linux报too many open files时的解决方法,感兴趣的朋友可以看一下。
NULL 博文链接:https://yizhilong28.iteye.com/blog/1154098
主要给大家介绍了Python中出现错误提示:[Errno 24] Too many open files的分析与解决,需要的朋友可以参考借鉴,下面来一起看看吧。
socket accept报Too many open files的原因
Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:
每个步骤亲测通过,项目实战全部OK,如果要搭建nginx 跟fastdfs的朋友,可以下载下来保存,这是我看了很多文档以及实验完善过的文档,每个步骤都比较详细
2008mvp.zip
java工程中想要读取或者导出**.yaml文件所需要的支持jar包,下载解压后直接添加到项目中即可。 如果是使用eclispe创建的yaml文件,那么还需要下载eclipse支持yaml文档的插件
too many open files问题分析和解决
google webrtc 实现视频通话,客户端和服务端采用websocket 连接,实现信令转换,可以正常视频通话,记得提前打开权限
大片 Bigslice是的无服务器集群数据处理系统。...如果测试因socket: too many open files失败socket: too many open files错误socket: too many open files ,请尝试增加打开文件的最大数量。 $ ulimit -n 2000
<br>一、有以下两种情况请下载BDE驱动程序进行安装: 1、An error occurred while attempting to initialize the Borland databse Engine ($2109). 2、Not enough files handles too many open files.You ...