高并发有关的内核参数
业务起来了,并发上来了,高峰时期也达到1.6wrps了,长连接数量达到了5w,为了生存,才研究如何提高并发。
1. net.core.netdev_max_backlog
net.core.netdev_max_backlog
参数表示网卡接受数据包的队列最大长度,在阿里云服务器上,默认值是1000,可以适当调整。
2. net.core.somaxconn
net.core.somaxconn
参数决定了端口监听队列的最大长度,存放的是已经处于ESTABLISHED而没有被用户程序(nginx)接管的TCP连接,默认是128,对于高并发的,或者瞬发大量连接,必须调高该值,否则会直接丢弃连接。
3. net.ipv4.tcp_max_orphans
net.ipv4.tcp_max_orphans
参数决定孤立连接的最大数量。阿里云服务器默认16384,个人感觉没啥鸟用。
4. net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog
参数决定已经收到syn包,但是还没有来得及确认的连接队列,这是传输层的队列,在高并发的情况下,必须调整该值,提高承载能力。
5. net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries
参数决定了发送SYN+ACK
确认包重试的次数(数量),默认是5,可以调整为2或者3,使其快速失败。
6. net.ipv4.tcp_syn_retries
net.ipv4.tcp_syn_retries
参数,作为客户端,主动建立连接时发送syn包重试的次数,默认6次,可以调整为2次或者三次,快速失败。
7. net.ipv4.tcp_abort_on_overflow
net.ipv4.tcp_abort_on_overflow
参数,当TCP连接已经建立,并塞到程序监听backlog队列时,如果检测到backlog队列已经满员后,TCP连接状态会回退到SYN+ACK
状态,假装TCP三次握手第三次客户单的ACK
包没收到,让客户端重传ACK
,以便快速进入ESTABLISHED
状态。如果设置了net.ipv4.tcp_abort_on_overflow
参数,那么在检测到监听backlog 队列已满时,直接发 RST 包给客户端终止此连接,此时客户端程序会收到104 Connection reset by peer
错误。这个参数很暴力,慎用。参考这里
8. net.ipv4.tcp_syncookies
net.ipv4.tcp_syncookies
参数,在TCP三次握手过程中,当服务端收到最初的SYN
请求时,会检查应用程序的syn_backlog
队列是否已满。若已满,通常行为是丢弃此SYN
包。若未满,会再检查应用程序的监听backlog
队列是否已满。若已满并且系统根据历史记录判断该应用程序不会较快消耗连接时,则丢弃此 SYN 包。如果启用tcp_syncookies
则在检查到syn_backlog
队列已满时,不丢弃该SYN
包,而改用syncookie
技术进行三次握手。参考这里
9. net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range
参数决定了作为客户端,发起连接时可用的端口范围,对于nginx来说,后抛请求是就是客户端行为,所以高并发场景下也有一定的必要。
10. net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_reuse
参数可以重用TIME_WAIT
状态的连接,仅需要1秒就可以重用。此参数针对TIME_WAIT
,与是否为客户端无关。
11. net.core.rmem_max
12. net.core.wmem_max
13. net.ipv4.tcp_rmem
14. net.ipv4.tcp_wmem
以上4个参数决定了socket buffer
大小,默认是几百KB,可以调大
附录
推荐文章,待翻译。