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

CentOS7.6下accept单IP客户端正常,多异IP连接报Error24问题

解决CentOS 7.6下TCP服务端accept报Error24的问题

核心排查方向

Error24对应Too many open files,但同一IP可建立1100连接、不同IP仅900+就报错,说明问题不是全局系统文件句柄限制,而是进程实际文件句柄限制未生效或连接跟踪/conntrack资源耗尽。

1. 确认进程实际文件句柄限制

  • 找到服务端进程PID:
    ps aux | grep <你的服务端进程名>
    
  • 查看进程的真实限制:
    cat /proc/<PID>/limits
    
    重点关注Max open files字段,如果数值远低于你设置的65535(比如默认的1024),说明进程启动时未继承正确的ulimit配置。

修复方法

  • systemd启动的服务:编辑对应服务的.service文件(通常在/etc/systemd/system/或/usr/lib/systemd/system/),在[Service]段添加:
    LimitNOFILE=65535
    LimitNPROC=65535
    
    重新加载配置并重启服务:
    systemctl daemon-reload && systemctl restart <服务名>
    
  • shell直接启动:在启动服务的同一shell中先执行ulimit -n 65535,或在启动脚本开头加入该命令。

2. 检查连接跟踪(conntrack)资源

不同IP的每个连接会占用独立的conntrack条目,若conntrack表满,会间接导致无法建立新连接(表现为accept报错)。

  • 查看当前conntrack最大限制:
    sysctl net.netfilter.nf_conntrack_max
    
  • 查看当前已使用的conntrack条目数:
    conntrack -L | wc -l
    
  • 若已使用数接近最大值,调高限制:
    sysctl -w net.netfilter.nf_conntrack_max=131072
    
    写入/etc/sysctl.conf永久生效:
    echo "net.netfilter.nf_conntrack_max=131072" >> /etc/sysctl.conf
    sysctl -p
    

3. 排查文件句柄泄漏

检查服务端代码是否存在未关闭的socket或文件:

  • 统计进程当前打开的文件总数:
    lsof -p <PID> | wc -l
    
  • 查看具体打开的文件列表,确认是否有大量未关闭的socket或冗余文件:
    lsof -p <PID>
    
    若发现大量ESTABLISHED或TIME_WAIT状态的未关闭socket,需修复代码中socket关闭逻辑(比如连接断开后调用close())。

4. 验证PAM配置确保limits.conf生效

确保/etc/pam.d/system-auth和/etc/pam.d/password-auth中包含以下行:

session required pam_limits.so

若缺失,添加后重启系统,确保limits.conf的设置能正确应用到所有用户进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:57:01