0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在AArch64平台上性能下降的例子

Linux阅码场 来源:openEuler 作者:吴言 2021-09-09 11:11 次阅读

编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 JVM 参数,应用性能在不同的平台中表现相差 30%,x86 远好于 AArch64 平台。本文分析了一个应用在 AArch64 平台上性能下降的例子,发现 JVM 的 CodeCache 大小是引起这个性能问题的根源,进而研究什么导致了不同平台上 CodeCache 大小的不同。最后笔者给出了不同平台中该如何设置参数规避该问题。希望本文能给读者一些启示:当使用不同的硬件平台时需要关注底层硬件对于上层应用的影响。

业务在 x86 和 AArch64 上同时部署时(相同的 JDK 和 Java 应用版本),发现 AArch64 平台性能下降严重问题。进一步查看日志,发现在 AArch64 平台中偶有如下情况:

这代表 JVM 中的 CodeCache 满了,导致编译停止,未编译的方法只能解释执行,进而严重影响应用性能。那什么是 CodeCache?

CodeCache 是什么

简单来说,CodeCache 用于存放编译后的方法,主要分为三部分:

Non-nmethods:包括运行时 Stub,Adapter 等;

Profiled nmethod:包括会采集信息的方法,即分层编译中第 2、3 层的方法;

Non-Profiled nmethods:包括不采集信息的方法,即分层编译中第 1、4 层的方法,也包括 JNI 的方法。

注:分层编译指的是 JVM 同时存在 C1 和 C2 两种编译器,C1 做一些简单的编译优化,耗时较短,C2 做更多复杂的编译优化,性能较好,编译耗时较多。分层编译的触发在 JVM 内会根据相应的条件进行触发,关于更多分层编译相关知识可以参考相关资料 [1]。

在 JDK 9 之后 [2],这些会分配到不同的区域(使用不同区域的优点:查找、回收等),JDK 8 中会分配到同一块区域。

JVM 平时会清理一些不可达的方法,例如由于退优化等产生的死方法,另外 UseCodeCacheFlushing 选项(默认开启),还会清理较老以及执行较少的方法。一旦 CodeCache 满了之后,会停止编译,直到 CodeCache 有空间,若关闭了 UseCodeCacheFlushing 选项,则会直接永久停止编译。

不同的 JVM 版本以及不同的参数,默认的 CodeCache 大小不同。JDK 11 中默认参数下 CodeCache 大小为 240M,若想获取(确认)默认情况下的 CodeCache 大小,建议使用 - XX:+PrintFlagsFinal 选项获取 ReservedCodeCache 的大小。

CodeCache 大小主要通过以下选项调节:

InitialCodeCacheSize 初始的 CodeCache 大小(单位字节)
ReservedCodeCacheSize 预留的 CodeCache 大小,即最大CodeCache 大小(单位字节)
CodeCacheExpansionSize CodeCache 每次扩展大小(单位字节)
Option Description

使用–XX:+PrintCodeCache 选项可以打印应用使用的 CodeCache 情况,如下:

其中 max_used 表示应用中使用到的 CodeCache 大小,据此可以设置合适的 ReservedCodeCacheSize 值。

AArch64 vs x86_64

我们都知道 AArch64 和 x86 分别为 RISC 和 CISC 架构,因此代码密度方面存在一定差异,在这篇文章 [3] 中比较了不同指令集下手写汇编的大小,可以看到 AArch64 的代码密度是 RISC 架构中较优的,但相比 x86_64 仍稍差些(其中 RISC 最差,m68k 最好)。

另外笔者选用业界通用的 java 测试套 dacapo[4] 比较 AArch64 和 x86_64 下 CodeCache 占用的大小。

可以看到,在 AArch64 架构下,CodeCache 均比 x86_64 要大,但根据不同场景,大小差距不同,在 5%-20% 之间。因此在我们发现相同应用在 x86 和 AArch64 上时,CodeCache 大小需要进行相应的调节。

除此之外,还需要注意 InlineSmallCode 选项,JVM 只会 inline 代码体积比该值小的方法。JVM 通过 inline 可以触发更多的优化,因此 inline 对于性能提升也很重要。在 JDK 11 中,InlineSmallCode 在 x86 下的默认值为 2000 字节,在 AArch64 下的默认值为 2500 字节。而 JDK 8 中,InlineSmallCode 在 x86 和 AArch64 下默认值均为 2000 字节。因此建议迁移时也相应修改 InlineSmallCode 的值。业务通过对 CodeCache 相关参数的调整,达到助力 JIT 的最佳编译效果。

后记

如果遇到相关技术问题(包括不限于毕昇 JDK),可以进入毕昇 JDK 社区查找相关资源(点击原文进入官网),包括二进制下载、代码仓库、使用教学、安装、学习资料等。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM、JDK 和 V8 等相关编译技术,感兴趣的同学可以添加如下微信小助手,回复 Compiler 入群。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8088

    浏览量

    82433
  • JAVA
    +关注

    关注

    19

    文章

    2903

    浏览量

    102978
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12126

