1.情景
平时优化web系统,有效提高QPS过程中,很可能着手点多在优化数据库,缓存,虚拟机等,但有一个点容易忽略,就是系统的tcp设置
2.具体说明
如果我们的QPS为3万,但是Tcp的连接数却没有达到3W,这时候就可能是因为服务器socket连接数申请不下来了,但是我们看一下ulimit -n命令,显示有足够用的文件句柄,那为什么会申请不下来呢?
问题的所在关键是tcp链接再经过四次握手结束连接后并不会立刻释放,而是处于timewait状态会再等待一段时间,以防止客户端后续的数据未被接收到。
问题找到后解决就不是那么困难了,只需配置几个参数即可:
#timewait 的数量,默认是 180000。
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
#启用 timewait 快速回收。
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。
net.ipv4.tcp_tw_reuse = 1
结论
这时候再进行压测,不出意外会有不小的性能提升,其实web系统优化不是一个简单的个体优化,而是数据库,编程语言,操作系统,网络等的综合工程,大家共同积累,共同学习,才能走向大师之境!