@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处理。
[root@centos-tjo5tnu8 ~]# lspci -s 84:00.0 -vvv | grep Width
LnkCap: Port #0, Speed 5GT/s, Width x8, ASPM L0s, Latency L0 unlimited, L1 <8us
LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
ethtool -S eth10 //查看网卡队列情况
cat /proc/interrupts | grep eth10 //查看实际运行的网卡工作的队列数
针对ethtool参数
rx_no_buffer_count
问题,默认情况下系统是开启RSS的,如果rx_fifo_errors , rx_no_buffer_count
都不为0,说明是上层内核处理能力不足导致(如果是内核处理能力不足导致,需要考虑使用DPDK)。如果禁用RSS情况下,rx_fifo_errors , rx_no_buffer_count
增加是正常的,因为只有一个核心处理软中断,关键看 rx_missed_errors 频度是否有相应的大增。
如果是单纯rx_no_buffer_count
比较大,考虑ring buffer大小要增加,ethtool -g eth10
查看rx的大小,可以通过命令ethtool -G eth0 rx 2048
将RX增加到2048,产生这个错误的原因有很多,例如总线带宽不够,主机不能响应(可以通过flow-control控制),PBA buffer太小等等
针对ring buffer问题
有两种丢包,一种是网卡层面的丢包(通过ifconfig就可以查看懂啊),一种协议栈丢包,网卡丢包和ring buffer
有关,但并不是buffer越大越好,针对流媒体服务器就是一个反面特殊例子。buffer少会降低延迟但是会导致丢包,buffer多会带来高吞吐量,所以调整buffer需要权衡延迟和吞吐量。对于调整rx,tx没有一个优化标准,需要根据不同使用环境进行不断测试。
PS:ethtool -G eth10 rx 2048
并不是调整buffer大小,而是调整buffer的数量。
interrupt coalescing问题
当网卡收到一个帧时,不会立刻对系统产生中断,而是等一段时间,收集到更多的数据包之后再对系统请求中断。这会降低CPU的负载,但是会产生网络延迟,要查看当前的coalescing,通过命令ethtool -c eth10 | grep "rx-usecs"
interrupt coalescence也会叫interrupt Moderation, Interrupt Blanking, Interrupt Throttling。
在ixgbe网卡的参数列表里可以看到:parm:InterruptThrottleRate:Maximum interrupts per second, per vector, (0,1,956-488281), default 1 (array of int)
可以使用下边的命令修改当前值:
ethtool -C eth10 rx-usecs 0
rx-usecs 会同时控制 tx 以及 rx 方向的 coalescing。值越低的,interrupt coalescence 越不容易发生,latency 越小,相应的,cpu 负载也会越大。如果增加了 rx-usecs,对于 bulk traffic 会比较好,但是会对 tcp 的性能造成大的损失,可以通过调大 TSO window divisor(默认为 3) 来弥补:
net.ipv4.tcp_tso_win_divisor = 30
前提需要开启 tso:
# 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表示这个包满了,多出去的全部被丢掉了