阿里云服务器默认已经配好,包括 Linux 和 Windows Server 2019 Datacenter;
客户自购物理服务器或 Amazon 等 VPS,需执行命令;
netsh int ipv4 set dynamicport tcp start=5001 num=60535
# 用户单进程的最大文件数 当前会话生效
ulimit -n 65535
# 修改系统配置
echo "ulimit -HSn 65535" >> /etc/rc.local
echo "ulimit -HSn 65535" >> /root/.bash_profile
ulimit -HSn 65536
# 系统允许的文件描述符数量10m
sysctl -w fs.file-max=10485760
# 每个tcp连接的读取缓冲区1k,一个连接1k
sysctl -w net.ipv4.tcp_rmem=1024
# 每个tcp连接的写入缓冲区1k
sysctl -w net.ipv4.tcp_wmem=1024
# 修改默认的本地端口范围
sysctl -w net.ipv4.ip_local_port_range='1024 65535'
# 快速回收time_wait的连接,time_wait超时时间设置,单位:秒
sysctl -w net.ipv4.tcp_tw_recycle=1
# 空的 tcp 是否允许回收利用
sysctl -w net.ipv4.tcp_tw_reuse=1
# 允许同一IP主机socket connect请求中的timestamp乱序
sysctl -w net.ipv4.tcp_timestamps=0
# 关闭防洪水攻击,避免高并发时被认为是洪水攻击
sysctl -w net.ipv4.tcp_syncookies=0
#用户单进程的最大文件数,用户登录时生效
echo '* soft nofile 1048576' >> /etc/security/limits.conf
echo '* hard nofile 1048576' >> /etc/security/limits.conf
客户自购服务器: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)增加允许同时接入的TCP上限,增加到60000个
管理员身份执行:
netsh int ipv4 set dynamicport tcp start=5001 num=60535