首页 > 其他分享 >项目启动时CPU高

项目启动时CPU高

时间:2023-03-19 20:55:13浏览次数:35  
标签:load 项目 启动 模式 Server 编译 线程 C2 CPU

在发布或重启某线上某服务时,常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落,与此同时响应时间曲线也与load曲线一致。注:load飙高的初始时刻是应用服务端口打开,流量打入时(load)。

  • 发布时候load飙高
  • 发布时候响应时间飙高

cpu使用率较高的两个线程详细信息

  • "C2 CompilerThread1" daemon prio=10 tid=0x00007fce48125800 nid=0x852 waiting on condition [0x0000000000000000]
    java.lang.Thread.State: RUNNABLE
    Locked ownable synchronizers:
  • "C2 CompilerThread0" daemon prio=10 tid=0x00007fce48123000 nid=0x851 waiting on condition [0x0000000000000000]
    java.lang.Thread.State: RUNNABLE
    Locked ownable synchronizers:

C2 CompilerThread线程项目启动初期cpu使用率那么高,它在干什么呢?

Java程序在启动的时候所有代码的执行都处于解释执行模式,只有在运行了一段时间后,根据代码方法执行的次数,或代码里循环的执行次数等达到一定的阈值才会编译成机器码,编译成机器码后执行效率会得到大幅提升,而随着执行时间进一步拉长,JVM的各种更高级的编译优化手段就会逐渐加上,例如if条件的执行状况,逃逸分析等。这里的C2 CompilerThread线程干的就是编译优化的活。 在程序刚启动的时候,java还处于解释执行模式,因此服务效率很低,响应时间缓慢,处理得慢了,load自然也就高了。而当流量持续不断导入时,我们代码的很多方法执行次数不断增多,此时C2 CompilerThread线程不断收集优化信息,并且开始将一些热点代码优化编译成本地机器码,因此该线程的cpu使用率增高。而当C2 CompilerThread线程完成初始编译优化过程后,C2 CompilerThread线程的cpu使用率开始下降,与此同时优化后服务的性能大幅提升,服务响应时间也大大缩短,load也下降。

解决方案

预热

如果在服务接受线上请求之前提前完成编译优化过程,那么将能避免此种抖动情况。一般的做法是预热,有两种方法:
  • 程序主动预热:在启动完成后,程序主动的访问热点的代码,确保主要的热点代码已被编译成机器码后再放入流量,可通过-XX:+PrintCompilation来确认。
  • 复制流量预热:通过拷贝一份线上的流量进行预热,完成之后再导入线上流量。

启动多个线程进行编译优化

如果能加快编译优化速度,那也能降低解释执行阶段导致的抖动时间。因此可以多拿几个线程来做编译,加快达到高峰性能的速度。 可以使用-XX:CICompilerCount参数来设置编译线程数目,这个值默认是2(之前在栈里看到有两个编译线程),我们可以加到4。

采用分层编译

编译方式有三种
  • Client模式
  • Server模式
  • Tiered模式
我们服务默认是Server模式。 Server模式是采用c2高级编译的,会比较耗时且要运行一段时间才会触发编译。 Server模式的优点是编译后程序效率较高。 Client模式比较轻量也比较快触发(比Server模式触发快),编译优化后程序效率不如Server模式。 Tiered模式是Client模式和Server模式的折中,一开始会启用Client模式,可以在启动后更快的让部分代码先进入编译优化阶段,之后会启动Server模式,达到程序效率最大优化的目的。 Oracle JDK 7里的HotSpot VM已经开始有比较好的Tiered编译(tiered compilation)支持,可以设置参数-XX:+TieredCompilation来启动Tiered模式,java 8默认就是Tiered模式。

标签:load,项目,启动,模式,Server,编译,线程,C2,CPU
From: https://www.cnblogs.com/zhengbiyu/p/17234248.html

相关文章

  • IT项目经理
    具体项目工作的管理者项目经理是具体项目工作的管理者,他们在工作中不断提升自己的领导才华,同时该职业又是一个权利与责任并存的职业,他们主要对项目进行背景调查,收集整理......
  • 项目经理要求具备的素质
    项目经理要求具备的素质包括很多方面,虽然没有年龄的具体要求,但由于项目经理职责压力较大,工作繁忙,因此年龄也是一种考虑因素,需要根据身体状况灵活确定。 项目经理(Proje......
  • 硬核26000字分析uboot启动过程
    更好的阅读体验请见:​​硬核26000字分析uboot启动过程​​汇编阶段最先执行的是汇编文件start.S,这个文件跟架构有关,例如芯片架构是arm926ejs,那路径就在​​arch/arm/cpu/sta......
  • Vue和React项目中生成唯一ID
    Vue中唯一ID生成方式React中唯一ID生成方式......
  • 使用Docker安装并启动MySQL
    1.在Docker镜像仓库查找MySQL镜像dockerhub镜像仓库或者通过命令dockersearchmysql在宿主机终端查找2.拉取MySQL镜像#拉取MySQL镜像dockerpull......
  • SSM整合 - 简单项目功能实现
    SSM整合练习创建数据库CREATEDATABASE`ssmbuild`;USE`ssmbuild`;DROPTABLEIFEXISTS`books`;CREATETABLE`books`( `bookID`INT(10)NOTNULLAUTO_INCRE......
  • 扩视机器视觉—Halcon视觉48个实战项目一(检测钢珠个数)
    项目需求:此项目halcon检测钢珠的个数,并显示。素材如下:  代码如下:read_image(Image4,'扩视4.bmp')*********关闭窗口***********dev_close_window()*****......
  • 【framework】WMS启动流程
    1前言​WMS是WindowManagerService的简称。(1)WMS主要职责窗口管理:负责启动、添加、删除窗口,管理窗口大小、层级,核心成员有:WindowContainer、RootWindowContain......
  • 【framework】Activity启动流程
    1前言ATMS启动流程介绍了ActivityTaskManagerService(ATMS)的启动和初始化流程,本文将介绍Activity的启动流程。由于Activity启动流程复杂,本文按进程将其拆分为3......
  • 【framework】AMS启动流程
    1前言​AMS即ActivityManagerService,负责Activy、Service、Broadcast、ContentProvider四大组件的生命周期管理。本文主要介绍AMS的启动流程和初始化过程。AMS......