问题出现得很突然,日志倒是留得挺全。服务器作为客户端频繁调用外部接口,本地端口很快耗尽,日志里报无法分配请求地址,业务请求大面积失败。
真正麻烦的地方在于,几个原因的现象几乎一样。短连接调用频繁,主动关闭方要等待两倍报文生存时间。另一种情况是本地可用端口范围太小。
少数情况下是没有复用连接,每次请求都新建。
第一件事是统计各状态连接数量
ss -s
接着看可用端口范围
sysctl net.ipv4.ip_local_port_range
然后开启端口复用
sysctl -w net.ipv4.tcp_tw_reuse=1
剩下的就是改成连接池复用长连接
ss -tan state time-wait | wc -l
同事提醒我看一下最近一次发布,时间点确实对得上。
改完先别撤,确认这几项。等待状态连接数降到合理范围,调用外部接口不再报端口耗尽。
提醒一点。缩短等待时间有风险,可能让延迟的报文串到新连接上;根治还是改成长连接或者连接池。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。