1、环境搭建
被测机与压力机直连,网卡安装好驱动,配置相同网段IP,被测机与压力机OS内安装好相同版本iperf/iperf3软件。
关闭防火墙:systemctl stop firewalld
禁用防火墙:systemctl disable firewalld
服务端:iperf3 -s -B 10.10.10.1
客户端:iperf3 -c 10.10.10.1 -i 2 -t 60 -P n
说明:UDP测试需要加 -u 选项,UDP默认带宽1 Mbit/sec,加-b 0参数将不会限制带宽
2 调优思路
一般服务器网卡调优可以从几个方面优化,硬件PCIEX16或者X8,BIOS设置,具体应用,OS层面,内核层面
2.1、BIOS设置调优
2.1.1 服务器开启高性能模式
Performance
2.1.2 PCIE Max Payload Size大小配置(鲲鹏)
128B修改为256B/512B
说明:网卡自带的内存和CPU使用的内存进行数据传递时,是通过PCIE总线进行数据搬运的。Max Payload Size为每次传输数据的最大单位(以字节为单位),它的大小与PCIE链路的传送效率成正比,该参数越大,PCIE链路带宽的利用率越高。
2.2、NIC硬件缓冲区或循环缓冲区调优
2.2.1开启网卡巨帧,减少数据分片数量
ip link set dev eth0 mtu 9000
ifconfig eth0 txqueuelen 2000 //在高速网络中可以调大
2.2.2 server端和client端同时打开TCP数据段卸载功能
ethtool -K eth0 tso on
ethtool -K eth0 gro on //gro克服了lro的缺点,后续驱动都是用gro
说明:开启之后将由网卡进行TCP数据分片,TSO是作用在发送端网卡对TCP数据包进行分片,GRO是作用在接收端网卡对接收到的TCP数据包进行聚合动作。
2.2.3 调整rx和tx的ring buffer大小
ethtool -C eth0 adaptive-rx off adaptive-tx off //关闭自适应调节
ethtool -G eth0 rx 8192 tx 8192 //数值依照实际修改
说明:对于大吞吐量场景可以适当调大
2.2.4 调整中断聚合参数
ethtool -C eth0 rx-usecs N rx-frames N tx-usecs N tx-frames N
说明:建议对吞吐量要求高的场景,可以将rx-usecs和rx-frames的值设置较大;对延时要求高的场景,rx-usecs和rx-frames的值设置较小
2.3、硬中断和软中断队列调优
2.3.1进程绑核
systemctl stop irqbanlance
cat /sys/class/net/eth0/device/numa_node
taskset -c cpu iperf3 xxx
numactl --cpunodebind=netdev:eth0 --membind=netdev:eth0 iperf3 xxx
说明:taskset绑核只能绑定CPU[1] ,numactl绑核,这种方法可以将iperf进程同时绑定在网卡所在的node和最近的内存中。
2.3.2 中断绑核
设置网卡多队列
ethtool -L eth0 combined n
查看网卡所在的numa节点
cat /sys/class/net/eth0/device/numa_node
查看网卡中断号
一般网卡:cat /proc/interrupts |grep eth0 |awk -F: '{print $1}'
mlx: cat /proc/interrupts| grep -E ${bus} | awk -F ':' '{print $1}' //bus为网卡的bus-info
将中断号绑定到网卡所在CPU上
echo cpu-num > /proc/irq/中断号/smp_affinity_list
2.4、应用程序和socket以及内核参数调优
2.4.1 Linux系统性能修改为低延迟网络策略
tuned-adm profile network-latency
2.4.2 cpu频率策略改为性能模式
cpupower frequency-set -g performance
2.4.3 调整跑的iperf线程数,不断调整达到最优 (-P 选项)
iperf3 xxx -P n
2.4.4 内核参数调优
net.core.rmem_default = 212992: 每一个TCP socket默认的用于TCP接收的数据缓存大小
net.core.rmem_max = 212992:每一个TCP socket最大的接收数据缓的最大缓存
net.core.wmem_default = 212992:每一个TCP socket默认的用于TCP发送数据的缓存大小
net.core.wmem_max = 212992:每一个TCP socket最大的用于数据发送的缓存
以上值都偏小,可以适当按倍数调整(x10),UDP则修改UDP对应的缓冲参数
sysctl -w net.core.netdev_budget=600 增加软中断处理时间
net.ipv4.tcp_rmem TCP连接的读缓存
net.ipv4.tcp_wmem TCP连接的写缓存
内核参数还有很多,不同情况下效果不同,还需要读者自己摸索