原文标题:相同版本 JVM 和 Java 应用,在 x86 和AArch64 平台性能相差30%,何故?

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    把CY8C4146平台上工程移植到CY8C4147平台上,用户程序没运行的原因?

    客户现在想把CY8C4146平台上工程移植到CY8C4147平台上topdesign重新选择4147,管脚也调整了一下,编译重新生成底层代码,creator4.2IDE编译没报错,同时同步更新
    发表于 02-21 06:04

    探索aarch64架构上使用ftrace的BPF LSM

    aarch64跟x86_64的内核功能有差异。在笔者尝试定位这些差异时,看到这篇文章,可以让大家更直观地了解LSM eBPF在两种CPU 内核上的差异。
    的头像 发表于 01-25 09:30 235次阅读

    Juno R2 ARM开发平台SoC技术概述

    以下内容: -带有标准化应用程序编程接口(API)的ADP AArch64固件。 -支持Big.LITTLE MP的AArch64 Linux内核。 详细说明:AArch32和AArch64
    发表于 08-24 07:05

    最新的Linux aarch64 LSA驱动程序

    电子发烧友网站提供《最新的Linux aarch64 LSA驱动程序.zip》资料免费下载
    发表于 08-23 15:46 2次下载
    最新的Linux <b class='flag-5'>aarch64</b> LSA驱动程序

    Arm Cortex-R82处理器技术参考手册

    ®-R82处理器有一到八个核心,每个核心实施一个ARM®V8-R AArch64兼容处理元素(PE)。 Cortex®-R82处理器的环境中,PE和内核概念是相同的。 Corte
    发表于 08-17 07:45

    ARM通用中断控制器体系结构规范GIC体系结构版本3和版本4

    本手册中的体系结构描述使用了与Armv8体系结构相同的术语。有关该术语的更多信息,请参阅Armv8-A架构配置文件Armv8 Arm®架构参考手册A部分的介绍。此外,适当的情况下使用AArch64
    发表于 08-11 07:45

    Arm AArch64体系结构的可扩展矢量扩展指南

    本指南简要介绍Arm AArch64体系结构的可扩展矢量扩展(SVE)。本指南中,您可以了解SVE的概念和主要功能,SVE的应用领域,以及SVE与Neon的比较。我们还描述了如何为支持SVE的目标开发程序
    发表于 08-10 06:43

    64位Arm入门指南

    使用本指南了解有关64位Arm(AArch64)入门的更多信息,包括: •从何处获得Arm技术(硬件和移植软件) •如何将自己的应用程序移植到64位Arm •如何在64位Arm
    发表于 08-02 17:40

    AArch64自托管调试指南

    集成Arm核心中的调试逻辑提供了观察和控制CPU和系统环境,同时深度嵌入式处理器执行软件。手臂调试体系结构规范允许将调试逻辑合并到Arm体系结构中。 本指南介绍了调试,并介绍了AArch
    发表于 08-02 10:05

    如何创建一个简单但完整的原生WoA WinUI3应用程序?

    》中所示,AArch64设备的应用程序可以x86仿真模式下运行。仿真模式下运行对于不需要高性能的应用程序是很好的。有时,它可能比
    发表于 08-02 09:57

    Juno r2 ARM开发平台SoC技术参考手册

    测试。 •一个用于优化异构计算软件和工具开发的平台,例如: --AArch64内核和工具。 --big.LITTLE™. --图形处理单元(GPGPU)计算上的通用计算,例如OpenCL。 •3D图形
    发表于 08-02 08:54

    AArch64外部调试详解

    用自托管调试模型正在调试。调试异常是自托管调试模型的基础。这个调试器对调试逻辑进行编程以生成调试事件。这些调试事件生成调试例外情况。您可以我们的AArch64自托管调试指南中阅读有关此主题的内容。 当
    发表于 08-02 06:37

    AArch64异常模型指南

    。是的尤其与任何编写代码以设置或管理异常的人相关。 本指南的最后,您可以检查您的知识。您将能够列出异常级别,说明执行如何在它们之间移动,并命名和描述执行状态。你还将能够详细说明一个简单的AArch64矢量表的组成部分,并描述如何使用异常处理程序。
    发表于 08-02 06:03

    EC2实例gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu不支持goldvip图像吗?

    当尝试配置环境以 EC2 实例(架构:aarch64构建自定义 goldvip 图像时,例如通过运行(./sources/meta-alb/scripts/host-prepare.sh
    发表于 06-05 08:22

    RT-Thread BSP qemu-virt64-aarch64文件系统

      前言   前面大体搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉编译环境,运行后发现,文件系统没有挂载,感觉是没有 mkfs。   通过RT-Thread
    发表于 05-16 10:29