镖师 发表于 2023-4-21 17:26:30

一次「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/2015/08/02/460

Discuz智能体 发表于 2025-3-17 07:22:09

从你描述的情况来看,问题的根源确实是由于 Supervisor 的进程管理机制导致的。Supervisor 作为父进程,限制了其子进程(ElasticSearch)的最大文件打开数。虽然你在系统中设置了较高的文件打开数限制,但由于 Supervisor 的默认配置较低,导致 ElasticSearch 无法突破这个限制。

### 解决方案

1. **修改 Supervisor 的配置文件**:
   你可以通过修改 Supervisor 的配置文件来增加 `minfds` 的值,从而允许子进程打开更多的文件。

   打开 Supervisor 的配置文件(通常位于 `/etc/supervisor/supervisord.conf` 或 `/etc/supervisord.conf`),找到或添加以下配置:

   
   minfds=65535

   然后重启 Supervisor 服务:

   sudo service supervisor restart

2. **手动启动 ElasticSearch**:
   如果你不想修改 Supervisor 的配置,或者暂时无法修改,可以尝试手动启动 ElasticSearch 进程,绕过 Supervisor 的限制。这种方法虽然可以临时解决问题,但不建议长期使用,因为 Supervisor 的主要作用是管理进程,确保服务在异常情况下能够自动重启。

   sudo service supervisor stop
   sudo -u elasticsearch_user /path/to/elasticsearch/bin/elasticsearch

   其中 `elasticsearch_user` 是运行 ElasticSearch 的用户,`/path/to/elasticsearch/bin/elasticsearch` 是 ElasticSearch 的启动脚本路径。

3. **检查系统级别的文件打开数限制**:
   虽然你已经检查了 `/etc/security/limits.conf`,但为了确保系统级别的限制不会影响 ElasticSearch,你可以通过以下命令查看当前用户的文件打开数限制:

   ulimit -n

   如果这个值低于你期望的值,可以通过以下命令临时修改:

   ulimit -n 65535

   为了永久生效,你可以在用户的 `.bashrc` 或 `.bash_profile` 文件中添加这行命令。

### 总结

这个问题的根本原因是 Supervisor 的 `minfds` 配置限制了子进程的文件打开数。通过修改 Supervisor 的配置文件或手动启动 ElasticSearch 进程,可以解决这个问题。建议优先修改 Supervisor 的配置,以确保服务的稳定性和自动恢复能力。

如果你在 Discuz 或其他建站方面遇到类似的问题,也可以参考类似的思路,检查父进程或系统级别的资源限制,确保服务能够正常运行。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-22 03:18:30

在Discuz!环境中,类似「Too many open files」的问题也可能出现,尤其是在高并发的论坛或网站中。以下是一些可能的解决方案和预防措施:

### 1. 调整系统文件描述符限制
在Linux系统中,文件描述符的限制可以通过以下方式调整:

#### 修改 `/etc/security/limits.conf`
在 `/etc/security/limits.conf` 文件中,添加或修改以下内容:
* soft nofile 65535
* hard nofile 65535
这将设置所有用户的文件描述符限制为65535。

#### 修改 `/etc/pam.d/common-session` 和 `/etc/pam.d/common-session-noninteractive`
确保以下行存在于这两个文件中:
session required pam_limits.so

#### 修改 `/etc/sysctl.conf`
在 `/etc/sysctl.conf` 文件中,添加或修改以下内容:
fs.file-max = 65535
然后运行 `sysctl -p` 使更改生效。

### 2. 调整Discuz!的配置
在Discuz!中,可以通过以下方式优化文件描述符的使用:

#### 优化数据库连接
确保数据库连接池的大小合理,避免过多的数据库连接占用文件描述符。

#### 优化缓存配置
使用高效的缓存机制,如Memcached或Redis,减少对文件系统的直接操作。

### 3. 调整Web服务器的配置
如果使用Nginx或Apache作为Web服务器,也需要调整其文件描述符的限制。

#### Nginx
在Nginx的配置文件 `/etc/nginx/nginx.conf` 中,添加或修改以下内容:
worker_rlimit_nofile 65535;

#### Apache
在Apache的配置文件 `/etc/httpd/conf/httpd.conf` 中,添加或修改以下内容:
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

### 4. 使用Supervisor时的注意事项
如果使用Supervisor管理Discuz!的进程,确保Supervisor的配置文件中设置了足够的文件描述符限制。

#### 修改Supervisor配置文件
在Supervisor的配置文件 `/etc/supervisor/supervisord.conf` 中,添加或修改以下内容:

minfds=65535

### 5. 监控和日志分析
定期监控系统的文件描述符使用情况,分析日志文件,及时发现和解决问题。

#### 使用 `lsof` 命令
可以使用 `lsof` 命令查看当前打开的文件描述符:
lsof | wc -l

#### 使用 `ss` 命令
可以使用 `ss` 命令查看当前的网络连接情况:
ss -s

### 6. 定期维护
定期重启服务,清理不必要的文件和连接,保持系统的健康运行。

通过以上措施,可以有效预防和解决Discuz!环境中「Too many open files」的问题。希望这些建议对你有所帮助。如果有更多问题,欢迎继续咨询。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 一次「Too many open files」故障