问题描述

本网站时不时访问不了,于是进行了排查

第一步: ps 查看进程, 登录ecs,查看nginx 和 mindoc的运行状态

[root@iz2zecj7a5r32f2axsctb9z ~]# ps auxH | head -n 1 && ps auxH |grep mindoc | grep -v grep
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:00 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:00 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:00 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:00 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:05 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:13 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:00 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:04 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:12 /usr/local/mindoc/mindoc_linux_amd64
root 3692 0.0 8.3 729068 156920 ? Sl 1月21 0:03 /usr/local/mindoc/mindoc_linux_amd64

[root@iz2zecj7a5r32f2axsctb9z ~]# ps auxH | head -n 1 && ps auxH |grep nginx | grep -v grep
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3766 0.0 0.2 46632 3808 ? S 1月21 0:00 nginx: master process /usr/local/nginx/sbin/nginx -g daemon off;
nobody 3767 0.0 0.2 48060 5084 ? S 1月21 0:02 nginx: worker process

进程运行正常的,且占用CPU、内存都正常

第二步 查看网络状况

[root@iz2zecj7a5r32f2axsctb9z ~]# netstat -an | grep TIME_WAIT
tcp 0 0 127.0.0.1:52716 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:53384 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:53408 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:55482 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:53390 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:55494 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:55618 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:55590 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:53342 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52652 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55594 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:53438 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52728 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55630 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:53432 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52692 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55638 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:52712 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:52760 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55642 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:55546 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:53414 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52704 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55626 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:52752 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:52736 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:53336 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:53372 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:53318 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52668 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:53378 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:53366 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52632 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:53444 127.0.0.1:2380 TIME_WAIT
tcp 0 0 127.0.0.1:52608 127.0.0.1:22380 TIME_WAIT
tcp 0 0 127.0.0.1:55566 127.0.0.1:32380 TIME_WAIT
tcp 0 0 127.0.0.1:55518 127.0.0.1:32380 TIME_WAIT

由此可以知道大量的TIME_WAIT 导致本地端口不足,查找2380和22380所属的进程

[root@iz2zecj7a5r32f2axsctb9z ~]# lsof -i:2380
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
etcd 21955 root 5u IPv4 1181575 0t0 TCP localhost:2380 (LISTEN)
etcd 21955 root 16u IPv4 1181628 0t0 TCP localhost:2380->localhost:36214 (ESTABLISHED)
etcd 21955 root 17u IPv4 1181629 0t0 TCP localhost:2380->localhost:36216 (ESTABLISHED)

由此可看出大量的etcd peer间的连接导致大量的TIME_WAIT

第三步 查看与time_wait相关的系统参数

[root@iz2zecj7a5r32f2axsctb9z ~]# sysctl -a | grep ipv4.tcp

net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_syncookies=1

修改参数值为:
sysctl -w net.ipv4.tcp_fin_timeout =30

net.ipv4.tcp_fin_timeout =30 // 修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_tw_recycle=1 // 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_reuse=1 // 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭

第四步 验证

[root@iz2zecj7a5r32f2axsctb9z ~]# netstat -ta | awk ‘{s[$NF]++} END{ for(a in s) print(a,s[a])}’
LISTEN 14
State 1
ESTABLISHED 51
established) 1

现在可以发现大量的time_wait不存在啦 , 问题解决!

保存

sysctl -p
或者直接在/etc/sysctl.conf中添加
或者在/etc/sysctl.d/目录中添加一个新的conf文件,将上述要修改的参数添加到文件中

文档更新时间: 2021-01-25 23:22   作者:周国强