一、什么是load average
top命令中显示的load average,表示最近1分钟、5分钟和15分钟的系统平均负载:
1.1 load average如何计算而来
1、在Linux中,进程分为三种状态,一种是阻塞的进程blocked process,一种是可运行的进程runnable process,另外就是正在运行的进程running process。
2、进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行和准备好运行的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5。
3、load average就是一定时间内的load数量。如15分钟内load average=5/15。
1.2 影响系统负载高的因素有哪些
Load高代表需要运行的进程累计过多,影响因素有2个:
1、队列中的任务耗cpu(如加密/解密、序列化/反序列化、当锁争用激烈时导致线程上下文频繁切换、死循环)
2、队列中的任务耗IO(如网络IO、磁盘IO较多或较慢)
换句话说:系统负载,最终由CPU负载、IO负载决定
1.3 什么样的系统负载是正常的?
1、把系统负载除以总的核心数,只要每个核心的负载不超过1.0,就表明系统负载正常。(即 n核cpu时,只要load<n,就认为系统负载是正常的)
2、理想状态下,都希望负载load值小于 1.00 ,当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题。(即高峰时偶尔超过1没事,经常超过1就需要注意了)
3、负载为1.00 说明系统已经没有剩余的资源了,生产环境中,系统负载应保持在0.7以下。
1.3.1 系统负载是否正常分析举例
一个4核的cpu的系统,通过apm工具监控到它的系统负载图如下:
1、首先观察load_15m和load_5m,load基本保持在3-5之间,说明系统中长期负载保持在一个较高的量级(load average/4约等于1)。
2、再观察load_1m可以看出,波动很大,并且很多时间段内远大于cpu核心数,很可能是一个拥塞的开始,需要分析处理。
二、load高并且cpu低是什么原因
CPU负载不高,但I/O负载较高:可进一步定位是磁盘I/O还是网络I/O导致。
如何定位是哪种,详细参考:https://segmentfault.com/a/1190000025167113
三、java应用程序–load高并且cpu高是什么原因
java应用程序中,常见的导致cpu高的原因有:
1、while的无限循环 无限循环将调用CPU寄存器进行计数,此操作将占用CPU资源。 那么,如果线程始终处于无限循环状态,CPU是否会切换线程?–》除非操作系统时间片到期,否则无限循环不会放弃占用的CPU资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行任何其他操作。
2、频繁的GC GC用于JVM垃圾收集,它需要计算内存和调用寄存器,因此,频繁的GC必须占用CPU资源。
3、线程上下文切换 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间频繁发生变化。【当锁争用激烈时,这种情况很容易发生】 4、序列化和反序列化 5、加密和解密
抓住2个点:频繁切换或大量计算,或导致cpu使用率高
注意点:
1、具有大量线程的应用程序,CPU使用率一定高吗? 答案:不一定
因为如果线程很多,但处于Runnable和Running状态的线程数不多,则CPU使用率不一定很高。
2、对于CPU占用率高的应用程序,线程数是否一定较大? 答案:不一定。
高CPU使用率的关键因素是计算密集型操作。如果一个线程中有大量计算,则CPU使用率也可能很高。
3、处于BLOCKED状态的线程是否会导致CPU占用率飙升? 答案:不一定。
CPU使用率的飙升更多是由于上下文切换或过多的可运行状态线程,处于阻塞状态的线程不一定会导致CPU使用率上升。
四、全面的系统性能排查
详细参考:https://segmentfault.com/a/1190000025167113
|