一次「Too many open files」故障

发表于2015-08-02

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

那么 ElasticSearch 设置的最大文件数到底是多少呢?可以通过 proc 确认:

  1. shell> cat /proc/<PID>/limits

结果是「4096」,我们还可以进一步看看 ElasticSearch 打开的都是什么东西:

  1. shell> ls /proc/<PID>/fd

问题看上去非常简单,只要加大相应的配置项应该就可以了。此配置在 ElasticSearch 里叫做 MAX_OPEN_FILES,可惜配置后发现无效。

按我的经验,通常此类问题多半是由于操作系统限制所致,可是检查结果一切正常:

  1. shell> cat /etc/security/limits.conf
  2.  
  3. * soft nofile 65535
  4. * hard nofile 65535

问题进入了死胡同,于是我开始尝试找一些奇技淫巧看看能不能先尽快缓解一下,我搜索到 @-神仙- 的一篇文章:动态修改运行中进程的 rlimit,里面介绍了如何动态修改阈值的方法,虽然我测试时都显示成功了,可惜 ElasticSearch 还是不能正常工作:

  1. 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 进程出现故障。

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

此条目由老王发表在Technical分类目录,并贴了Linux标签。将固定链接加入收藏夹。

《一次「TOO MANY OPEN FILES」故障》上有10个想法

    1. detailyang在2015-08-02 22:49:04说道:

      我们这边是superivsord的启动脚本里加上参数解决类似的问题
      ulimit -f unlimited
      ulimit -t unlimited
      ulimit -v unlimited
      ulimit -n 640000
      ulimit -m unlimited
      ulimit -u 320000

    2. 侯星辉在2015-08-03 13:37:09说道:

      我们也遇到过楼住类似的问题. 一次supervisor下面托管的服务 日志一直报错Too many open files . 查看该服务的系统limit 发现是设置了1024,而统计现在需要用到3000多个.

      https://attachments.tower.im/tower/f528b22a4e7747f383036688d5a9aa09?version=auto&filename=Clipboard%20Image.png
      解决思路两个出发点,
      1。是修改supervisor 启动脚本里加上 楼上的参数
      2。是修改了系统的/etc/security/limits.d/90-nproc.conf 文件 这个优先于/etc/security/limits.conf
      几个工程师再三考虑和分析之后 觉得还是第一种方案 更合适我们些.

    3. 包括daemontools(supervise)也是这样,这类服务管理工具的解决方法就是在运行的脚本最上面加上ulimit -n xxx

    4. Terry在2015-08-26 16:26:07说道:

      Oops, 竟然是 @轩脉刃 的同事, 看过好多@轩脉刃 大大的博文. Supervisor也在用, 目前尚未入坑, 先受教了, 谢谢.

    5. 你网站很好,能友链链接吗?回龙观空调加氟http://www.okhongkang.com 联系qq1715-658817

    6.  多谢了,刚好用上。跟楼主的情况一模一样,只是守护的服务不同。
    7. Pingback引用通告: Elasticsearch 索引小优化 | Wislay

    8. Pingback引用通告: Elasticsearch 索引小优化 | Nginlion

    9. huazai在2018-11-14 11:23:38说道:

      其实可以把要运行的command放到一个脚本里,然后在脚本里加ulimit限制

      #!/bin/bash

      ulimit -n xxxx

      #command
      ..

      然后把这个脚本放到supervisor里

    10. 涛涛在2019-01-10 17:21:57说道:

      这种问题我也遇到过 其实是因为supervisor 主进程没有继承系统的配置导致拿supervisor启动的服务limits都是默认的1024 如果条件允许的话 只需要重启supervisord 主进程即可解决

【转载】一次「Too many open files」故障的更多相关文章

  1. Socket的用法——NIO包下SocketChannel的用法 ———————————————— 版权声明:本文为CSDN博主「茶_小哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ycgslh/article/details/79604074

    服务端代码实现如下,其中包括一个静态内部类Handler来作为处理器,处理不同的操作.注意在遍历选择键集合时,没处理完一个操作,要将该请求在集合中移除./*模拟服务端-nio-Socket实现*/pu ...

  2. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  3. 「白帽黑客成长记」Windows提权基本原理(下)

    上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能. 推荐阅读:「白帽黑客成长记」Windows ...

  4. docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」

    很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...

  5. [转帖]「白帽黑客成长记」Windows提权基本原理(下)

    「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...

  6. [转帖]「白帽黑客成长记」Windows提权基本原理(上)

    「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...

  7. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

  8. XCActionBar 「Xcode 中的 Alfred」

    下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 ( ...

  9. Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新

    当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...

随机推荐

  1. 动图:删除链表的倒数第 N 个结点

    本文主要介绍一道面试中常考链表删除相关的题目,即 leetcode 19. 删除链表的倒数第 N 个结点.采用 双指针 + 动图 的方式进行剖析,供大家参考,希望对大家有所帮组. 19. 删除链表的倒 ...

  2. CSS3常见动画

    一.是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如 ...

  3. oo第二单元——多线程魔鬼电梯

    在初步认识了面向对象思想后,立刻进入了多线程的学习,本单元的难点主要是锁的理解,需要保证线程安全的同时防止死锁的发生,也要尽可能缩小锁的范围,提高性能.这一单元以电梯为载体,让我们从生活出发,从电梯运 ...

  4. SpringBoot - yml写法

    1 #区分大小写 2 server: 3 port: 8081 4 path: hello 5 6 #字面量:普通的值(数字,字符串,布尔): 7 #字符串:双引号 - 不转义 单引号 - 转义 8 ...

  5. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  6. SQL Server 审计(Audit)

    审计(Audit)用于追踪和记录SQL Server实例,或者单个数据库中发生的事件(Event),审计运作的机制是通过捕获事件(Event),把事件包含的信息写入到事件日志(Event Log)或审 ...

  7. 被动信息搜集 - Python安全攻防

    概述: 被冻信息搜集主要通过搜索引擎或者社交等方式对目标资产信息进行提取,通常包括IP查询,Whois查询,子域名搜集等.进行被动信息搜集时不与目标产生交互,可以在不接触到目标系统的情况下挖掘目标信息 ...

  8. [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化

    概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...

  9. deep freeze standard v8.x

    62S93Y4Q-6C6E4EQQ-7MKMZA9F-RK5H6CSZ-AB7W3BMMPJ6GGQDCPT5EPVWGJP3EEQ5GAV2TCQD7-F8J933CA-6AEHN9ZG-2FW3M ...

  10. hdu4791水题

    题意:       打印东西,给你区间和每个区间的价格,然后输入任务张数,输出最少花费..    题解:       昨晚的小测试就有这个题目,当时蒙B了,怎么也读不懂题目,一直纠结怎么把150拆成1 ...