【问题标题】:Comparing application performance between CPU architectures比较 CPU 架构之间的应用程序性能
【发布时间】:2020-10-12 07:39:03
【问题描述】:

我有一个基于 Java Servlet 的应用程序在 Apache Tomcat 上运行在两台不同的机器上,它们具有相似的硬件(RAM、SSD 磁盘、网络接口和带宽)但 CPU 架构不同:

  • x86_64
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  2
Core(s) per socket:  4
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               85
Model name:          Intel(R) Xeon(R) Gold 6266C CPU @ 3.00GHz
Stepping:            7
CPU MHz:             3000.000
BogoMIPS:            6000.00
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            1024K
L3 cache:            30976K
NUMA node0 CPU(s):   0-7
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni md_clear flush_l1d arch_capabilities
  • aarch64
Architecture:        aarch64
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  1
Core(s) per socket:  8
Socket(s):           1
NUMA node(s):        1
Vendor ID:           0x48
Model:               0
Stepping:            0x1
BogoMIPS:            200.00
L1d cache:           64K
L1i cache:           64K
L2 cache:            512K
L3 cache:            32768K
NUMA node0 CPU(s):   0-7
Flags:               fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm

我曾使用 Yourkit、JProfiler 和 Async Profiler 等工具分析 Java 应用程序的 CPU 和内存使用情况。而且我想我已经在我们的应用程序中发现了所有明显的与性能相关的问题。使用 Apache JMeter (5.3.0) 我创建了一个模拟真实案例加载的测试计划:9000 个虚拟用户导航应用程序,包括思考时间、加速时间等。两台机器的 JMeter 报告看起来非常相似——毕竟通过这个 JMeter 计划,我能够达到每秒 1200 个请求。如果我增加虚拟用户的数量或减少思考时间,那么 JMeter 会开始报告主要与超时相关的错误(连接和读取超时)。

所以我决定使用wrk。有了它,客户端机器(运行负载测试客户端的机器)使用更少的资源,我能够获得更好的吞吐量:

  • 在 x86_64 机器上执行时大约 40000 个请求/秒
  • 在 aarch64 机器上执行时大约 20000 个请求/秒

现在,我的问题是:如何找出使 x86_64 机器的性能比 aarch64 高两倍的原因?你会使用什么样的工具来找出不同之处?

我尝试过使用perf 工具,但到目前为止我还不能真正掌握如何阅读和解释它的记录。

我肯定知道这不是网络带宽,因为使用iperf 我可以获得 5.48 Gbits/sec,而wrk 最多达到 220 MBit/sec(根据nload)。如果我没记错的话,这大约比最大吞吐量低 5 倍。

所有机器都在 Ubuntu 18.04.4 上运行

【问题讨论】:

    标签: jmeter x86-64 performance-testing arm64 wrk


    【解决方案1】:

    查看自己的 CPU 信息:

    • x64 -BogoMIPS: 6000.00
    • aarch64 - BogoMIPS: 200.00

    根据Wikipedia:

    BogoMips(来自“bogus”和 MIPS)是 CPU 速度的粗略测量 由 Linux 内核在启动以校准内部 busy-loop.1 一个经常被引用的术语定义是“ 每秒百万次,处理器绝对无能为力”

    这与CPU频率有关,所以我的预期是ARM处理器的实际频率要低得多。您可以使用sar 工具或JMeter PerfMon Plugin 来检查两个系统指标(CPU、RAM、Swap 等),这样您就可以确定 ARM 系统的瓶颈是什么。

    在工具选择方面,JMeter 比 wrk 更“重”,但由于支持CookiesCache,使用嵌入式资源(解析响应并自动下载图像)我们也更强大、脚本、样式等)

    【讨论】:

    • BogoMIPS 跨完全不同架构的比率几乎可以肯定地告诉我们任何关于实际时钟速度比率的信息,或其他任何信息。和/或 ARM 可能由于与在 VM 中运行相关的某种原因而人为地降低,或者以不同的方式扩展。 (那个古老的维基百科定义不准确;空循环每秒 60 亿次迭代对于 x86 CPU 来说是不正确的;它不能加速到 6GHz。对于 AArch64 来说,2 亿次/秒是难以置信的低可以在云中使用,除非它的空闲时钟速度非常低。)
    • 我预计 AArch64 云 VM 实例可能在 CPU 满负载情况下时钟频率高达 1.5 到 2.5 GHz 的硬件上运行,而 Xeon Gold 6266C 的 [持续频率为 3GHz,最大-3.2GHz 的核心涡轮增压]en.wikipedia.org/wiki/…)。 Xeon 也可能有更多的乱序执行资源和/或更大或更快的缓存。根据您对 BogoMIPS 的幼稚解释,200MHz 的 8 核 AArch64 可以以 6GHz 的 8 核 Cascade Lake 的一半速度运行,这并不合理。
    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2022-01-18
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多