CPU的load和使用率基础概念:
参考:https://www.cnblogs.com/rexcheny/p/9382396.html
1. 什么是CPU load:
- 一段时间内处于可运行状态和不可中断状态的进程平均数量。
- 可运行分为正在运行进程和正在等待CPU的进程,状态为R;不可中断则是它正在做某些工作不能被中断比如等待磁盘IO等,其状态为D,它是从另外一个角度体现CPU的使用状态。
理想的CPU load是多少:
- 它跟CPU核心数量有关,理想情况下,一个核心被一个进程占用。
- 如果4个核心,跑4个进程,此时Load是4但是也不高。如果2个核心,依然跑4个进程,这就意味着有一半进程在某一个时刻抢不到CPU,这时候Load还是4,如果是短期状态还无所谓,如果长期是这个状态你就要注意了。
查看Linux系统物理CPU个数、核心数和逻辑CPU个数:
总核数 = 物理CPU个数 * 每个物理CPU的核心数
总逻辑CPU数 = 物理CPU个数 * 每个物理CPU的核心数 * 超线程数量
查看物理CPU个数:
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看每个物理CPU中的核心数:
cat /proc/cpuinfo| grep "cpu cores"| uniq
查看逻辑CPU的个数:
cat /proc/cpuinfo| grep "processor"| wc -l
获取CPU总核数:
grep -c 'model name' /proc/cpuinfo
2. 什么是CPU使用率:
- 利用率是一段时间内CPU被占用的情况。
CPU负载高利用率低:
- 说明等待执行的任务很多,但是通常任务多CPU使用率也会比较高,如果低就说明CPU根本没工作,哪些很多的任务处于等待状态,可能进程僵死了。
- 可以通过命令ps –axjf查看是否存在D状态的进程,该状态时不可中断的睡眠状态。这种状态无法被kill。而有时候通过top命令也看不出来,只能显示LOAD高,但是没有哪个进程的CPU使用率明显高,你可以通过ps –ux来查看。
CPU利用率高负载低:
- 说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后,则利用率会下降。
3. 相关知识:
CPU核心数与线程数的区别:
- 核心数:指CPU的物理核心数,是硬件上存在有几个核心。
- 线程数:是一种逻辑的概念,也就是模拟出的CPU核心数。CPU的线程数概念仅仅只针对Intel的CPU才有用,因为它是通过Intel超线程技术来实现的,最早应用在Pentium4上。
什么是超线程:
- 超线程(HT):超线程和多线程不同,多线程是程序方面的属于软的代码级别的,超线程是硬件架构方面的,通过控制器来模拟逻辑核心。
超线程有什么作用:
- 为了提高效率,更高的榨干控制器的运行能力。
- 因为任务过来之后很多时候不是马上就能由运算器进行计算的,它还需要其他资源比如网络传输过来的数据或者是硬盘中的数据,那么此时运算器就闲着,为了更大限度利用运算器,我可以设置2个控制器对应一个运算器,其中一个控制器处理的程序需要等待数据的时候,如果另外一个控制器处理的程序不需要等待或者数据已经准备好,那么就可以立即发送给运算器进行计算。
调优命令及工具:
1. 命令:
查看进程中哪个线程使用率高:
top -pH pid 看 %CPU
vmstat 报告虚拟内存状态的统计信息命令:
vmstat 1 6 -w ->(间隔1秒,一共6次,宽输出模式)
查看队列长度,r表示运行和等待CPU时间片的进程数量;b表示等待资源的进程数量比如IO、或者内存交互等。
vmstat 命令_vmstat命令-CSDN博客
2. 工具:
Jstack命令
fastThread线上工具
CPU飙高原因总结:
- 1. CPU发生了大量计算。
- 表现1:大量线程在等待计算结果,CPU一直在计算,会影响后序线程。
- 表现2:死循环导致大量计算
- 2. 频繁GC
- 3. 死锁
- 4. 线程数打满
- 表现1:多个耗时长的操作一直占用线程不释放(专业术语:线程处于等待状态),最后导致线程数打满。 例如:《序列化问题引起的应用服务CPU飙高》