我有一个基于 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 req/s
- 对 aarch64 机器执行时大约 20000 req/s
现在,我的问题是:如何找出使 x86_64 机器的性能比 aarch64 高两倍的原因?你会使用什么样的工具来找出不同之处?
我已经尝试过使用perf工具,但到目前为止我还不能真正掌握如何阅读和解释它的记录。
我确定的一件事是它不是网络带宽,因为使用iperf我可以获得 5.48 Gbits/sec,而wrk
最多达到 220 MBit/sec(根据nload)。如果我没记错的话,这大约比最大吞吐量低 5 倍。
所有机器都在 Ubuntu 18.04.4 上运行