TCP收包过程
TCP 数据包的接收流程在整体上与发送流程类似,只是方向是相反的。
1. netdev_budget 控制每次poll的数量
数据包到达网卡后,就会触发中断(IRQ)来告诉 CPU 读取这个数据包。但是在高性能网络场景下,数据包的数量会非常大,如果每来一个数据包都要产生一个中断,那 CPU 的处理效率就会大打折扣,所以就产生了 NAPI(New API)这种机制让 CPU 一次性地去轮询(poll)多个数据包,以批量处理的方式来提升效率,降低网卡中断带来的性能开销。
我们可以使用netdev_budget来控制每次轮询的数据包个数:
net.core.netdev_budget = 600 #default 300
Tips: 在网络吞吐量较大的场景中,我们可以适当地增大该值,比如增大到 600。增大该值可以一次性地处理更多的数据包。但是这种调整也是有缺陷的,因为这会导致 CPU 在这里 poll 的时间增加,如果系统中运行的任务很多的话,其他任务的调度延迟就会增加。
TCP Receive Buffer
2. tcp_rmem 合理控制TCP接收缓冲区大小
该参数类似tcp_wmem, 唯一的区别在于我们可以通过参数控制自动动态调整的开闭,通常情况下我们是打开它:
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_moderate_rcvbuf = 1
为什么只有接收缓冲区有开关?
因为 TCP 接收缓冲区会直接影响 TCP 拥塞控制,进而影响到对端的发包,所以使用该控制选项可以更加灵活地控制对端的发包行为。
3. SO_RCVBUF
除了 tcp_moderate_rcvbuf 可以控制 TCP 接收缓冲区的动态调节外,也可以通过 setsockopt() 中的配置选项 SO_RCVBUF 来控制,这与 TCP 发送缓冲区是类似的。如果应用程序设置了 SO_RCVBUF 这个标记,那么 TCP 接收缓冲区的动态调整就是关闭,即使tcp_moderate_rcvbuf默认打开。
4. rmem_max 设置接收缓冲区最大值
SO_RCVBUF 设置的值最大也不能超过 net.core.rmem_max。通常情况下,我们也需要设置 net.core.rmem_max 的值大于等于 net.ipv4.tcp_rmem 的 max:
net.core.rmem_max = 16777216
接包收包配置参数速查