我发现了一个ARM64平台上的CPU性能下降问题。最新版本的go语言中的并行json基准测试与旧版本1.15相比,导致了50%以上的CPU使用率增加。
在ARM64上可以很容易地重现这个问题:
- 安装golang包
- 下载go-jsonbench:https://github.com/kpango/go-json-bench
cd go-json-bench && make bench
并观察CPU使用情况
我的机器配置:
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 128
On-line CPU(s) list: 0-127
Vendor ID: HiSilicon
BIOS Vendor ID: HiSilicon
Model name: Kunpeng-920
BIOS Model name: Kunpeng 920-6426
Model: 0
Thread(s) per core: 1
Core(s) per socket: 64
Socket(s): 2
Stepping: 0x1
Frequency boost: disabled
CPU max MHz: 2600.0000
CPU min MHz: 200.0000
BogoMIPS: 200.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm
Caches (sum of all):
L1d: 8 MiB (128 instances)
L1i: 8 MiB (128 instances)
L2: 64 MiB (128 instances)
L3: 128 MiB (4 instances)
NUMA:
NUMA node(s): 4
NUMA node0 CPU(s): 0-31
NUMA node1 CPU(s): 32-63
NUMA node2 CPU(s): 64-95
NUMA node3 CPU(s): 96-127
基准测试结果如下:
对于go 1.15.7,CPU使用率为大约2000%:
对于最新版本的go,CPU使用率为大约3000%:
最后,通过git bisect
搜索,我发现fe7ff71185cf是导致性能下降的第一个提交,但我不清楚为什么这个提交会对CPU性能产生如此大的影响。
7条答案
按热度按时间cclgggtu1#
你能展示使用benchstat的基准结果吗?基准执行时间是否发生变化?谢谢。
6g8kf2rb2#
Could you show the benchmark results using benchstat format? Does the benchmark execution time change? Thanks.
The benchmark result for go 1.15.7:
The benchmark result for go latest version:
The benchmark execution time change using by benchstat:
sg2wtvxw3#
有人能帮忙解释一下这个问题吗?
46scxncf4#
cc @golang/arm @golang/compiler
o2rvlv0m5#
我的测试结果与你的略有不同。
go1.15: 1697%
tip go: 2294%
我没有深入研究为什么CPU利用率如此之高,但测试数据看起来合理?
我的测试机器与你的有些不同。
q3qa4bjr6#
我的测试结果与你的略有不同。
go1.15: 1697%
tip go: 2294%
我没有深入研究为什么CPU利用率如此之高,但测试数据看起来合理?
我的测试机器与你的有些不同。
也许你可以在提交之前尝试使用git checkout再次进行测试 runtime: add consistent heap statistics
结果是CPU利用率较低,但性能与tip go几乎相同。
nqwrtyyt7#
ping @erifan