cpu利用率和cpu负载的区别是什么?
要理解CPU利用率,我们需要先了解CPU时间片的概念。
什么是CPU时间片?我们现在使用的Windows、Linux、Mac OS等都是“多任务操作系统”,它们可以“同时”运行多个程序,比如一边浏览网页一边听音乐。
然而,实际上一个CPU内核在同一时刻只能执行一个任务。那么,操作系统是如何实现“多任务”的呢?
大致的方法是让多个进程轮流使用CPU的一小段时间。由于这个“一小段时间”非常短(在Linux上为5ms到800ms之间),用户感觉不到,就好像几个程序同时在运行。
上面提到的“一小段时间”就是我们所说的CPU时间片。现代分时多任务操作系统对CPU都是按时间片分配的。
CPU利用率,就是程序对CPU时间片的占用情况,即CPU利用率 = CPU时间片被程序使用的时间 / 总时间。
例如,A进程占用10ms,B进程占用30ms,然后空闲60ms,再次A进程占用10ms,B进程占用30ms,空闲60ms。如果在一段时间内都是如此,那么这段时间内的CPU占用率为40%。CPU利用率显示的是程序在运行期间实时占用的CPU百分比。
大多数操作系统的CPU占用率分为用户态CPU使用率和系统态CPU使用率。
用户态CPU使用率是指执行应用程序代码的时间占总CPU时间的百分比。
相比之下,系统态CPU使用率是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态的CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互。
而CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。
简单来说,一个是CPU的实时使用情况,一个是CPU的当前以及未来一段时间的使用情况。
举例来说:如果有一个程序需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作。
如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。
因此,CPU的工作负载越大,代表CPU必须在不同的工作之间进行频繁的工作切换。无论CPU的利用率是高是低,跟后面有多少任务在排队(CPU负载)没有必然关系。
如果是单核CPU,负载达到1就代表CPU已经达到满负荷的状态,超过1,后面的进程就需要排队等待处理。如果是多核多CPU,假设现在服务器是2个CPU,每个CPU有2个核,那么总负载不超过4都没什么问题。
可以通过uptime、w命令查看CPU平均负载,使用top命令还能看到CPU负载总体使用率以及各个进程占用CPU的比例。
查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort | uniq| wc -l
查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores" | uniq
查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
如果CPU负载很高,利用率却很低该怎么办?CPU负载很高,利用率却很低,说明处于等待状态的任务很多,负载越高,代表可能有很多僵死的进程。
通常这种情况是IO密集型的任务,大量任务在请求相同的IO,导致任务队列堆积。
生产环境造成CPU利用率低负载高的具体场景常见的有如下几种。
场景一:磁盘读写请求过多就会导致大量I/O等待进程在CPU上面运行需要访问磁盘文件,这个时候CPU会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候CPU会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。
当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,CPU低的情况。
场景二:MySQL中存在没有索引的语句或存在死锁等情况我们都知道MySQL的数据是存储在硬盘中,如果需要进行SQL查询,需要先把数据从磁盘加载到内存中。
当在数据特别大的时候,如果执行的SQL语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。
同样,可以先通过top命令观察,假设发现现在确实是高负载低使用率。
然后,再通过命令ps -aux查看是否存在状态为D的进程,这个状态指的就是不可中断的睡眠状态的进程。
处于这个状态的进程无法终止,也无法自行退出,只能通过恢复其依赖的资源或者重启系统来解决。
以下图中没有D状态的进程。
Linux上进程的五种状态
R (TASK_RUNNING):可执行状态,只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态。 S (TASK_INTERRUPTIBLE):可中断的睡眠状态,处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。 D (TASK_UNINTERRUPTIBLE):不可中断的睡眠状态,进程处于睡眠状态,但是此刻进程是不可中断的。TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。 T (TASK_STOPPED or TASK_TRACED):暂停状态或跟踪状态。 Z (TASK_DEAD - EXIT_ZOMBIE):退出状态,进程成为僵尸进程。进程已终止,但进程描述还在,直到父进程调用wait4()系统调用后释放。 如果CPU负载很低,利用率却很高该怎么办?这表示CPU的任务并不多,但是任务执行的时间很长,大概率就是你写的代码本身有问题,通常是计算密集型任务,生成了大量耗时短的计算任务。
怎么排查?
直接使用top命令找到CPU使用率最高的进程,定位到去看看就行了。如果代码没有问题,那么过段时间CPU使用率就会下降的。
CPU利用率达到100%怎么排查问题?1、通过top找到CPU占用率高的进程
2、通过top -Hp pid命令查看CPU占比靠前的线程ID
3、再把线程ID转化为16进制,printf "0x%x\n" 74317,得到0x1224d
4、通过命令jstack 72700 | grep '0x1224d' -C5 --color找到有问题的代码
以上就是Linux 面试最高频的 5 个基本问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号