CN117270822A - 一种不中断应用服务的Java代码布局优化方法 - Google Patents
一种不中断应用服务的Java代码布局优化方法 Download PDFInfo
- Publication number
- CN117270822A CN117270822A CN202311196425.XA CN202311196425A CN117270822A CN 117270822 A CN117270822 A CN 117270822A CN 202311196425 A CN202311196425 A CN 202311196425A CN 117270822 A CN117270822 A CN 117270822A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- new
- application service
- control flow
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 39
- 238000005457 optimization Methods 0.000 title claims abstract description 34
- 230000006870 function Effects 0.000 claims abstract description 122
- 230000008569 process Effects 0.000 claims abstract description 12
- 238000012937 correction Methods 0.000 claims abstract description 5
- 230000004888 barrier function Effects 0.000 claims abstract description 4
- 238000012423 maintenance Methods 0.000 claims abstract description 4
- 238000012986 modification Methods 0.000 claims abstract description 3
- 230000004048 modification Effects 0.000 claims abstract description 3
- 238000013507 mapping Methods 0.000 claims description 12
- 238000005070 sampling Methods 0.000 claims description 11
- 238000010586 diagram Methods 0.000 claims description 10
- 238000012544 monitoring process Methods 0.000 claims description 5
- 238000012545 processing Methods 0.000 claims description 4
- 238000004064 recycling Methods 0.000 claims 1
- 230000008707 rearrangement Effects 0.000 description 10
- 230000008901 benefit Effects 0.000 description 4
- 230000000694 effects Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 2
- 238000007792 addition Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 229910002056 binary alloy Inorganic materials 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000000348 solid-phase epitaxy Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种不中断应用服务的Java代码布局优化方法,包括获取应用的前端瓶颈数据,当根据前端瓶颈数据判断需要执行代码布局优化操作时,采集应用服务的动态控制流图;基于动态控制流图计算新代码布局;按照新代码布局生成新代码;修正所有代码中的重定位信息,即将指向旧代码的函数调用和数据引用指向新代码,修正过程中利用内存屏障和cache维护指令保证修改操作的原子性和一致性,以实现不中断应用服务;仅回收不再被执行的旧代码使用的内存空间用于存放下一次优化生成的新代码,保留仍在调用栈上的函数代码,以实现不中断应用服务便能够回收大部分内存空间。该方法有效地缓解了Java应用的处理器前端瓶颈,提升应用性能。
Description
技术领域
本发明属于生成代码布局优化技术领域,具体涉及一种不中断应用服务的Java代码布局优化方法。
背景技术
出于在开发效率、内存安全、应用生态以及可移植性上的优势,Java语言被广泛用于编写数据中心应用。数据中心的Java应用通常包含了深且复杂的软件栈,例如Web框架、网络、存储、日志、监控、中间件等等。这使得应用的代码规模非常庞大,甚至高达数百MB,远远超过典型的L1指令缓存和L1指令TLB的大小。庞大的代码规模产生频繁的指令缓存未命中(miss)和指令TLB未命中(miss)导致了大量的处理器流水线前端停顿。糟糕的是,即使最先进的处理器乱序执行机制也无法隐藏流水线前端停顿使得它成为了数据中心Java应用的严重的性能瓶颈(前端瓶颈)。
反馈指导的代码布局优化技术(FDCLO)是一个优化前端瓶颈的有效手段。FDCLO通过采集应用运行的控制流特征,将热的控制流路径上的代码块放置在一起。FDCLO能增加分支源地址和分支目的地址在同一个缓存块或者同一个内存页的概率,从而减少指令缓存miss和指令TLB miss,从而提高性能。按照代码重排的实施粒度可将FDCLO分为基本块重排和函数重排。基本块重排以基本块为粒度,调整一个函数内的基本块的布局。函数重排则是以函数为粒度,调整二进制中的函数的布局。FDCLO能够有效地优化前端瓶颈,但是现有的FDCLO方案面临着不支持Java应用、不支持持续优化、优化过程会中断应用执行等问题而无法被应用于大规模的数据中心Java应用上。具体如下。
BOLT(Binary Optimization and Layout Tool)是由Meta公司推出二进制优化工具,目前已经合到LLVM仓库了。BOLT属于离线的FDCLO方案。BOLT在离线环境下获取应用的控制流特征并生成优化后的二进制程序,然后运维人员在线上环境部署优化后的二进制程序。BOLT利用硬件采样功能获取应用的控制流图,例如ARM平台的SPE或者X86平台的LBR。因为要优化低层级的代码布局,因此使用硬件采样功能获取的控制流图会具有更好的准确度和匹配度。OCOLOS在BOLT的基础上提出了可持续优化的在线代码重排框架。OCOLOS的核心原理是动态监测应用的前端瓶颈,当前端瓶颈增大时,调用BOLT来生成一个优化的二进制程序,并通过代码热更新的形式切换到新版本代码上运行。BOLT和OCOLOS对应用程序具有良好的优化效果,但是他们只支持像C、C++这样的Native语言编写的应用程序,而不支持Java应用程序。对于Java应用来说,源代码先被编译成字节码的高级别的虚拟机指令而不是直接被编译成可运行的机器码。然后再由JVM在应用启动之后将字节码编译成可执行的机器码。因此Java应用的代码布局是由JVM在运行时动态确定的,而不像Native语言编写的应用在链接时确定的。
DCM(Dynamic Code Management)是一套针对Java应用的代码布局优化框架。DCM是最接近本发明的技术方案。DCM主要包括以下关键步骤:1)使用插桩的方式获取动态控制流图;2)暂停所有的Java应用线程;3)计算优化后的代码布局;4)分配新的内存空间用于存放优化后的代码;5)将函数代码移动到新分配的内存空间并修复重定位信息以及函数对应的元数据;6)更新每个线程的调用栈,将调用栈上的返回地址修改成函数的新地址,更新包含了代码地址的寄存器;7)重启所有的Java应用线程。DCM的不足在于:1)使用插桩方式获取控制流图的方式对应用的干扰太大,采集过程造成应用性能的大幅度下降;2)需要中断所有的应用线程才能执行优化,会使得应用处理请求时发生超时;3)仅仅支持函数级别的代码重排,丢失了大部分的优化机会。基于这三点,DCM无法应用与大规模的数据中心Java应用。
发明内容
鉴于上述,本发明的目的是提供一种不中断应用服务的Java代码布局优化方法和装置,有效地缓解了Java应用的处理器前端瓶颈,提升应用性能,通过不中断应用服务执行的机制解决了DCM使应用处理请求发生超时的问题。同时实现基本块和函数级别的代码重排,优化效果优于DCM。
为实现上述发明目的,实施例提供的一种不中断应用服务的Java代码布局优化方法,包括以下步骤:
获取应用服务的前端瓶颈数据,当根据前端瓶颈数据判断需要执行代码布局优化操作时,采集应用服务的动态控制流图,所述动态控制流图包括每个函数内部基本块的动态控制流图、全局函数之间调用的动态控制流图;
基于动态控制流图计算新代码布局,所述新代码布局包括每个函数内部基本块的新代码布局、全局函数的新代码布局;
按照新代码布局生成新代码;
修正所有代码中的重定位信息,将指向旧代码的调用和数据引用指向新代码,修正过程中利用内存屏障和缓存维护指令保证修改操作的原子性和一致性,以实现不中断应用服务;
回收不再被执行的旧代码使用的内存空间用于存放下一次优化生成的代码,保留仍在调用栈上的函数代码,以实现不中断应用服务便能够回收一部分内存空间。
在一个实施例中,采用处理器的硬件性能监控单元采集固定时间长度内待优化应用服务的前端瓶颈数据,判断相邻两次采集的前端瓶颈数据之差大于设定阈值时,认为需要执行代码布局优化操作。
在一个实施例中,所述采集应用服务的动态控制流图,包括:
采样分支指令的调用数据,每条分支指令包含了源地址和目的地址;查找源地址和目的地址的函数,如果源地址和目的地址属于同一个函数,则更新该函数内部基本块的动态控制流图,如果源地址和目的地址不属于同一个函数,则更新全局函数之间调用的动态控制流图。
在一个实施例中,每个函数内部基本块的动态控制流图中,节点表示基本块,边代表了基本块之间的跳转关系,边的权重代表了跳转的次数。
在一个实施例中,全局函数之间调用的动态控制流图中,节点表示函数,边代表函数之间的调用关系,边的权重代表了相应的函数调用发生的次数。
在一个实施例中,所述基于动态控制流图计算新代码布局,包括:
采用基本块重排算法基于输入的每个函数内部基本块的动态控制流图进行重排,输出每个函数内部基本块的新代码布局,其中,基本块重排算法包括ExtTSP算法;
在一个实施例中,所述基于动态控制流图计算新代码布局,包括:
采用函数重排算法基于输入的全局函数之间调用的动态控制流图进行重排,输出全局函数的新代码布局,其中,函数重排算法包括Call-Chain Clustering算法。
在一个实施例中,所述按照新代码布局生成新代码,包括:
首先分配一块临时缓存空间用于存放每个函数的新代码;遍历全局函数代码布局列表,每次处理一个函数;根据每个函数内部基本块的新代码布局生成每个函数的新代码并保存到临时缓存空间;在代码内存空间中分配函数的内存空间,将临时缓存空间内的新代码拷贝到新分配的内存空间;保存同一个函数新旧代码地址的映射表,该映射表用于后续地址重定位。
在一个实施例中,修正所有代码中的重定位信息的具体过程为:
根据新旧代码地址的映射表,将新代码中的所有函数调用的目的地址修改成新地址;根据新旧代码地址的映射表,将旧代码中的所有函数调用的目的地址修改成新地址。
在一个实施例中,所述仅回收不再被执行的旧代码使用的内存空间,包括:
对应用服务的每个线程调用栈进行采样,解析每个线程调用栈上的旧函数代码;对每个线程调用栈上的旧函数代码求并集,该并集为需要保留的旧代码;遍历整个旧代码空间,删除需要保留的旧代码以外的其他旧代码。
与现有技术相比,本发明具有的有益效果至少包括:
以采样的方式获取Java应用服务的动态控制流图,具有对应用性能干扰小的优势;在实施优化的过程中,不需要中断应用程序的执行,对应用的性能影响小;以上两点使得本发明方法可以应用于数据中心Java应用而不会使应用处理用户请求时发生超时的问题。此外,本发明方法同时考虑基本块代码重排和函数代码重排,具有更好的优化效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动前提下,还可以根据这些附图获得其他附图。
图1是实施例提供的不中断应用服务的Java代码布局优化方法的流程图;
图2是实施例提供的代码生成示意图;
图3是实施例提供的为更新代码的函数调用目的地址之前的函数调用情况图;
图4是实施例提供的为更新代码的函数调用目的地址之后函数的调用情况图;
图5是实施例提供的旧代码回收示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。
图1是实施例提供的不中断应用服务的Java代码布局优化方法的流程图。如图1所示,实施例提供的Java代码布局优化方法,包括以下步骤:
步骤1,获取应用服务的前端瓶颈数据。
实施例中,使用处理器的硬件性能监控单元以固定周期采集固定时间长度内待优化应用服务的前端瓶颈数据Pi。具体地,周期性地通过Linux的Perf接口获取因为处理器前端瓶颈导致的流水停顿的比例。基于该流水停顿的比例获得前端瓶颈数据Pi。
步骤2,当根据前端瓶颈数据判断需要执行代码布局优化操作时,采集应用服务的动态控制流图。
实施例中,假设上一次采集的前端瓶颈数据为Pi-1,判断相邻两次采集的前端瓶颈数据Pi-Pi-1之差大于设定阈值T时,认为需要执行代码布局优化操作,即执行步骤2-6,否则继续保持监测,即跳转执行步骤1。
在需要执行代码布局优化操作时,采集应用服务的动态控制流图。该动态控制流图是作为计算新代码布局算法的输入。其中,动态控制流图包括两种,其中一种为每个函数独有的函数内部基本块的动态控制流图,另一个为全局函数之间调用的动态控制流图。
通过硬件辅助采样功能对分支指令进行数据采样,具体可通过ARM平台的SPE功能或者Intel平台的LBR功能实现。一条分支指令包含了源地址和目的地址。基于该分支指令采集并更新动态控制流图,具体包括:
分别查找分支指令的源地址和目的地址所在的函数,如果源地址和目的地址属于同一个函数,则更新该函数内部基本块的动态控制流图,该动态控制流图中,节点表示基本块,边代表了基本块之间的跳转关系,边的权重代表了跳转的次数。如果源地址和目的地址不属于同一个函数,说明这是一条函数调用的分支指令,此时更新全局函数之间调用的动态控制流图。该动态控制流图中,节点表示函数,边代表函数之间存在调用关系,边的权重代表了相应的函数调用发生的次数。
步骤3,基于动态控制流图计算新代码布局。
实施例中,新代码布局包括每个函数内部基本块的新代码布局、全局函数的新代码布局。计算新代码布局的过程包括:
以每个函数内部基本块的动态控制流图作为输入,通过基本块重排算法输出每个函数内部基本块的新代码布局,其中,基本块重排算法可以采用ExtTSP算法;
以全局函数之间调用的动态控制流图作为输入,通过函数重排算法输出全局函数的新代码布局,其中,函数重排算法可以为Call-Chain Clustering(C3)算法。
步骤4,按照新代码布局生成新代码。
实施例中,按照函数顺序,在新的内存空间中生成每个函数的代码,生成每个函数代码时根据每个函数内部基本块的布局按序生成。如图2所示,具体过程包括:
首先分配一块临时缓存空间用于存放每个函数的新代码;遍历全局函数代码布局列表,每次处理一个函数;调用编译器根据每个函数内部基本块的新代码布局生成每个函数的新代码并保存到临时缓存空间;在代码内存空间中分配函数的内存空间,将临时缓存空间内的新代码拷贝到新分配的内存空间;保存同一个函数新旧地址的映射表,该映射表用于后续地址重定位。
步骤5,修正所有代码中的重定位信息。
实施例中,将指向旧代码的调用和数据引用指向新代码,即将新旧代码的所有函数调用的目的地址更新为新代码的地址,从而实现将应用切换到执行新代码。图3为更新操作执行前的程序的函数调用情况。图4为更新操作之后程序的函数调用情况。修正过程中利用内存屏障和缓存维护指令保证修改操作的原子性和一致性,以实现不中断应用服务。具体过程包括:
根据新旧代码地址的映射表,将新代码中的函数调用的目的地址修改成新的地址;根据新旧代码地址的映射表,将旧代码中的函数调用的目的地址修改成新的地址。
步骤6,回收不再被执行的旧代码使用的内存空间。
实施例中,回收不再被执行的旧代码所占用的内存空间,对于依然在应用线程调用栈上的旧代码,因为程序有可能通过返回(return)指令重新执行旧的代码,因此这部分的代码不可以被删除的,具体如图5所示,步骤如下:
对应用服务的每个线程调用栈进行采样,解析每个线程调用栈上的旧函数代码;对每个线程调用栈上的旧函数代码求并集,该并集为需要保留的旧代码;遍历整个旧代码空间,删除需要保留的旧代码以外的其他旧代码。
以上所述的具体实施方式对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种不中断应用服务的Java代码布局优化方法,其特征在于,包括以下步骤:
获取应用服务的前端瓶颈数据,当根据前端瓶颈数据判断需要执行代码布局优化操作时,采集应用服务的动态控制流图,所述动态控制流图包括每个函数内部基本块的动态控制流图、全局函数之间调用的动态控制流图;
基于动态控制流图计算新代码布局,所述新代码布局包括每个函数内部基本块的新代码布局、全局函数的新代码布局;
按照新代码布局生成新代码;
修正所有代码中的重定位信息,将指向旧代码的调用和数据引用指向新代码,修正过程中利用内存屏障和缓存维护指令保证修改操作的原子性和一致性,以实现不中断应用服务;
回收不再被执行的旧代码使用的内存空间用于存放下一次优化生成的代码,保留仍在调用栈上的函数代码,以实现不中断应用服务便能够回收一部分内存空间。
2.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,采用处理器的硬件性能监控单元采集固定时间长度内待优化应用服务的前端瓶颈数据,判断相邻两次采集的前端瓶颈数据之差大于设定阈值时,认为需要执行代码布局优化操作。
3.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,所述采集应用服务的动态控制流图,包括:
采样分支指令的调用数据,每条分支指令包含了源地址和目的地址;查找源地址和目的地址的函数,如果源地址和目的地址属于同一个函数,则更新该函数内部基本块的动态控制流图,如果源地址和目的地址不属于同一个函数,则更新全局函数之间调用的动态控制流图。
4.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,每个函数内部基本块的动态控制流图中,节点表示基本块,边代表了基本块之间的跳转关系,边的权重代表了跳转的次数。
5.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,全局函数之间调用的动态控制流图中,节点表示函数,边代表函数之间的调用关系,边的权重代表了相应的函数调用发生的次数。
6.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,所述基于动态控制流图计算新代码布局,包括:
采用基本块重排算法基于输入的每个函数内部基本块的动态控制流图进行重排,输出每个函数内部基本块的新代码布局,其中,基本块重排算法包括ExtTSP算法。
7.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,所述基于动态控制流图计算新代码布局,包括:
采用函数重排算法基于输入的全局函数之间调用的动态控制流图进行重排,输出全局函数的新代码布局,其中,函数重排算法包括Call-Chain Clustering算法。
8.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,所述按照新代码布局生成新代码,包括:
首先分配一块临时缓存空间用于存放每个函数的新代码;遍历全局函数代码布局列表,每次处理一个函数;根据每个函数内部基本块的新代码布局生成每个函数的新代码并保存到临时缓存空间;在代码内存空间中分配函数的内存空间,将临时缓存空间内的新代码拷贝到新分配的内存空间;保存同一个函数新旧代码地址的映射表,该映射表用于后续地址重定位。
9.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,修正所有代码中的重定位信息的具体过程为:
根据新旧代码地址的映射表,将新代码中的所有函数调用的目的地址修改成新地址;根据新旧代码地址的映射表,将旧代码中的所有函数调用的目的地址修改成新地址。
10.根据权利要求1所述的不中断应用服务的Java代码布局优化方法,其特征在于,所述仅回收不再被执行的旧代码使用的内存空间,包括:
对应用服务的每个线程调用栈进行采样,解析每个线程调用栈上的旧函数代码;对每个线程调用栈上的旧函数代码求并集,该并集为需要保留的旧代码;遍历整个旧代码空间,删除需要保留的旧代码以外的其他旧代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311196425.XA CN117270822A (zh) | 2023-09-15 | 2023-09-15 | 一种不中断应用服务的Java代码布局优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311196425.XA CN117270822A (zh) | 2023-09-15 | 2023-09-15 | 一种不中断应用服务的Java代码布局优化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117270822A true CN117270822A (zh) | 2023-12-22 |
Family
ID=89207382
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311196425.XA Pending CN117270822A (zh) | 2023-09-15 | 2023-09-15 | 一种不中断应用服务的Java代码布局优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117270822A (zh) |
-
2023
- 2023-09-15 CN CN202311196425.XA patent/CN117270822A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6862674B2 (en) | Methods and apparatus for performing a memory management technique | |
US9740716B2 (en) | System and method for dynamically selecting a garbage collection algorithm based on the contents of heap regions | |
JP2006092532A (ja) | 最近アクセスしたリソースのデータ局所性の増加 | |
US7168071B2 (en) | Method and system of permitting stack allocation to programs having open-world features | |
US20020194210A1 (en) | Method for using non-temporal stores to improve garbage collection algorithm | |
US7765524B2 (en) | Method and system for global constant management | |
US20140115291A1 (en) | Numa optimization for garbage collection of multi-threaded applications | |
US8447793B2 (en) | Efficient remembered set for region-based garbage collectors | |
US11550714B2 (en) | Compiling application with multiple function implementations for garbage collection | |
US6735761B1 (en) | Compile method frame detection method and device code discarding method and computer | |
US20200356384A1 (en) | Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics | |
US10936483B2 (en) | Hybrid garbage collection | |
US10120796B2 (en) | Memory allocation for long-lived objects | |
CN117270822A (zh) | 一种不中断应用服务的Java代码布局优化方法 | |
US6240500B1 (en) | Method for dynamically placing procedures of a program in a memory | |
McGachey et al. | Reducing generational copy reserve overhead with fallback compaction | |
Jones et al. | A fast analysis for thread-local garbage collection with dynamic class loading | |
US11573794B2 (en) | Implementing state-based frame barriers to process colorless roots during concurrent execution | |
US11789863B2 (en) | On-the-fly remembered set data structure adaptation | |
US11513954B2 (en) | Consolidated and concurrent remapping and identification for colorless roots | |
US20220308933A1 (en) | Tracking frame states of call stack frames including colorless roots | |
Eimouri et al. | Optimizing the JVM object model using object splitting | |
Achauer | Objects in real-time systems: Issues for language implementors | |
Baker | Cache-conscious copying collectors | |
Meehan et al. | Java garbage collection—a generic solution? |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |