高并发有关的内核参数

业务起来了,并发上来了,高峰时期也达到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,可以调大

附录

推荐文章,待翻译。

原文地址:https://www.cnblogs.com/ermazi/p/7843644.html