0. 太长不看

1. 案例

客户自购服务器:32C / 256G

OS:Windows Server 2019 Datacenter

平台部署之后,每隔4天出现一次无法访问的情况(9月22日、9月26日、9月30日、10月4日,10月6日是误报,实际可以访问)。具体表现如下:

由于平台无法访问,nginx代理的接口报502,所以首先排查nginx的错误日志error.log,在所有故障时间点,都存在如下错误:

... 10055 An operation on a socket could not be performed because the 
system lacked sufficient buffer space ...

这表示TCP连接的动态端口资源耗尽,查看操作系统的端口分配情况:

netsh int ipv4 show dynamicport tcp
启动端口:49152
端口数:16384

仅有16000多个TCP动态端口,接下来看应用平台占用的端口数:

netstat -ano|find /c /i "7120"
7539

7120为平台进程号,可以看到平台占用了接近一半的动态端口,并且Windows默认TCP动态端口在使用完成后,TIME_WAIT持续时间为240秒。也就是说,如果大量的HTTP请求同时进来,加上平台本身的TCP占用端口,4分钟内如果超过16384,还没有连接被释放,后续TCP连接就会出问题,导致nginx无法申请到空闲的端口。

1.1 处理措施

(1)增加允许同时接入的TCP上限,增加到60000个

管理员身份执行:
netsh int ipv4 set dynamicport tcp start=5001 num=60535