
【摘要】本文通过参数调优与测试,验证在 AIX 平台上万兆网卡的 Packets Per Second (PPS) 极限性能;预计完成优化后,能满足绝大多数业务负载对网络PPS的要求。
【作者】陈炽卉/冯健/李松青 - 浪潮商用机器技术支持部
导言
万兆网卡在当前数据中心环境中使用已经非常普遍。千兆网卡时代,通常网络的主要瓶颈是网卡带宽。而在万兆网卡时代,网络瓶颈往往是每秒钟处理包数,即Packets Per Second (PPS)。尤其是常见的OLTP负载,通常是小数据包为主,对于这类场景,在达到万兆网卡带宽瓶颈之前,往往可能已经达到PPS瓶颈了。
PPS瓶颈主要受限于目前TCP/IP协议栈的实现方式,根本性的优化方向主要是:
采用polling轮询机制代替中断机制进行数据包处理;
减少内核态操作,将网络数据包直接交付到应用层。
基于这两种优化思路目前市场上已经有一些技术和产品,但相对而言实施复杂度会有明显增加。
本文通过参数调优与测试,验证在 AIX 平台上万兆网卡的 Packets Per Second (PPS) 极限性能;预计完成优化后,能满足绝大多数业务负载对网络PPS的要求。从本案例中的测试结果看,#EN0S网卡在仅使用单万兆口的情况下,能达到至少280万 PPS的性能指标;在使用EtherChannel的情况下,能达到380 PPS。而#EN16网卡在仅使用单万兆口的情况下,能达到206万 PPS。
本文中的测试主要使用netperf工具完成。同时也使用某厂商的分布式应用进行了验证,得到的网络PPS指标与netperf基本一致。
测试环境
共有 3 个客户端以及服务端(本机)采用 #EN0S 卡;还有 2 个客户端采用的 PCIe 一代卡,如下:
测试拓扑为简单的 client/server 模式,共 211 、 213 、 215 、 222 、 223 五个客户端通过 netperf ,与 212 服务端(本机)的 netserver 通信。收发包大小均为 200 字节。
#!/bin/ksh93#if [ $1 -gt 0 ]; thenTHREAD=$1elseTHREAD=1fin=0while ((n<$THREAD))donohup 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 网卡示例:
修改:(注意需要针对物理网卡进行查询修改,而不是针对 EC 聚合网卡修改)
#chdev -l ent1 -a queues_rx=7 -a queues_tx=7 |
查询:
查询网卡中断号
PCIe 一代卡或更早期的网卡的中断号可以直接通过 lsattr 查询到。而 PCIe 二代或以上网卡通常只在 lsattr 中显示基础中断号,实际运行环境中使用的中断号需要通过 entstat 查询。而且如果删除网卡重新配置的话,重配后使用的中断号可能会略有差异,需要注意相应调整绑定命令。
# 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 0 上不要绑中断,原因是在CPU 0进行中断绑定后,无法使用命令直接解除绑定;
建议使用每个物理 CPU 的第一个逻辑 CPU进行绑定,例如 4, 8, 12.. ( 当前为 SMT 4时)
查看绑定结果
可以对相应中断号进行查询,例如30753号中断查询结果如下:
如何去除绑定
使用-u参数可以去除绑定:
查询中断统计
可以看到,网络中断主要发生在 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
考虑关闭 Spectre/Meltdown 补丁
根据 POWER8 的 rPerf 分值估算,Spectre/Meltdown补丁的性能影响大约是5-7% ;但系统出现网络瓶颈,尤其是 PPS 极高的场景,影响可能超过此值。
由于 POWER9 各机型默认激活了该补丁,在网络瓶颈场景下性能影响可能会比较明显。建议在 ASMI 上关闭此 firmware 补丁(选红色框,即Speculative execution fully enabled),如下图 ( 注意,该修改必须在下电的情况下才能进行 ) :

如果 firmware 不含有 Spectre/Meltdown 补丁,则 AIX 补丁不起作用;
AIX 7.2 环境,使用 lparstat –x 可以查看当前的预测执行安全级别;
EtherChannel 配置兼容性建议
在 AIX 上建议的 EtherChannel 配置模式为 802.3ad, Hash Mode 采用 src_dst_port . 具体如下:

其他注意事项
1. 网卡尽量放在系统节点上,使用性能较高的 PCIe 插槽,具体放置规则需要查看相关机型的红皮书以及 knowledge center ;
例如 E980 + EN0T :

EN0T 的放置槽位优先级 :
从观察看 , EN0T 放置在 Slot 1 网络性能要优于 Slot 8.

2. 网卡 PPS 极限性能对内存延迟敏感,因此分区规模不是越大越好,可以参考 K1 Power System 的 DPO功能对分区资源分布进行优化(相关文档请自行搜索K1 Power DPO 手册) ;
3. 许多用户习惯性在 AIX 主机上设置 no 参数 tcp_nodelayack=1, 这样将使得 AIX 主机对所有收到的包马上回送一个消息体为空的 ACK 应答;这种做法通常只有性能损失而没有收益,只在少部分存在异构系统兼容性问题时可能有帮助。
在正常的 OLTP TCP 通信场景中, Request/Response 通常是成对出现的,因此 ACK 应答通常可以捎带在 Response 消息中(称之为 piggybacked ACK ),而不必单独发送,这样可以提高有效数据包的比例。因此,请确保 tcp_nodelayack 取值为 0 ,即:
#no -p -d tcp_nodelayack |
在 tcp_nodelayack 取值为 0 的情况下,系统会尽量尝试在正常的数据包 ( 业务回包 ) 中捎带 ACK 应答;如果短时间没有业务回包,则最长不超过 200 毫秒(由系统 fast timer 控制,可以通过 no 参数调整),系统会主动回复 ACK。
测试数据
EN0S 网卡性能测试结果
测试客户端 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 网卡性能测试结果
使用 EN16 网卡之后性能为 200 万 PPS 。数据如下:


本测试中系统尚有一定空余 CPU , topas 、 nmon 响应都正常,统计数据接近。
附录
使用某厂家的分布式应用对 #EN0S 的场景进行了验证,得到了类似 netperf 的 PPS 极限值:


2019 年 12 月 update
在 POWER9环境上搭建环境进行了类似测试, 2 个 EN0S 做 Etherchannel,测试结果为380 万 PPS :

觉得本文有用,请转发或点击“在看”,让更多同行看到。




