`

一次「Too many open files」故障

阅读更多
昨天,项目的 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解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是由于进程打开的文件数量超过了操作系统的限制,导致服务器...

    Too many open files 问题的解决.txt

    在Linux系统中,“Too many open files”错误是一个常见的性能瓶颈,尤其是在运行大量并发服务或应用时。这个问题的根本在于操作系统对每个进程可打开的文件数量有限制,默认情况下,这个限制往往设置得较低(如1024...

    报错:too many open files处理

    在IT行业中,我们经常遇到各种错误,其中之一是“too many open files”。这个错误通常发生在操作系统限制了同一时间可打开的文件数量,而程序试图超出这个限制时。在本篇文章中,我们将深入探讨这个问题,理解其...

    Too many open files 解决方法

    在将Web服务器从Windows环境迁移到Linux环境后,遇到了一个常见的问题:“java.net.SocketException: Too many open files”。这种异常通常发生在高并发环境下,例如网站访问量显著增加时。在Windows环境中长时间...

    java.io.FileNotFoundException: *****(Too many open files)

    在Java编程中,"java.io.FileNotFoundException: ***** (Too many open files)" 是一个常见的错误,意味着程序尝试打开的文件数量超过了操作系统的限制。这个错误通常出现在处理大量文件或长时间运行的程序中,尤其...

    AIX关于Weblogic的报错_Too_many_open_files_的处理

    在AIX环境中部署Weblogic时,可能会遇到一个常见的错误提示:“Too many open files”。这一错误提示通常出现在系统资源限制不当的情况下,具体表现为操作系统对单一进程能够打开的文件数量进行了限制,而当前应用...

    linux too many open files解决方案.docx

    Linux too many open files 解决方案 Linux 系统中的打开文件数量限制问题是系统对程序打开文件数量的限制问题。这个限制可以通过 `ulimit -a` 命令来查看。默认情况下,Linux 系统的打开文件数量限制是 1024,可以...

    Linux报too many open files的解决方案

    Linux系统在运行时经常会出现"too many open files"(文件打开过多)的错误,这是一个非常常见的问题,通常发生在当系统运行的应用程序尝试打开的文件数量超过了系统限制时。为了解决这个问题,我们可以从两个方面...

    访问应用很慢,访问Nginx时,报错:accept() failed (24 Too many open files).docx

    一、临时修改 ulimit 值 可以使用 ulimit 命令来临时修改打开文件数的限制。例如,使用以下命令可以将打开文件数设置为 655360: [root@kvm-server nginx]# ulimit -n 655360 这将临时修改 ulimit 值,直到下次...

    Python错误提示:[Errno 24] Too many open files的分析与解决

    在Python编程过程中,可能会遇到一个常见的错误提示:“[Errno 24] Too many open files”。这个错误通常意味着你的程序尝试打开的文件句柄超过了操作系统允许的最大限制。下面我们将深入探讨这个问题的原因、如何...

    socket accept报too many open files的原因

    socket accept报Too many open files的原因

    39 案例实战:如何解决经典的Too many connections故障?背后原理是什么.pdf

    除了文件句柄限制之外,ulimit命令还可以限制其他资源的使用,例如coreFileSize(进程崩溃转储文件大小)、maxLockedMemory(最大锁定内存大小)、openFiles(最大打开文件句柄数)以及maxUserProcesses(最大用户...

    mysql too many open connections问题解决方法

    MySQL中的“Too many open connections”错误通常意味着服务器已经达到了其允许的最大并发连接数,并且无法接受更多的连接请求。这是数据库管理中的一个常见问题,尤其是在高并发访问的应用中。以下是一些解决此问题...

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    Ansj中文分词(强大)

    Ansj中文分词是一款纯Java、主要用于自然语言处理、高精度的中文分词工具,目标是“准确、高效、自由地进行中文分词”。 内容简介:http://www.iteye.com/magazines/102#234 此分词具有自己学习的功能,所以拜托大家...

    nginx fastdfs.docx

    搭建 Nginx 与 FastDFS 的组合,是一种常见的文件存储和分发解决方案。FastDFS 是一个开源的轻量级分布式文件系统,而 Nginx 作为高性能的 Web 服务器和反向代理服务器,两者结合能够提供稳定、高效的文件上传和下载...

    2008mvp.zip

    7. **持续贡献**:MVP身份并非一次性授予,而是每年评审,所以文件可能也包含关于如何保持和提升MVP地位的建议。 为了获得这些详细信息,你需要解压缩文件并打开这两个文档进行阅读。如果你计划申请或了解如何成为...

    http连接关闭

    too many open files问题分析和解决

    Hadoop问题处理

    在Hadoop集群中,遇到`java.io.IOException: Too many open file`和`java.lang.OutOfMemoryError`这两种异常,通常是由于资源限制或管理不当引起的。本文将深入探讨这两种错误的成因、解决策略以及如何避免它们。 1...

Global site tag (gtag.js) - Google Analytics