RH 6.2 关闭 gro

先了解几个术语。
tso(tcp segmentation offload)
利用网卡分割大数据包,减小 CPU 负荷的一种技术。这个需要硬件的支持。
gso(generic segmentation offload)
将 tso 的技术一般化,通过 gso 的技术实现。比 tso 更通用,不需要硬件的分片就可以实现。

lro(large receive offload)
它通过将多个 TCP 数据聚合在一个 skb 结构,在稍后的某个时刻作为一个大数据包交付给上层的网络协议栈,以减少上层协议栈处理 skb 的开销,提高系统接收 TCP 数据包的能力。
gro(generic receive offload)
lro 有不少问题,后续的驱动,都应该使用 GRO 的接口,而不是 LRO。

详细的解释可以看看这个文档,从 TSO 到 GSO,从 LRO 到 GRO。

6.2 的机器如果部署有 LVS,需要关闭 gro,否则其性能会异常的低:
# ethtool  -k em1
Offload parameters for em1:
rx-checksumming: off
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off

# ethtool -K eth0 gro off

6.2 版本之前由于有 bug,无法在 ETHTOOL_OPTS 里面加上多个参数。包括 6.2 在内的以后的版本可以直接在 /etc/sysconfig/network-scripts/ifcfg-em1 里面指定:
ETHTOOL_OPTS="-K ${DEVICE} tso on; -G ${DEVICE} rx 256 tx 128"

而对于 6.2 之前的,方法有二:
1. 将 ethtool 放到 rc.local 里面,但此时如果使用 service network restar 就无法生效了
2. 建立  /sbin/ifup-local 文件,将需要操作的脚本写到这个里面,并将其可执行