不同CPU性能大PK
前言
比较Hygon7280、Intel、AMD、鲲鹏920、飞腾2500的性能情况
CPU型号 | Hygon 7280 | AMD 7H12 | AMD 7T83 | Intel 8163 | 鲲鹏920 | 飞腾2500 | 倚天710 |
---|---|---|---|---|---|---|---|
物理核数 | 32 | 32 | 64 | 24 | 48 | 64 | 128core |
超线程 | 2 | 2 | 2 | 2 | |||
路 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
NUMA Node | 8 | 2 | 4 | 2 | 4 | 16 | 2 |
L1d | 32K | 32K | 32K | 32K | 64K | 32K | 64K |
L2 | 512K | 512K | 512K | 1024K | 512K | 2048K | 1024K |
AMD 7T83 有8个Die, 每个Die L3大小 32M,L2 大小4MiB, 每个Die上 L1I/L1D 各256KiB,每个Die有8core,2、3代都是带有独立 IO Die
倚天710是一路服务器,单芯片2块对称的 Die
参与比较的几款CPU参数
IPC的说明:
IPC: insns per cycle insn/cycles 也就是每个时钟周期能执行的指令数量,越大程序跑的越快
程序的执行时间 = 指令数/(主频*IPC) //单核下,多核的话再除以核数
Hygon 7280
Hygon 7280 就是AMD Zen架构,最大IPC能到5.
1 | 架构: x86_64 |
架构说明:
每个CPU有4个Die,每个Die有两个CCX(2 core-Complexes),每个CCX最多有4core(例如7280/7285)共享一个L3 cache;每个Die有两个Memory Channel,每个CPU带有8个Memory Channel,并且每个Memory Channel最多支持2根Memory;
海光7系列架构图:
曙光H620-G30A 机型硬件结构,CPU是hygon 7280(截图只截取了Socket0)
AMD EPYC 7T83(NC)
两路服务器,4 numa node,Z3架构
详细信息:
1 | #lscpu |
L3是8个物理核,16个超线程共享,相当于单核2MB,一块CPU有8个L3,总共是256MB
1 | #cat cpu0/cache/index3/shared_cpu_list |
L1D、L1I各为 2MiB,单物理核为32KB
空跑nop的IPC为6(有点吓人)
1 | #perf stat ./cpu/test |
sysbench 测试7T83 比7H12 略好,可能是ECS、OS等带来的差异。
测试环境:4.19.91-011.ali4000.alios7.x86_64,5.7.34-log MySQL Community Server (GPL)
测试核数 | AMD EPYC 7H12 2.5G(QPS、IPC) | 说明 |
---|---|---|
单核 | 24363 0.58 | CPU跑满 |
一对HT | 33519 0.40 | CPU跑满 |
2物理核(0-1) | 48423 0.57 | CPU跑满 |
2物理核(0,32) 跨node | 46232 0.55 | CPU跑满 |
2物理核(0,64) 跨socket | 45072 0.52 | CPU跑满 |
4物理核(0-3) | 97759 0.58 | CPU跑满 |
16物理核(0-15) | 367992 0.55 | CPU跑满,sys占比20%,si 10% |
32物理核(0-31) | 686998 0.51 | CPU跑满,sys占比20%, si 12% |
64物理核(0-63) | 1161079 0.50 | CPU跑到95%以上,sys占比20%, si 12% |
64物理核(0-31,64-95) | 964441 0.49 | socket2上的32核一直比较闲,数据无参考意义 |
64物理核(0-31,64-95) | 1147846 0.48 | 重启mysqld,立即绑核,sysbench 在32-63上,导致0-31的CPU只能跑到89% |
说明,压测过程动态通过taskset绑核,所以会有数据残留其它核的cache问题
跨socket taskset绑核的时候要压很久任务才会跨socket迁移过去,也就是刚taskset后CPU是跑不满的
1 | #numastat -p 437803 |
AMD EPYC 7H12(ECS)
AMD EPYC 7H12 64-Core(ECS,非物理机),最大IPC能到5.
1 | lscpu |
AMD EPYC 7T83 ECS
1 | [root@bugu88 cpu0]# cd /sys/devices/system/cpu/cpu0 |
stream:
1 | [root@bugu88 lmbench-master]# for i in $(seq 0 15); do echo $i; numactl -C $i -m 0 ./bin/stream -W 5 -N 5 -M 64M; done |
Intel 8163
这次对比测试的Intel 8163 CPU信息如下,最大IPC 是4:
1 | lscpu |
不同 intel 型号的差异
如下图是8269CY和E5-2682上跑的MySQL在相同业务、相同流量下的差异:
CPU使用率差异(下图8051C是E5-2682,其它是 8269CY,主频也有30%的差异)
鲲鹏920
1 | [root@ARM 19:15 /root/lmbench3] |
飞腾2500
飞腾2500用nop去跑IPC的话,只能到1,但是跑其它代码能到2.33
1 | lscpu |
其它
2Die,2node
1 | #lscpu |
单核以及HT计算Prime性能比较
以上两款CPU但从物理上的指标来看似乎AMD要好很多,从工艺上AMD也要领先一代(2年),从单核参数上来说是2.0 VS 2.5GHz,但是IPC 是5 VS 4,算下来理想的单核性能刚好一致(2*5=2.5 *4)。
从外面的一些跑分结果显示也是AMD 要好,但是实际性能怎么样呢?
测试命令,这个测试命令无论在哪个CPU下,用2个物理核用时都是一个物理核的一半,所以这个计算是可以完全并行的
1 | taskset -c 1 /usr/bin/sysbench --num-threads=1 --test=cpu --cpu-max-prime=50000 run //单核用一个threads,绑核; HT用2个threads,绑一对HT |
测试结果为耗时,单位秒
测试项 | AMD EPYC 7H12 2.5G CentOS 7.9 | Hygon 7280 2.1GHz CentOS | Hygon 7280 2.1GHz 麒麟 | Intel 8269 2.50G | Intel 8163 CPU @ 2.50GHz | Intel E5-2682 v4 @ 2.50GHz |
---|---|---|---|---|---|---|
单核 prime 50000 耗时 | 59秒 IPC 0.56 | 77秒 IPC 0.55 | 89秒 IPC 0.56; | 83 0.41 | 105秒 IPC 0.41 | 109秒 IPC 0.39 |
HT prime 50000 耗时 | 57秒 IPC 0.31 | 74秒 IPC 0.29 | 87秒 IPC 0.29 | 48 0.35 | 60秒 IPC 0.36 | 74秒 IPC 0.29 |
相同CPU下的 指令数 基本= 耗时 * IPC * 核数
以上测试结果显示Hygon 7280单核计算能力是要强过Intel 8163的,但是超线程在这个场景下太不给力,相当于没有。
当然上面的计算Prime太单纯了,代表不了复杂的业务场景,所以接下来用MySQL的查询场景来看看。
如果是arm芯片在计算prime上明显要好过x86,猜测是除法取余指令上有优化
1 | #taskset -c 11 sysbench cpu --threads=1 --events=50000 run |
测试结果为10秒钟的event
测试项 | FT2500 2.1G | 鲲鹏920-4826 2.6GHz | Intel 8163 CPU @ 2.50GHz | Hygon C86 7280 2.1GHz | AMD 7T83 |
---|---|---|---|---|---|
单核 prime 10秒 events | 21626 IPC 0.89 | 30299 IPC 1.01 | 8435 IPC 0.41 | 10349 IPC 0.63 | 40112 IPC 1.38 |
对比MySQL sysbench和tpcc性能
分别将MySQL 5.7.34社区版部署到intel+AliOS以及hygon 7280+CentOS上,将mysqld绑定到单核,一样的压力配置均将CPU跑到100%,然后用sysbench测试点查, HT表示将mysqld绑定到一对HT核。
sysbench点查
测试命令类似如下:
1 | sysbench --test='/usr/share/doc/sysbench/tests/db/select.lua' --oltp_tables_count=1 --report-interval=1 --oltp-table-size=10000000 --mysql-port=3307 --mysql-db=sysbench_single --mysql-user=root --mysql-password='Bj6f9g96!@#' --max-requests=0 --oltp_skip_trx=on --oltp_auto_inc=on --oltp_range_size=5 --mysql-table-engine=innodb --rand-init=on --max-time=300 --mysql-host=x86.51 --num-threads=4 run |
测试结果(测试中的差异AMD、Hygon CPU跑在CentOS7.9, intel CPU、Kunpeng 920 跑在AliOS上, xdb表示用集团的xdb替换社区的MySQL Server, 麒麟是国产OS):
测试核数 | AMD EPYC 7H12 2.5G | Hygon 7280 2.1G | Hygon 7280 2.1GHz 麒麟 | Intel 8269 2.50G | Intel 8163 2.50G | Intel 8163 2.50G XDB5.7 | 鲲鹏 920-4826 2.6G | 鲲鹏 920-4826 2.6G XDB8.0 | FT2500 alisql 8.0 本地–socket |
---|---|---|---|---|---|---|---|---|---|
单核 | 24674 0.54 | 13441 0.46 | 10236 0.39 | 28208 0.75 | 25474 0.84 | 29376 0.89 | 9694 0.49 | 8301 0.46 | 3602 0.53 |
一对HT | 36157 0.42 | 21747 0.38 | 19417 0.37 | 36754 0.49 | 35894 0.6 | 40601 0.65 | 无HT | 无HT | 无HT |
4物理核 | 94132 0.52 | 49822 0.46 | 38033 0.37 | 90434 0.69 350% | 87254 0.73 | 106472 0.83 | 34686 0.42 | 28407 0.39 | 14232 0.53 |
16物理核 | 325409 0.48 | 171630 0.38 | 134980 0.34 | 371718 0.69 1500% | 332967 0.72 | 446290 0.85 //16核比4核好! | 116122 0.35 | 94697 0.33 | 59199 0.6 8core:31210 0.59 |
32物理核 | 542192 0.43 | 298716 0.37 | 255586 0.33 | 642548 0.64 2700% | 588318 0.67 | 598637 0.81 CPU 2400% | 228601 0.36 | 177424 0.32 | 114020 0.65 |
- 麒麟OS下CPU很难跑满,大致能跑到90%-95%左右,麒麟上装的社区版MySQL-5.7.29;飞腾要特别注意mysqld所在socket,同时以上飞腾数据都是走–sock压测所得,32core走网络压测QPS为:99496(15%的网络损耗)[^说明]
Mysqld 二进制代码所在 page cache带来的性能影响
如果是飞腾跨socket影响很大,mysqld二进制跨socket性能会下降30%以上
对于鲲鹏920,双路服务器上测试,mysqld绑在node0, 但是分别将mysqld二进制load进不同的node上的page cache,然后执行点查
mysqld | node0 | node1 | node2 | node3 |
---|---|---|---|---|
QPS | 190120 IPC 0.40 | 182518 IPC 0.39 | 189046 IPC 0.40 | 186533 IPC 0.40 |
以上数据可以看出这里node0到node1还是很慢的,居然比跨socket还慢,反过来说鲲鹏跨socket性能很好
绑定mysqld到不同node的page cache操作
1 | #systemctl stop mysql-server |
网卡以及node距离带来的性能差异
在鲲鹏920+mysql5.7+alios,将内存分配锁在node0上,然后分别绑核在1、24、48、72core,进行sysbench点查对比
Core1 | Core24 | Core48 | Core72 | |
---|---|---|---|---|
QPS | 10800 | 10400 | 7700 | 7700 |
以上测试的时候业务进程分配的内存全限制在node0上(下面的网卡中断测试也是同样内存结构)
1 | #/root/numa-maps-summary.pl </proc/123853/numa_maps |
对比测试,将内存锁在node3上,重复进行以上测试结果如下:
Core1 | Core24 | Core48 | Core72 | |
---|---|---|---|---|
QPS | 10500 | 10000 | 8100 | 8000 |
1 | #/root/numa-maps-summary.pl </proc/54478/numa_maps |
机器上网卡eth1插在node0上,由以上两组对比测试发现网卡影响比内存跨node影响更大,网卡影响有20%。而内存的影响基本看不到(就近好那么一点点,但是不明显,只能解释为cache命中率很高了)
此时软中断都在node0上,如果将软中断绑定到node3上,第72core的QPS能提升到8500,并且非常稳定。同时core0的QPS下降到10000附近。
网卡软中断以及网卡远近的测试结论
测试机器只是用了一块网卡,网卡插在node0上。
一般网卡中断会占用一些CPU,如果把网卡中断挪到其它node的core上,在鲲鹏920上测试,业务跑在node3(使用全部24core),网卡中断分别在node0和node3,QPS分别是:179000 VS 175000 (此时把中断放到node0或者是和node3最近的node2上差别不大)
如果将业务跑在node0上(全部24core),网卡中断分别在node0和node1上得到的QPS分别是:204000 VS 212000
tpcc 1000仓
测试结果(测试中Hygon 7280分别跑在CentOS7.9和麒麟上, 鲲鹏/intel CPU 跑在AliOS、麒麟是国产OS):
tpcc测试数据,结果为1000仓,tpmC (NewOrders) ,未标注CPU 则为跑满了
测试核数 | Intel 8269 2.50G | Intel 8163 2.50G | Hygon 7280 2.1GHz 麒麟 | Hygon 7280 2.1G CentOS 7.9 | 鲲鹏 920-4826 2.6G | 鲲鹏 920-4826 2.6G XDB8.0 |
---|---|---|---|---|---|---|
1物理核 | 12392 | 9902 | 4706 | 7011 | 6619 | 4653 |
一对HT | 17892 | 15324 | 8950 | 11778 | 无HT | 无HT |
4物理核 | 51525 | 40877 | 19387 380% | 30046 | 23959 | 20101 |
8物理核 | 100792 | 81799 | 39664 750% | 60086 | 42368 | 40572 |
16物理核 | 160798 抖动 | 140488 CPU抖动 | 75013 1400% | 106419 1300-1550% | 70581 1200% | 79844 |
24物理核 | 188051 | 164757 1600-2100% | 100841 1800-2000% | 130815 1600-2100% | 88204 1600% | 115355 |
32物理核 | 195292 | 185171 2000-2500% | 116071 1900-2400% | 142746 1800-2400% | 102089 1900% | 143567 |
48物理核 | 19969l | 195730 2100-2600% | 128188 2100-2800% | 149782 2000-2700% | 116374 2500% | 206055 4500% |
tpcc并发到一定程度后主要是锁导致性能上不去,所以超多核意义不大。
如果在Hygon 7280 2.1GHz 麒麟上起两个MySQLD实例,每个实例各绑定32物理core,性能刚好翻倍:
测试过程CPU均跑满(未跑满的话会标注出来),IPC跑不起来性能就必然低,超线程虽然总性能好了但是会导致IPC降低(参考前面的公式)。可以看到对本来IPC比较低的场景,启用超线程后一般对性能会提升更大一些。
CPU核数增加到32核后,MySQL社区版性能追平xdb, 此时sysbench使用120线程压性能较好(AMD得240线程压)
32核的时候对比下MySQL 社区版在Hygon7280和Intel 8163下的表现:
三款CPU的性能指标
测试项 | AMD EPYC 7H12 2.5G | Hygon 7280 2.1GHz | Intel 8163 CPU @ 2.50GHz |
---|---|---|---|
内存带宽(MiB/s) | 12190.50 | 6206.06 | 7474.45 |
内存延时(遍历很大一个数组) | 0.334ms | 0.336ms | 0.429ms |
在lmbench上的测试数据
stream主要用于测试带宽,对应的时延是在带宽跑满情况下的带宽。
lat_mem_rd用来测试操作不同数据大小的时延。总的来说带宽看stream、时延看lat_mem_rd
飞腾2500
用stream测试带宽和latency,可以看到带宽随着numa距离不断减少、对应的latency不断增加,到最近的numa node有10%的损耗,这个损耗和numactl给出的距离完全一致。跨socket访问内存latency是node内的3倍,带宽是三分之一,但是socket1性能和socket0性能完全一致
1 | time for i in $(seq 7 8 128); do echo $i; numactl -C $i -m 0 ./bin/stream -W 5 -N 5 -M 64M; done |
Lat_mem_rd 用cpu7访问node0和node15对比结果,随着数据的加大,延时在加大,64M时能有3倍差距,和上面测试一致
下图 第一列 表示读写数据的大小(单位M),第二列表示访问延时(单位纳秒),一般可以看到在L1/L2/L3 cache大小的地方延时会有跳跃,远超过L3大小后,延时就是内存延时了
1 | numactl -C 7 -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M //-C 7 cpu 7, -m 0 node0, -W 热身 -t stride |
同样的机型,开关numa的测试结果,关numa 时延、带宽都差了几倍
关闭numa的机器上测试结果随机性很强,这应该是和内存分配在那里有关系,不过如果机器一直保持这个状态反复测试的话,快的core一直快,慢的core一直慢,这是因为物理地址分配有一定的规律,在物理内存没怎么变化的情况下,快的core恰好分到的内存比较近。
同时不同机器状态(内存使用率)测试结果也不一样
鲲鹏920
1 | #for i in $(seq 0 15); do echo core:$i; numactl -N $i -m 7 ./bin/stream -W 5 -N 5 -M 64M; done |
海光7280
可以看到跨numa(一个numa也就是一个socket,等同于跨socket)RT从1.5上升到2.5,这个数据比鲲鹏920要好很多
1 | [root@hygon8 14:32 /root/lmbench-master] |
如果这种芯片在bios里设置Die interleaving,4块die当成一个numa node吐出来给OS
1 | #lscpu |
Die Interleaving 控制是否使能DIE交织。使能DIE交织能充分利用系统的DDR带宽,并尽量保证各DDR通道的带宽均衡,提升DDR的利用率
hygon5280测试数据
1 | -----hygon5280测试数据 |
intel 8269CY
1 | lscpu |
Intel(R) Xeon(R) CPU E5-2682 v4
1 | #time for i in $(seq 0 8 51); do echo $i; numactl -C $i -m 0 ./bin/stream -W 5 -N 5 -M 64M; done |
AMD EPYC 7T83
1 | #time for i in $(seq 0 8 255); do echo $i; numactl -C $i -m 0 ./bin/stream -W 5 -N 5 -M 64M; done |
stream对比数据
总结下几个CPU用stream测试访问内存的RT以及抖动和带宽对比数据,重点关注带宽,这个测试中时延不重要
最小RT | 最大RT | 最大copy bandwidth | 最小copy bandwidth | |
---|---|---|---|---|
申威3231(2numa node) | 7.09 | 8.75 | 2256.59 MB/sec | 1827.88 MB/sec |
飞腾2500(16 numa node) | 2.84 | 10.34 | 5638.21 MB/sec | 1546.68 MB/sec |
鲲鹏920(4 numa node) | 1.84 | 3.87 | 8700.75 MB/sec | 4131.81 MB/sec |
海光7280(8 numa node) | 1.38 | 2.58 | 11591.48 MB/sec | 6206.99 MB/sec |
海光5280(4 numa node) | 1.22 | 2.52 | 13166.34 MB/sec | 6357.71 MB/sec |
Intel8269CY(2 numa node) | 1.12 | 1.52 | 14293.68 MB/sec | 10551.71 MB/sec |
Intel E5-2682(2 numa node) | 1.58 | 2.02 | 10092.31 MB/sec | 7914.25 MB/sec |
AMD EPYC 7T83(4 numa node) | 0.49 | 1.39 | 32561.30 MB/sec | 11512.93 MB/sec |
Y | 1.83 | 3.48 | 8764.72 MB/sec | 4593.25 MB/sec |
从以上数据可以看出这5款CPU性能一款比一款好,飞腾2500慢的core上延时快到intel 8269的10倍了,平均延时5倍以上了。延时数据基本和单核上测试sysbench TPS一致。性能差不多就是:常数*主频/RT
lat_mem_rd对比数据
用不同的node上的core 跑lat_mem_rd测试访问node0内存的RT,只取最大64M的时延,时延和node距离完全一致
RT变化 | |
---|---|
飞腾2500(16 numa node) | core:0 149.976 core:8 168.805 core:16 191.415 core:24 178.283 core:32 170.814 core:40 185.699 core:48 212.281 core:56 202.479 core:64 426.176 core:72 444.367 core:80 465.894 core:88 452.245 core:96 448.352 core:104 460.603 core:112 485.989 core:120 490.402 |
鲲鹏920(4 numa node) | core:0 117.323 core:24 135.337 core:48 197.782 core:72 219.416 |
海光7280(8 numa node) | numa0 106.839 numa1 168.583 numa2 163.925 numa3 163.690 numa4 289.628 numa5 288.632 numa6 236.615 numa7 291.880 分割行 enabled die interleaving core:0 153.005 core:16 152.458 core:32 272.057 core:48 269.441 |
海光5280(4 numa node) | core:0 102.574 core:8 160.989 core:16 286.850 core:24 231.197 |
海光7260(1 numa node) | core:0 265 |
Intel 8269CY(2 numa node) | core:0 69.792 core:26 93.107 |
Intel 8163(2 NUMA node) | core:0 68.785 core:24 100.314 |
Intel 8163(1 NUMA node) | core:0 100.652 core:24 67.925 //内存没有做交织 |
申威3231(2numa node) | core:0 215.146 core:32 282.443 |
AMD EPYC 7T83(4 numa node) | core:0 71.656 core:32 80.129 core:64 131.334 core:96 129.563 |
Y7(2Die,2node,1socket) | core:8 42.395 core:40 36.434 core:104 105.745 core:88 124.384 core:24 62.979 core:8 69.324 core:64 137.233 core:88 127.250 133ns 205ns (待测) |
测试命令:
1 | for i in $(seq 0 8 127); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1 |
测试结果和numactl -H 看到的node distance完全一致,芯片厂家应该就是这样测试然后把这个延迟当做距离写进去了
AMD EPYC 7T83(4 numa node)的时延相对抖动有点大,这和架构多个小Die合并成一块CPU有关
1 | #grep -E "core|64.00000" lat.log |
AMD EPYC 7T83(4 numa node)比Intel 8269时延要大,但是带宽也高很多
bios numa on/off
NUMA 参数:
BIOS ON | BIOS OFF | |
---|---|---|
cmdline numa=on(默认值) | NUMA 开启,内存在Node内做交织,就近有快慢之分 | bios 关闭后numa后,OS层面完全不知道下层的结构,默认全局内存做交织,时延是个平均值 |
cmdline numa=off | 交织关闭,效果同上 | 同上 |
测试在bios中开关numa,以及在OS 启动参数里设置 numa=on/off 这四种组合来对比内存时延的差异
测试CPU型号如下:
1 | Model name: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz |
测试命令以及测试结果
1 | for i in $(seq 0 24 95); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1 |
结论:在OS 启动引导参数里设置 numa=off 完全没有必要、也不能起作用,反而设置了 numa=off 只能是掩耳盗铃,让用户看不到numa结构
为什么是平均值,而不是短板效应的最慢值?
测试软件只能通过大规模数据的读写来测试获取一个平均值,所以当一大块内存读取时,虽然通过交织大块内存被切分到了快慢物理内存上,但是因为规模大慢的被平均掉了。
bios=on 同时 cmdline off时
再用Intel 的 mlc 验证下,这个结果有点意思,latency稳定在 145 而不是81 和 145两个值随机出现,应该是mlc默认选到了0核,对应这个测试数据:
1 | //从下面两种测试来看,bios层面 on后,不管OS 层面是否on,都不会跨node 做交织,抖动存在 |
对应的mlc
1 | #./mlc |
两个值都为on 时的mlc 测试结果
1 | #./mlc |
说明:mlc和 lmbench 测试结果不一样,mlc 时81和145,lmbench测试是68和100,这是两种测试方法的差异而已,但是快慢差距基本是一致的
龙芯测试数据
3A5000为龙芯,执行的命令为./lat_mem_rd 128M 4096,其中 4096 参数为跳步大小。其基本原理是,通过按 给定间隔去循环读一定大小的内存区域,测量每个读平均的时间。如果区域大小小于 L1 Cache 大 小,时间应该接近 L1 的访问延迟;如果大于 L1 小于 L2,则接近 L2 访问延迟;依此类推。图中横坐 标为访问的字节数,纵坐标为访存的拍数(cycles)。
基于跳步访问的 3A5000 和 Zen1、Skylake 各级延迟的比较(cycles)
下图给出了 LMbench 测试得到的访存操作的并发性,执行的命令为./par_mem。访存操作的并 发性是各级 Cache 和内存所支持并发访问的能力。在 LMbench 中,访存操作并发性的测试是设计一 个链表,不断地遍历访问下一个链表中的元素,链表所跳的距离和需要测量的 Cache 容量相关,在 一段时间能并发的发起对链表的追逐操作,也就是同时很多链表在遍历,如果发现这一段时间内 能同时完成 N 个链表的追逐操作,就认为访存的并发操作是 N。
下图列出了三款处理器的功能部件操作延迟数据,使用的命令是./lat_ops。
龙芯stream数据
LMbench 包含了 STREAM 带宽测试工具,可以用来测试可持续的内存访问带宽情况。图表12.25列 出了三款处理器的 STREAM 带宽数据,其中 STREAM 数组大小设置为 1 亿个元素,采用 OpenMP 版本 同时运行四个线程来测试满载带宽;相应测试平台均为 CPU 的两个内存控制器各接一根内存条, 3A5000 和 Zen1 用 DDR4 3200 内存条,Skylake 用 DDR4 2400 内存条(它最高只支持这个规格)。
从数据可以看到,虽然硬件上 3A5000 和 Zen1 都实现了 DDR4 3200,但 3A5000 的实测可持续带宽 还是有一定差距。用户程序看到的内存带宽不仅仅和内存的物理频率有关系,也和处理器内部的 各种访存队列、内存控制器的调度策略、预取器和内存时序参数设置等相关,需要进行更多分析 来定位具体的瓶颈点。像 STREAM 这样的软件测试工具,能够更好地反映某个子系统的综合能力, 因而被广泛采用。
对比结论
- AMD单核跑分数据比较好
- MySQL 查询场景下Intel的性能好很多
- xdb比社区版性能要好
- MySQL8.0比5.7在多核锁竞争场景下性能要好
- intel最好,AMD接近Intel,海光差的比较远但是又比鲲鹏好很多,飞腾最差,尤其是跨socket简直是灾难
- 麒麟OS性能也比CentOS略差一些
- 从perf指标来看 鲲鹏920的L1d命中率高于8163是因为鲲鹏L1 size大;L2命中率低于8163,同样是因为鲲鹏 L2 size小;同样L1i 鲲鹏也大于8163,但是实际跑起来L1i Miss Rate更高,这说明 ARM对 L1d 使用效率低
整体来说AMD用领先了一代的工艺(7nm VS 14nm),在MySQL查询场景中终于可以接近Intel了,但是海光、鲲鹏、飞腾还是不给力。
附表
鲲鹏920 和 8163 在 MySQL 场景下的 perf 指标对比
整体对比 | |||
---|---|---|---|
指标 | X86 | ARM | 增加幅度 |
IPC | 0.4979 | 0.495 | -0.6% |
Branchs | 237606414772 | 415979894985 | 75.1% |
Branch-misses | 8104247620 | 28983836845 | 257.6% |
Branch-missed rate | 0.034 | 0.070 | 104.3% |
内存读带宽(GB/S) | 25.0 | 25.0 | -0.2% |
内存写带宽(GB/S) | 24.6 | 67.8 | 175.5% |
内存读写带宽(GB/S) | 49.7 | 92.8 | 86.8% |
UNALIGNED_ACCESS | 1329146645 | 13686011901 | 929.7% |
L1d_MISS_RATIO | 0.06055 | 0.04281 | -29.3% |
L1d_MISS_RATE | 0.01645 | 0.01711 | 4.0% |
L2_MISS_RATIO | 0.34824 | 0.47162 | 35.4% |
L2_MISS_RATE | 0.00577 | 0.03493 | 504.8% |
L1_ITLB_MISS_RATE | 0.0028 | 0.005 | 78.6% |
L1_DTLB_MISS_RATE | 0.0025 | 0.0102 | 308.0% |
context-switchs | 8407195 | 11614981 | 38.2% |
Pagefault | 228371 | 741189 | 224.6% |
参考资料
[CPU 性能和Cache Line](/2021/05/16/CPU Cache Line 和性能/)
[Perf IPC以及CPU性能](/2021/05/16/Perf IPC以及CPU利用率/)
[Intel PAUSE指令变化是如何影响自旋锁以及MySQL的性能的](/2019/12/16/Intel PAUSE指令变化是如何影响自旋锁以及MySQL的性能的/)
comment:
Intel 8163 IPC是0.67,和在PostgreSQL下测得数据基本一致。Oracle可以达到更高的IPC。从8163的perf结果中,看不出来访存在总周期中的占比。可以添加几个cycle_activity.cycles_l1d_miss、cycle_activity.stalls_mem_any,看看访存耗用的周期占比。