当 Linux 系统的 TCP 连接数达到 2 万,且 /proc/net/sockstat
中的 tcp_tw
(TIME_WAIT 连接)、tcp_alloc
(已分配但未完全建立的连接)和 tcp_inuse
(正在使用的连接)均处于高位时,可能会引发以下问题:
一、关键指标分析
通过 /proc/net/sockstat
可以查看 TCP 连接状态:
cat /proc/net/sockstat
输出类似:
TCP: inuse 20000 orphan 0 tw 15000 alloc 5000 mem 100
tcp_inuse
(inuse):已建立或正在使用的连接(ESTABLISHED 状态)。tcp_tw
(tw):处于 TIME_WAIT 状态的连接(等待关闭的残留连接)。tcp_alloc
(alloc):已分配但尚未完成三次握手的连接(可能处于 SYN_RECV/SYN_SENT 状态)。
二、潜在问题及原因
1. 端口耗尽(Port Exhaustion)
- 问题:
当tcp_tw
过高时,大量 TIME_WAIT 连接会占用本地端口。客户端频繁建立短连接时,可能因可用端口不足而无法发起新连接。 - 触发条件:
- 客户端主动关闭连接(如 HTTP 短连接),导致本地端口进入 TIME_WAIT 状态。
- 端口范围过小(
net.ipv4.ip_local_port_range
默认 32768-60999,仅约 2.8 万个端口)。
- 典型错误:
connect() failed: Cannot assign requested address (EADDRNOTAVAIL)
2. 内存占用过高
- 问题:
每个 TCP 连接需要内核内存存储元数据(如 socket 结构体、读写缓冲区等)。- 单条连接内存占用约 3-4 KB&#x