Linux连接数过高_并发连接治理

1次阅读

linux连接数过高需分层排查:先用netstat/ss分析状态分布与ip端口聚合,再检查系统级限制参数,继而优化内核网络参数(如tcp_tw_reuse、somaxconn),规范应用层连接管理(keep-alive、连接池、socket关闭),最后通过iptables限流和监控告警主动防御。

Linux连接数过高_并发连接治理

Linux连接数过高通常意味着系统正承受大量并发请求,可能引发响应延迟、端口耗尽甚至服务不可用。关键不是单纯限制连接数,而是识别真实瓶颈——是应用处理慢、连接未及时释放,还是恶意扫描或ddos?治理需分层排查、精准干预。

查看当前连接状态与分布

快速定位问题源头:

  • 按状态统计连接数:运行 netstat -an | awk '{print $6}' | sort | uniq -c | sort -n,重点关注 TIME_WAITESTABLISHEDCLOSE_WAIT 占比。若 CLOSE_WAIT 持续偏高,大概率是应用未主动关闭 socket;若 ESTABLISHED 突增且集中在某几个 IP,需检查是否被爬或攻击。
  • 按端口和IP聚合分析:用 ss -tn src :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20 查看 Top 20 访问 IP,结合业务判断是否异常。
  • 确认系统级连接限制:检查 cat /proc/sys/net/core/somaxconn(全连接队列大小)、cat /proc/sys/net/core/netdev_max_backlog(网卡收包队列)、ulimit -n(进程文件描述符上限),这些值过低会直接导致连接丢弃或排队超时。

优化内核网络参数缓解压力

针对常见高连接场景调整关键参数(修改后需 sysctl -p 生效):

  • 重用 TIME_WAIT 连接:启用 net.ipv4.tcp_tw_reuse = 1(客户端可复用处于 TIME_WAIT 的连接),配合 net.ipv4.tcp_timestamps = 1(必须开启,用于安全校验)。
  • 快速回收 TIME_WAIT:谨慎开启 net.ipv4.tcp_fin_timeout = 30(默认 60),或 net.ipv4.tcp_tw_recycle = 0(已废弃,NAT 环境下禁用,避免连接错乱)。
  • 扩大连接队列容量:将 net.core.somaxconnnet.core.netdev_max_backlog 调至 65535,防止 SYN 包或接收队列溢出丢包。

应用层连接管理必须规范

内核调优只是辅助,根本在应用自身是否健康:

  • http 服务务必启用 Keep-Alive,并合理设置 keepalive_timeout(如 nginx 默认 75s),避免短连接风暴。同时限制单 IP 并发连接数(Nginx 可用 limit_conn 指令)。
  • 数据库/redis中间件使用连接池,禁止每次请求新建连接。检查连接池最大空闲数、最小空闲数、超时时间,避免连接泄漏或积。
  • 代码中确保 socket 正确关闭:尤其在异常分支里补上 close() 或使用 try-with-resources(Java)、with(Python)等自动释放机制。

主动防御与限流兜底

当流量确实超出承载能力,需有快速止血手段:

  • 用 iptables 或 nftables 限速限连:例如每秒最多 20 个新连接 iptables -A input -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-saddr -j REJECT
  • 接入 API 网关或 WAF,基于 IP、User-Agent、请求频率做规则拦截,对高频扫描行为自动封禁。
  • 监控告警必须覆盖关键指标:如 netstat ESTABLISHED 数 > 8000TIME_WAIT 数 10 分钟内增长超 5000ss -s 中 orphan count 持续 > 100,触发即时通知。

不复杂但容易忽略:很多“连接数高”本质是应用 bug 或配置错误,不是服务器扛不住。先查连接状态分布,再看应用日志和连接生命周期,最后才动内核参数。盲目调大限制,可能掩盖真正问题。

text=ZqhQzanResources