[关闭]
@Alex-Zhao 2018-07-21T13:44:18.000000Z 字数 2782 阅读 358

万兆网卡性能调优

总结


接到DBA反馈说两个万兆网卡做bond0,实际传输速率峰值只有1.1GBit,今天找了大量资料,现在总结一下影响网卡性能的相关参数。
在万兆网卡上有几个名词:
TSO:TCP Segmentation offload,默认情况下,系统的TCP分段操作是由CPU完成,支持TSO的网卡,内核会将一个大的IP数据包向下传给网卡,由网卡芯片重新分成若干个IP数据包,这样就把一部分CPU的工作交给网卡来处理。当然这是需要硬件支持TSO功能的。
UFO:这个是针对UDP协议的报文。只能进行IP层上的切片。
LRO:TSO对应发送队列,LRO对应接受队列,讲收到的多个TCP数据汇聚成一个大的数据包,然后传递给上层内核协议栈。减少CPU处理的开销。
GSO/GRO:在Linux中的叫法。算是一个新的辅助功能,比TSO更为通用,在数据包发送到网卡之前,GSO会检查网卡是否支持TSO/UFO功能,如果支持直接发送到网卡,不支持的话在调用网卡驱动接口前进行分片,和TSO相比,接口不同,软硬件支持而已,本质都是一种延缓分片技术。新的网卡都会使用GSO/GRO接口。
PS:介绍内核对数据包进行分片的时间点:
1.在传输协议中,当构造skb用于排队的时候
2.在传输协议中,但是使用GSO功能,将数据传递给网卡驱动前的时候(支持GSO)
3.在驱动程序中,网卡支持TSO功能。(支持GSO,TSO)
RSS:多队列,一般多少个CPU核心多少个队列,根据网络基本信息(sip,sport,dip,dport)计算哈希值后分配到多个队列中,交给多个CPU处理。

  1. [root@centos-tjo5tnu8 ~]# lspci -s 84:00.0 -vvv | grep Width
  2. LnkCap: Port #0, Speed 5GT/s, Width x8, ASPM L0s, Latency L0 unlimited, L1 <8us
  3. LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
  1. ethtool -S eth10 //查看网卡队列情况
  2. cat /proc/interrupts | grep eth10 //查看实际运行的网卡工作的队列数
  1. ethtool -C eth10 rx-usecs 0

rx-usecs 会同时控制 tx 以及 rx 方向的 coalescing。值越低的,interrupt coalescence 越不容易发生,latency 越小,相应的,cpu 负载也会越大。如果增加了 rx-usecs,对于 bulk traffic 会比较好,但是会对 tcp 的性能造成大的损失,可以通过调大 TSO window divisor(默认为 3) 来弥补:

  1. net.ipv4.tcp_tso_win_divisor = 30
  2. 前提需要开启 tso:
  3. # ethtool -K eth2 tso on

PS:此处对于网卡影响较大,根据网友脚本测试,如果这个值设置的不正确,万兆网卡还跑不到500兆。

关于万兆网卡的优化还会涉及TCP窗口大小,巨型帧问题,CPU硬终端,软中断,CPU绑定问题,寨卡问题,模块和网卡不对应问题,累了后续有时间在写。

PS:
对于所有情况开启RX/TX中的checksum只有好处没有坏处。
如果看到rx_no_buffer_count 就是ring buffer小了
如果看到tx_deferred_ok表示传输被延迟了,不算是error
如果看到rx_missed_errors,rx_fw_discards表示这个包满了,多出去的全部被丢掉了

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注