开发者社区> 问答> 正文

Java应用性能优化:请问CPU角度方面如何操作?

Java应用性能优化:请问CPU角度方面如何操作?

展开
收起
我是小美女 2021-11-01 10:41:27 436 0
1 条回答
写回答
取消 提交回答
  • 网络规划设计师、敏捷专家、CISP、ITSS服务经理、ACA全科目、ACP4项、ACE、CBP、CDSP、CZTP等。拥有 PRINCE2 Foundation/Practitioner、CCSK、ITIL、ISO27001、PMP等多项国际认证。 专利5+、期刊10+、知识产权师。核心期刊审稿人。

    您好,对于 CPU 主要关注平均负载(Load Average),CPU 使用率,上下文切换次数(Context Switch)。 通过 top 命令可以查看系统平均负载和 CPU 使用率,分别表示过去 1 分钟、5 分钟、15 分钟机器的负载。按照经验,若数值小于 0.7*CPU 个数,则系统工作正常;若超过这个值,甚至达到 CPU 核数的四五倍,则系统的负载就明显偏高。 比如15 分钟负载已经高达 57.18,1 分钟负载是 63.66(系统为 16 核),说明系统出现负载问题,且存在进一步升高趋势,需要定位具体原因了。

    通过 vmstat 命令可以查看 CPU 的上下文切换次数: 上下文切换次数发生的场景主要有如下几种:

    • 1)时间片用完,CPU 正常调度下一个任务;
    • 2)被其它优先级更高的任务抢占;
    • 3)执行任务碰到 I/O 阻塞,挂起当前任务,切换到下一个任务;
    • 4)用户代码主动挂起当前任务让出 CPU;
    • 5)多任务抢占资源,由于没有抢到被挂起;
    • 6)硬件中断。
    
    

    Java 线程上下文切换主要来自共享资源的竞争。一般单个对象加锁很少成为系统瓶颈,除非锁粒度过大。但在一个访问频度高,对多个对象连续加锁的代码块中就可能出现大量上下文切换,成为系统瓶颈。 比如在我们系统中就曾出现 log4j 1.x 在较大并发下大量打印日志,出现频繁上下文切换,大量线程阻塞,导致系统吞吐量大降的情况,升级到 log4j 2.x 才解决这个问题。

    2021-11-01 10:44:56
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载