1. 问题背景
在一些需要实时响应的小包应用场景下,网卡的时延性能尤为重要,下面分享一些常见的网卡低时延优化措施。
2. 优化措施
2.1. 绑核
将网卡和应用绑定在同一个numa
中。
可以查看下网口对应的numa
在哪个节点中。
# cat /sys/class/net/enp3s0/device/numa_node
0
如上所示,网口enp3s0
绑定在numa0
上。
下面举例通过命令将网卡、应用绑定在同一个numa
上。
2.1.1. 网卡绑核
-
关闭
IRQ balancer
service irqbalance stop
-
查询网络设备所占用的
IRQ
# cat /proc/interrupts | grep enp3s0 | awk -F ':' '{print $1}'
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
-
根据中断号,把中断绑在对应
numa
的core
下
echo 0 > /proc/irq/390/smp_affinity_list
echo 1 > /proc/irq/391/smp_affinity_list
echo 2 > /proc/irq/392/smp_affinity_list
echo 3 > /proc/irq/393/smp_affinity_list
echo 4 > /proc/irq/394/smp_affinity_list
echo 5 > /proc/irq/395/smp_affinity_list
echo 6 > /proc/irq/396/smp_affinity_list
echo 7 > /proc/irq/397/smp_affinity_list
echo 8 > /proc/irq/398/smp_affinity_list
echo 9 > /proc/irq/399/smp_affinity_list
echo 10 > /proc/irq/400/smp_affinity_list
echo 11 > /proc/irq/401/smp_affinity_list
echo 12 > /proc/irq/402/smp_affinity_list
echo 13 > /proc/irq/403/smp_affinity_list
echo 14 > /proc/irq/404/smp_affinity_list
echo 15 > /proc/irq/405/smp_affinity_list
P.S. 上述操作需要root权限
可以通过如下命令确认下是否绑核成功
# for i in `cat /proc/interrupts |grep -i enp3s0 | cut -d : -f1`; do cat /proc/irq/${i}/smp_affinity_list; done
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.1.2. 应用绑核
例如,可将测试程序绑定在16-23
核上
taskset -c 16-23 ./perf_test arg_list
2.2. 网卡中断相关参数修改
2.2.1. 关闭中断聚合
ethtool ‐C <ethX> adaptive‐rx off
ethtool –C <ethX> rx‐usecs 0
2.2.2. 关闭LRO
LRO
功能:large-receive-offload,将接收到的多个TCP数据聚合成一个大的数据包,然后传递给网络协议栈处理。在时延要求较高的场景,可以考虑将此功能关闭:
查看:ethtool -k <网卡名称>
设置:ethtool -K <网卡名称> lro off
P.S. 如果中断聚合已经关闭了,那么启用LRO
与否都无影响。
2.2.3. 关闭服务器的IP
转发
如果服务器上不需要IP转发,那么可以关掉。
sysctl ‐w net.ipv4.conf.default.forwarding=0
2.2.4. 适当减小队列深度
网卡硬件队列深度:过小影响收发性能,过大则影响cache命中,需要结合实际业务场景调整。
一般默认为1024
,在在时延要求较高的场景,可以考虑队列深度适当降低些。
查看:ethtool -g <网卡名称>
设置:ethtool -G <网卡名称> rx <M> tx <N>
2.2.5. 打开TSO功能
TSO
:tcp-segmentation-offload
利用网卡对TCP数据包分片,减轻CPU负荷
当CPU
负载较高的时候,可以考虑将其打开。
查看:ethtool -k <网卡名称>
设置:ethtool -K <网卡名称> tso on
2.2.6. 禁用tuned
服务
systemctl stop tuned
systemctl disable tuned
2.2.7. 启用busy_poll功能
设置busy_poll
为非零值,启用busy_poll功能。
sysctl net.core.busy_poll=50 && sysctl net.core.busy_read=50
3. 总结
-
充分利用网卡能力
-
充分利用内核特性
-
关闭对时延造成影响的系统服务