您好,对于 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 才解决这个问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。