陈炽卉
冯健
李松青
2019-12-15
万兆网卡在当前数据中心环境中使用已经非常普遍。千兆网卡时代,通常网络的主要瓶颈是网卡带宽。而在万兆网卡时代,网络瓶颈往往是每秒钟处理包数,即Packets Per Second (PPS)。尤其是常见的OLTP负载,通常是小数据包为主,对于这类场景,在达到万兆网卡带宽瓶颈之前,往往可能已经达到PPS瓶颈了。
PPS瓶颈主要受限于目前TCP/IP协议栈的实现方式,根本性的优化方向主要是:
本文通过参数调优与测试,验证在 AIX 平台上万兆网卡的 Packets Per Second (PPS) 极限性能;预计完成优化后,能满足绝大多数业务负载对网络PPS的要求。从本案例中的测试结果看,#EN0S网卡在仅使用单万兆口的情况下,能达到至少280万 PPS的性能指标;在使用EtherChannel的情况下,能达到380 PPS。而#EN16网卡在仅使用单万兆口的情况下,能达到206万 PPS。
本文中的测试主要使用netperf工具完成。同时也使用某厂商的分布式应用进行了验证,得到的网络PPS指标与netperf基本一致。
硬件配置:
Number Of Processors: 12
Processor Clock Speed: 4190 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
LPAR Info: 3 netcli01.26.212
Memory Size: 81920 MB
Good Memory Size: 81920 MB
Platform Firmware level: SC860_056
Firmware Version: FW860.10 (SC860_056)
Console Login: enable
Auto Restart: true
Full Core: false
NX Crypto Acceleration: Capable and Enabled
网卡:
# lscfg -vpl ent1
ent1 U78CD.001.FZHC336-P1-C1-T1 PCIe2 4-Port Adapter (10GbE SFP+) (e4148a1614109304)
PCIe2 4-Port (10GbE SFP+ & 1GbE RJ45) Adapter:
FRU Number..................00E2715
EC Level....................D77452
Customer Card ID Number.....2CC3
Part Number.................00E2719
Feature Code/Marketing ID...EN0S
Serial Number...............Y250NY67FJUH
Manufacture ID..............98BE9468AB28
Network Address.............98BE9468AB28
ROM Level.(alterable).......30100150
Hardware Location Code......U78CD.001.FZHC336-P1-C1-T1
PLATFORM SPECIFIC
Name: ethernet
Node: ethernet@0
Device Type: network
Physical Location: U78CD.001.FZHC336-P1-C1-T1
共有 3 个客户端以及服务端(本机)采用 #EN0S 卡;还有 2 个客户端采用的 PCIe 一代卡,如下:
# lscfg -vpl ent0
ent0 U497B.001.DBJS863-P2-C8-T1 Int Multifunction Card w/ SR Optical 10GbE (a219100714100904)
Int Multifunction Card w/ SR Optical 10GbE:
Network Address.............E41F13D7595C
ROM Level.(alterable).......0400003260003
Hardware Location Code......U497B.001.DBJS863-P2-C8-T1
PLATFORM SPECIFIC
Name: ethernet
Node: ethernet@0
Device Type: network
Physical Location: U497B.001.DBJS863-P2-C8-T1
测试拓扑为简单的 client/server 模式,共 211 、 213 、 215 、 222 、 223 五个客户端通过 netperf ,与 212 服务端(本机)的 netserver 通信。收发包大小均为 200 字节。
测试脚本:
#!/bin/ksh93
#
if [ $1 -gt 0 ]; then
THREAD=$1
else
THREAD=1
fi
n=0
while ((n<$THREAD))
do
nohup netperf -t TCP_RR -l 7200 -H 192.168.26.212 -- -r 200,200 &
((n++))
done
网卡的接收队列(并发中断数)设置是非常关键的并发控制因素,此设置直接影响系统 kernel CPU 使用率与发包速率。
不同的万兆网卡支持的并发中断数不同,举 #EN0S 为例,最大支持的并发中断数 (queues_rx) 为 7 。
可以使用如下命令,将 #EN0S 收发队列均改为最大值 (7) 。
注意不同型号的网卡其收发队列属性名称、最大值也不同,可以通过 lsattr -Rl entX -a queues_rx 查询取值范围;此处的queues_rx应当替换为实际查询到的队列属性名。例如:
\#EN0S 网卡示例:
#lsattr -Rl ent0 -a queues_rx
1...7 (+1)
vnic 网卡示例:
注意,在 vnic 环境中队列数名称为 rx_que_num ,
#lsattr -Rl ent0 -a rx_que_num
1...16 (+1)
修改:(注意需要针对物理网卡进行查询修改,而不是针对 EC 聚合网卡修改)
#chdev -l ent1 -a queues_rx=7 -a queues_tx=7
查询:
# lsattr -El ent1|grep queues
queues_mgt 1 Requested number of management queues False
queues_rx 7 Requested number of Rx queues True
queues_tx 7 Requested number of Tx queues True
如果需要达到网卡极限性能,可以考虑进行中断绑定。中断绑定的方法如下。
PCIe 一代卡或更早期的网卡的中断号可以直接通过 lsattr 查询到。而 PCIe 二代或以上网卡通常只在 lsattr 中显示基础中断号,实际运行环境中使用的中断号需要通过 entstat 查询。而且如果删除网卡重新配置的话,重配后使用的中断号可能会略有差异,需要注意相应调整绑定命令。
# lsattr -El entX
adapter_type ethernet Adapter Type False
alt_addr 0x000000000000 Alternate Ethernet address True
bar0 0xa3800000 Bus memory address 0 False
bar1 0xa3000000 Bus memory address 1 False
bar2 0xa4130000 Bus memory address 2 False
busintr 30752 Bus interrupt level False
…
#entstat -d
…
Assigned Interrupt Source Numbers:
30752 MGT
30753 NIC TX,RX
30754 NIC TX,RX
30755 NIC TX,RX
30756 NIC TX,RX
30757 NIC TX,RX
30758 NIC TX,RX
30759 NIC TX,RX
# smtctl
This system is SMT capable.
This system supports up to 4 SMT threads per processor.
SMT is currently enabled.
SMT boot mode is not set.
SMT threads are bound to the same physical processor.
proc0 has 4 SMT threads.
Bind processor 0 is bound with proc0
Bind processor 1 is bound with proc0
Bind processor 2 is bound with proc0
Bind processor 3 is bound with proc0
proc4 has 4 SMT threads.
Bind processor 4 is bound with proc4
Bind processor 5 is bound with proc4
Bind processor 6 is bound with proc4
Bind processor 7 is bound with proc4
proc8 has 4 SMT threads.
Bind processor 8 is bound with proc8
Bind processor 9 is bound with proc8
Bind processor 10 is bound with proc8
Bind processor 11 is bound with proc8
...
建议使用每个物理 CPU 的第一个逻辑 CPU进行绑定,例如 4, 8, 12.. ( 当前为 SMT 4时)
bindintcpu 30753 4 #NIC TX,RX
bindintcpu 30754 8 #NIC TX,RX
bindintcpu 30755 12 #NIC TX,RX
bindintcpu 30756 16 #NIC TX,RX
bindintcpu 30757 20 #NIC TX,RX
bindintcpu 30758 24 #NIC TX,RX
bindintcpu 30759 28 #NIC TX,RX
可以对相应中断号进行查询,例如30753号中断查询结果如下:
# bindintcpu -q 30753
Interrupt level 30753 is bound to cpu(s): 4
使用-u参数可以去除绑定:
# bindintcpu -u 30753
# bindintcpu -q 30753
Interrupt level 30753 is unbound
# vmstat -i
priority level type count module(handler)
0 2 hardware 35397 i_mpc_int_handler(2bd3b80.16)
0 589825 hardware 0 /usr/lib/drivers/planar_pal_chrp(4216248.16)
1 655360 hardware 0 /usr/lib/drivers/vconsdd(c01fd460.16)
3 30752 hardware 948 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30753 hardware 25891343 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30754 hardware 40320368 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30755 hardware 54025973 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30756 hardware 25172777 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30757 hardware 37041591 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30758 hardware 36470087 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 30759 hardware 41979320 /usr/lib/drivers/pci/shientdd(47bf4f0.16)
3 655362 hardware 485284 /usr/lib/drivers/vioentdd(4510710.16)
3 655382 hardware 30709 /usr/lib/drivers/vscsi_initdd(c01589b0.16)
可以看到,网络中断主要发生在 30753~30759 共 7 个中断号上。
在 AIX 7.2 TL3 SP3 以及后续版本,调整 schedo 参数 krlock_enable ,可以防止 特定场景下 出现 锁争用 时 kernel 自旋 (spin) 过多。 此调整可以有效降低 kernel CPU 使用率, 7.2TL4 以后该调整已改为默认设置:
#schedo -p -o krlock_enable=1
注意,该参数在更早的版本中也存在,但因为没有包含下面列出的补丁,不升级系统到7.2TL3SP3或后续版本就直接修改不会有效果。
如果按上文提高了网卡收发队列数,则此项参数强烈建议设置,否则可能造成系统CPU消耗上升。
相关补丁:
Fix krlock issues
IJ12449 latency on drw_lock_done by write owner
IJ12456 schedo changes for drw_lock_read krlock spin
RAS / tuning- around krlocks
IJ12451 splat not reporting krlock activity correctly
# schedo -h krlock_enable
Help for tunable krlock_enable:
Purpose:
krlock bitwise options
1-enabled(any other bit enables too)
2-limit to one owner
4-do not skip CPUs with pending interrupts
8-allow up to three shared owners
16-enable krlock spinning on DRW locks.
Values:
Default: 1
Range: 0 - 31
Type: Dynamic
Unit: numeric
Tuning:
This parameter is mutually exclusive with fast_locks.
根据 POWER8 的 rPerf 分值估算,Spectre/Meltdown补丁的性能影响大约是 5-7% ;但系统出现网络瓶颈,尤其是 PPS 极高的场景,影响可能超过此值。
由于 POWER9 各机型默认激活了该补丁,在网络瓶颈场景下性能影响可能会比较明显。建议在 ASMI 上关闭此 firmware 补丁(选红色框,即Speculative execution fully enabled),如下图 ( 注意该修改必须在下电的情况下才能进行 ) :
如果 firmware 不含有 Spectre/Meltdown 补丁,则 AIX 补丁不起作用;
AIX 7.2 环境,使用 lparstat –x 可以查看当前的预测执行安全级别;
# lparstat -x
LPAR Speculative Execution Mode : 0
说明:
默认值为 2 ,表示同时 enable meltdown 和 spectre 补丁;
取值为 1 表示仅打开 meltdown 补丁;
取值为0表示不启用补丁(推荐值);
在 AIX 上建议的 EtherChannel 配置模式为 802.3ad, Hash Mode 采用 src_dst_port . 具体如下:
例如 E980 + EN0T :
https://www.ibm.com/support/knowledgecenter/9080-M9S/p9eab/p9eab_980_slot_details.htm
EN0T 的放置槽位优先级 :
从观察看 , EN0T 放置在 Slot 1 网络性能要优于 Slot 8.
#no -p -d tcp_nodelayack
在 tcp_nodelayack 取值为 0 的情况下,系统会尽量尝试在正常的数据包 ( 业务回包 ) 中捎带 ACK 应答;如果短时间没有业务回包,则最长不超过 200 毫秒(由系统 fast timer 控制,可以通过 no 参数调整),系统会主动回复 ACK.
测试客户端 211 、 213 、 215 与测试服务端(本机) 212 分区 CPU 与网卡配置基本相同,各启动 100 个 netperf 实例;
测试客户端 222 、 223 为 16C 780C 分区 +PCIe 一代网卡,各启动 60 个 netperf 实例;
客户端与服务端各网卡收发队列均调整至最大值,网卡中断绑定、 affinity 调整均调整完毕的情况下,最终性能如下:
netstat 统计结果:
nmon 统计结果 :
由于统计工具不同,在系统压力极大的情况下,命令响应时间受到了一定影响,统计数据有少许偏差。其中 topas 统计结果偏大,为 320 万 PPS ;而 netstat 与 nmon 统计结果接近,为 280 万 PPS 。
统计结果的差异与统计命令实际采用的时间间隔精度有关, topas 最为常用,但 netstat 与 nmon 的结果应该更接近实际值。
使用 EN16 网卡之后性能为 200 万 PPS 。数据如下:
本测试中系统尚有一定空余 CPU , topas 、 nmon 响应都正常,统计数据接近。
使用某厂家的分布式应用对 #EN0S 的场景进行了验证,得到了类似 netperf 的 PPS 极限值:
在 POWER9环境上搭建环境进行了类似测试, 2 个 EN0S 做 Etherchannel,测试结果为380 万 PPS :
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞5
添加新评论0 条评论