前言
前面编译安装好了包含有fastsocket的内核模块,以及fastsocket的动态链接库libfsocket.so,下面其实就可以设置网卡了。
下面为一些名词解释,上下文中需要使用到:
本文网卡设置笔记内容,大部分来自于fastsocket源码相对路径fastsocket/scripts/
;老规矩,先翻译。
网卡设置篇翻译原文
介绍
nic.sh
脚本负责网卡配置以尽可能的最大化受益于fastsocket带来的问题。给定一个网卡接口, 它调整接口的各种特性以及一些系统配置。
相关配置
中断和CPU的亲和性
每个网卡硬件队列及其关联中断绑定到不同的CPU核心。若硬件队列数大于CPU核数,队列需要配置成循环round-robin方式, Irqbalance服务需要被禁用以防其更改配置。
中断阀速率
nic.sh
脚本通过ethtool
命令设置每秒中断数上限,防止中断风暴。两个Rx中断间隔设置成至少333us,约3000个中断每秒。
RPS
为每个CPU核心与不同的网卡硬件队列之间建立一一映射对应关系,这样CPU核心就可以很均匀地处理网络数据包。当网卡硬件队列小于CPU内核数,nic.sh
脚本利用RPS (Receive Packet Steering)软件方式平衡进入流量负载,这样CPU和硬件队列不存在对应关系。RPS机制可以让进入的数据包自由分发到任一CPU核上。
网卡接收产生的中断可以均衡分配到对应CPU上。
XPS
XPS (Transmit Packet Steering) 建立CPU内核和Tx发送队列映射对应关系,掌控出站数据包。系统有N个CPU核心,脚本会设置XPS至少存在N个Tx队列在网卡接口上,这样就可以建立CPU内核和Tx队列1对1的映射关系。
网卡传送数据产生的中断一样可以均很分配到CPU上,避免单个CPU核心过于繁忙。
IPTABLES
压测时,防火墙iptables的规则会占用更多的CPU周期,有所降低网络堆栈性能。因此nic.sh
脚本若检测到iptables后台运行中会直接输出报警信息,提示关闭之。
nic.sh
脚本脚本分析
经过验证好用的Intel和博通系列千兆和万兆网卡列表:
# igb
"Intel Corporation 82576 Gigabit Network Connection (rev 01)"
"Intel Corporation I350 Gigabit Network Connection (rev 01)"
# ixgbe
"Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)"
"Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)"
# tg3
"Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe"
"Broadcom Corporation NetXtreme BCM5761 Gigabit Ethernet PCIe (rev 10)"
# bnx2
"Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet (rev 12)"
"Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)"
若当前服务器没有以上网卡,会警告一下,无碍。
这里把一些常规性的CPU、网卡驱动、网络队列情况检查单独抽取出来,重温好多已经遗忘的命令,有改变,这样写较简单嘛,便于以后使用:
- 直接查看CPU核数:
grep -c processor /proc/cpuinfo
- 查看网卡软接收队列数:
ls /sys/class/net/eth0/queues | grep -c rx
- 查看网卡软发生队列数:
ls /sys/class/net/eth0/queues | grep -c tx
- 查看当前网卡硬件队列数:
egrep -c eth0 /proc/interrupts
- 查看网卡名称和版本号:
lspci | grep Ethernet | sed "s/Ethernet controller: //g"
- 查看网卡驱动名称:
ethtool -i eth0 | grep driver
脚本先是获取CPU、网卡等信息,接着设置中断单位秒内吞吐量: ethtool -C eth0 rx-usecs 333 > /dev/null 2>&1
启用XPS,充分借助网卡发送队列,提升网卡发送吞吐量,是有条件限制的,发送队列数要大于CPU核数:
if [[ $TX_QUEUES -ge $CORES ]]; then
for i in $(seq 0 $((CORES-1))); do
cpuid_to_mask $((i%CORES)) | xargs -i echo {} > /sys/class/net/$IFACE/queues/tx-$i/xps_cpus
done
info_msg " XPS enabled"
fi
接着判断是否可以启用PRS,省去手动设置的麻烦,但启用RPS前提是CPU核数与网卡硬件队列不相等:
if [[ ! $HW_QUEUES == $CORES ]]; then
for i in /sys/class/net/$IFACE/queues/rx-*; do
printf "%x\n" $((2**CORES-1)) | xargs -i echo {} > $i/rps_cpus;
done
info_msg " RPS enabled"
else
for i in /sys/class/net/$IFACE/queues/rx-*; do
echo 0 > $i/rps_cpus;
done
info_msg " RPS disabled"
fi
若没有使用fastsocket,单纯借助于RPS,会带来处理中断的CPU和处理当前数据包的CPU不是同一个,自然会造成CPU Cache Miss(CPU缓存丢失),造成少许的性能影响,为了避免这种情况,人们会依赖于RFS(Receive Flow Steering)。
使用了fastsocket后,就不用这么麻烦了。
irqbalance和fastsocket有冲突,会强制禁用:
if ps aux | grep irqbalance | grep -v grep; then
info_msg "Disable irqbalance..."
# XXX Do we have a more moderate way to do this?
killall irqbalance > /dev/null 2>&1
fi
脚本也包含了设置中断和CPU的亲和性:
i=0
intr_list $IFACE $DRIVER | while read irq; do
cpuid_to_mask $((i%CORES)) | xargs -i echo {} > /proc/irq/$irq/smp_affinity
i=$((i+1))
done
若iptables服务存在,会友善建议禁用会好一些,毕竟会带来性能损耗。文件打开句柄不大于1024,脚本同样会提醒,怎么设置文件打开句柄,可以参考以前博文。
Linux系统网络堆栈的常规扩展优化措施
针对不使用fastsocket的服务器,当前比较流行的针对网卡的网络堆栈性能扩展、优化措施,一般会使用到RSS、RPS、RFS、XFS等方式,以便充分利用CPU多核和硬件网卡等自身性能,达到并行/并发处理的目的。下面总结一个表格,可以凑合看一下。
|
RSS (Receive Side Scaling) |
RPS (Receive Packet Steering) |
RFS (Receive Flow Steering) |
Accelerated RFS (Accelerated Receive Flow Steering) |
XPS (Transmit Packet Steering) |
解决问题 |
网卡和驱动支持 |
软件方式实现RSS |
数据包产生的中断和应用处理在同一个CPU上 |
基于RFS硬件加速的负载平衡机制 |
智能选择网卡多队列的队列快速发包 |
内核支持 |
2.6.36开始引入,需要硬件支持 |
2.6.35 |
2.6.35 |
2.6.35 |
2.6.38 |
建议 |
网卡队列数和物理核数一直 |
至此多队列的网卡若RSS已经配置了,则不需要RPS了 |
需要rps_sock_flow_entries和rps_flow_cnt属性 |
需要网卡设备和驱动都支持加速。并且要求ntuple过滤已经通过ethtool启用 |
单传输队列的网卡无效,若队列比CPU少,共享指定队列的CPU最好是与处理传输硬中断的CPU共享缓存的CPU |
fastsocket |
网卡特性 |
改进版RPS,性能提升 |
源码包含,文档没有涉及 |
文档没有涉及 |
要求发送队列数要大于CPU核数 |
传送方向 |
网卡接收 |
内核接收 |
CPU接收处理 |
加速并接收 |
网卡发送数据 |
更具体优化措施,可以参考文档:Scaling in the Linux Networking Stack。
另,若网卡支持Flow Director Filters
特性(这里有一个非常有趣的动画介绍,Intel® Ethernet Flow Director,值得一看),那么可以结合Fastsocket一起加速。比如,在其所作Redis长连接测试中,启用Flow-Director特性要比禁用可以带来25%的性能提升。
自然软硬结合,可以做的更好一些嘛。
延伸阅读:多队列网卡简介
小结
以上记录了学习fastsocket的网卡设置脚本方面笔记。
不过呢,nic.sh
脚本,值得收藏,无论使不使用fastsocket,对线上服务器网卡调优都是不错选择哦。