You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS环境Kestrel无响应与MongoDB文件句柄溢出问题求助

解决Kestrel因MongoDB连接抛出"Too many open files in system"的问题

看起来你已经尝试调整了系统级的最大打开文件数,但这个问题通常需要从进程级限制、服务配置、连接池优化多个维度排查,我来一步步帮你梳理:

1. 先确认当前进程实际的文件描述符限制

系统级的fs.file-max是全局上限,但每个进程能用到的上限由用户级和服务配置决定。你可以:

  • 查看Kestrel进程的限制:找到你的.NET Core应用PID(比如用ps aux | grep dotnet),然后执行:
    cat /proc/<你的Kestrel进程PID>/limits | grep "Max open files"
    
  • 同样检查MongoDB进程的限制:
    cat /proc/<MongoDB进程PID>/limits | grep "Max open files"
    

如果这里显示的数值远低于640000,说明你的配置没真正应用到进程上。

2. 确保用户级限制配置生效

编辑/etc/security/limits.conf,添加或修改以下内容:

* soft nofile 640000
* hard nofile 640000
root soft nofile 640000
root hard nofile 640000

然后检查/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive文件,确保有这一行(没有就加上):

session required pam_limits.so

修改后需要重新登录系统,或者重启相关服务才能生效。

3. 给Systemd服务单独配置文件描述符限制

如果你的Kestrel和MongoDB是用Systemd管理的,Systemd会默认覆盖用户级的限制,所以必须在服务配置里单独设置:

  • 编辑Kestrel的服务文件(比如/etc/systemd/system/kestrel-yourapp.service),在[Service]段添加:
    LimitNOFILE=640000
    
  • 同样编辑MongoDB的Systemd服务文件(比如/usr/lib/systemd/system/mongod.service),添加同样的配置。
  • 然后重新加载Systemd并重启服务:
    systemctl daemon-reload
    systemctl restart kestrel-yourapp.service
    systemctl restart mongod.service
    

4. 优化MongoDB连接池配置

.NET Core的MongoDB驱动默认连接池可能设置得过高,导致创建大量连接(每个连接对应一个文件描述符)。你可以在初始化MongoClient时手动调整连接池大小:

var mongoUrl = new MongoUrl("mongodb://your-mongo-host:27017");
var settings = MongoClientSettings.FromUrl(mongoUrl);
// 根据你的应用负载调整,建议先从100-200开始测试
settings.MaxConnectionPoolSize = 150;
// 也可以设置连接超时和闲置超时,避免闲置连接占用资源
settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(5);
settings.MaxConnectionLifeTime = TimeSpan.FromMinutes(30);

var mongoClient = new MongoClient(settings);

过多的空闲连接会占用文件描述符,合理的连接池配置能有效减少资源占用。

5. 排查文件描述符泄漏

如果上述配置都生效了还是出现问题,可能是应用存在资源泄漏:

  • 用lsof -p <Kestrel进程PID>查看该进程打开的所有文件描述符,看是否有大量未关闭的MongoDB连接、日志文件或其他资源。
  • 用lsof | wc -l查看系统总打开文件数,确认是否接近fs.file-max的上限。

6. 检查Nginx的文件描述符配置

Nginx作为反向代理也会占用大量文件描述符,需要在nginx.conf里优化:

worker_rlimit_nofile 640000;

events {
    worker_connections 64000; # 这个值要小于worker_rlimit_nofile
    use epoll; # 用epoll提高并发处理能力
}

修改后重启Nginx生效。

按照这个流程一步步排查,应该能解决"Too many open files in system"的问题。

内容的提问来源于stack exchange,提问作者bits8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:19:29