netstat -apn | grep 8086linux
能够看到大量处于 TIME_WAIT状态的 tcp 链接tcp
使用命令测试
netstat -apn | grep 8086 | grep TIME_WAIT | wc -l优化
进行计数, 会发现链接数会不断增长, 通过屡次测试, 在公司环境中链接数至少都会达到 6k+. 这个问题必需要解决, 一方面是由于每条 tcp 链接都会占用内存, 另外一方面系统的动态端口数也是有限的.code
很明显这些链接几乎都处在 TIME_WAIT 状态,因此在继续往下走以前, 须要了解下 TIME_WAIT 这个关键字blog
咱们知道 一条 tcp 链接从开始到结束会经历多个状态, 换句话说, 能够把 一条 tcp 链接当作是一个 状态机. 这个状态图以下:ip
能够看到, 凡是主动进行关闭 tcp 链接的一方, 都会通过 TIME_WAIT 这个状态.接下来再通过 2MSL 的时间后内核再彻底释放相应的文件描述符和端口. (顺便提一下, MSL 是最大分段寿命, 是一个 TCP 分段能够存在于互联网系统中的最大时间, 在 Linux 下能够用命令查看 MSL的数值:内存
cat /proc/sys/net/ipv4/tcp_fin_timeoutclass
到这个地方能够推断出, 是 8086 端口主动关闭了 tcp 链接, 致使挤压了大量的处于 TIME_WAIT 状态下的链接在等待内核释放监控
为了解决大量TCP链接处于TIME_WAIT状态,须要对linux内核参数进行优化。编辑/etc/sysctl.conf文件,添加以下参数:
net.ipv4.conf.all.accept_redirects = 0 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 2000