1. 问题现象与初步排查
那天凌晨2点37分,值班手机突然响起刺耳的报警声。监控系统显示promotion服务的错误率从0.01%飙升到43.2%,业务日志里满是"cannot assign requested address"的报错。这个错误码(对应系统错误EADDRNOTAVAIL)通常意味着TCP/IP协议栈无法分配新的本地端口,就像邮局突然告诉你"没有可用的邮票了"一样诡异。
我立即登录问题服务器,执行了第一个关键命令:
bash复制netstat -nap | grep ESTABLISHED | wc -l
输出显示有28,231个ESTABLISHED状态的连接——这极不正常。在常规业务负载下,这个数字通常维持在50-100之间。更奇怪的是,这些连接全部指向同一个后端服务的443端口,就像高速公路突然被同一家公司的卡车塞得水泄不通。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统资源深度检查
2.1 端口资源分析
Linux系统默认的临时端口范围是32,768到60,999(共28,232个),通过以下命令确认:
bash复制cat /proc/sys/net/ipv4/ip_local_port_range
我们的容器环境配置了28,232个可用端口(从32768到60999),而当前ESTABLISHED连接数已经达到28,231——距离耗尽仅一步之遥。这解释了为什么新连接会报"cannot assign requested address"错误。
2.2 文件描述符限制
虽然端口即将耗尽,但文件描述符限制还很宽裕:
bash复制ulimit -n
输出1,048,576表示单个进程可以打开百万级文件描述符,远高于当前连接数。排除了文件描述符不足的可能性。
2.3 TCP Keepalive机制
检查系统级keepalive参数发现:
bash复制cat /proc/sys/net/ipv4/tcp_keepalive_time
输出7200表示系统默认在连接空闲2小时后才会发送探测包。这个时间对于高频短连接服务来说太长了——就像快递员非要等2小时才确认收货人是否在家。
3. 网络抓包与协议分析
3.1 关键抓包发现
使用tcpdump抓取与后端服务的通信:
bas复制
