一次「Too many open files」故障

标签: Technical Linux | 发表时间:2015-08-02 22:05 | 作者:老王
出处:http://huoding.com

昨天,项目的 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 进程出现故障。

此故障原因本来非常简单,但我却陷入了经验主义的固定思维,值得反思。

相关 [too many open] 推荐:

详解 Too many open files

- - 编程语言 - ITeye博客
 运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景.         程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry.

一次「Too many open files」故障

- - 火丁笔记
昨天,项目的 ElasticSearch 服务挂了,我说的挂可不是进程没了,因为有 Supervisor 保护,而是服务不可用了. 以前曾经出现过一次因为 ES_HEAP_SIZE 设置不当导致的服务不可用故障,于是我惯性的判断应该还是 ES_HEAP_SIZE 的问题,不过登录服务器后发现日志里显示大量的「Too many open files」错误信息.

flume写入hadoop hdfs报错 Too many open files

- - CSDN博客云计算推荐文章
网络搜索,怀疑linux nofile超过最大限制,当前设置大小1024,默认值. 而查看flume进程打开的文件数量为2932(这个比较奇怪,怎么超过1024了呢. 1.修改nfile配置文件,手工增加nofile的大小. 2.重启flume进程,也就是进程29828,问题解决. 作者:hijk139 发表于2013-2-17 16:37:34 原文链接.

(收藏)Java程序员也应该知道的too many open files的一些事

- - jackyrong
Java应用也有很大的概率会碰到too many open files这样的异常,此异常的主要原因是进程打开了太多的文件(可通过lsof | grep [pid] | wc -l来查看),linux对每个用户/进程都会有打开的文件数的限制. 当前进程打开的文件数的限制可通过cat /proc/[pid]/limits来查看,看到的内容类似如下:.

mysql 中too many connection解决之道

- - jackyrong
在http://www.mysqlperformanceblog.com/2013/11/28/mysql-error-too-many-connections/. 中提到了如何处理了too many connection,其中要点有:. 1) 大多数活动的连接是否真的有必要. 2) 建议使用wait_timeout限制等待的连接.

TFO(tcp fast open)简介

- chenqj - pagefault
原创文章,转载请注明: 转载自pagefault. 本文链接地址: TFO(tcp fast open)简介. 这个是google的几个人提交的一个rfc,是对tcp的一个增强,简而言之就是在3次握手的时候也用来交换数据. 这个东西google内部已经在使用了,不过内核的相关patch还没有开源出来,chrome也支持这个了(client的内核必须支持).

Open API的资源集

- Rossoneri - 博客园-首页原创精华区
现在经常听到和使用到各种开放API,因此笔者对这些进行概要的汇总和整理,希望对有这些需求的有一定的参考价值. 什么是开放平台(Open Platform). 在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为就叫做Open API,提供开放API的平台本身就被称为开放平台.

惠普宣布Open webOS 1.0

- - Solidot
惠普按计划发布了开源版本WebOS的1.0正式版. Open webOS 1.0源代码已发布在GitHub上. 正式版加入了核心应用程序电子邮件和浏览器,支持 Enyo2. 惠普表示1.0版可移植到新设备上,称未来几个月会继续增强Open webOS,计划中的增强包括Qt5/WebKit2,开源多媒体和音频组件,BlueZ蓝牙堆栈,ConnMan网络管理,优化SysMgr渲染架构.

The Open Session In View Anti-Pattern - Vlad Mihalcea

- -
An anti-pattern (or antipattern) is a common response to a recurring problem that is usually ineffective and risks being highly counterproductive.. When using JPA and Hibernate, the Fetching policy can have one of the biggest impacts on application performance, and, as explained in my.

Many Core的应用场景的研究--Tilera Tilepro64,Intel Xeon,AMD Opteron

- imxiaobo - 弯曲评论
这是一篇来自Facebook的white paper. 作者的主要观点是:在以Key-Value为典型查询的SNS系统中,可以通过(即使是低频率的)基于众核(Many Core)芯片,可以达到,或者更好的与基于高端Intel,AMD芯片的平台达到同样或者更好的吞吐率,响应时间和功耗.