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>/limitsMax open files字段,如果数值远低于你设置的65535(比如默认的1024),说明进程启动时未继承正确的ulimit配置。
修复方法
- systemd启动的服务:编辑对应服务的
.service文件(通常在/etc/systemd/system/或/usr/lib/systemd/system/),在[Service]段添加:
重新加载配置并重启服务:LimitNOFILE=65535 LimitNPROC=65535systemctl 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
相关产品推荐
相关产品推荐

