Fastsocket学习笔记之网卡设置篇

Fastsocket学习笔记之网卡设置篇

前言

前面编译安装好了包含有fastsocket的内核模块,以及fastsocket的动态链接库libfsocket.so,下面其实就可以设置网卡了。

下面为一些名词解释,上下文中需要使用到:

  • Rx:接收队列
  • Tx:发送队列

本文网卡设置笔记内容,大部分来自于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,对线上服务器网卡调优都是不错选择哦。

你可能感兴趣的:(Fastsocket学习笔记之网卡设置篇)