Linux 面试最高频的 5 个基本问题

发布时间 - 2025-06-26 00:00:00    点击率:

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  # mysql  # windows  # 操作系统  # ai  # 区别  # sql语句  # sql  # printf  #   # 线程  # 事件  # 就会  # 都是  # 死锁  # 多个  # 时间内  # 很高  # 的是  # 很低  # 小段 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  利用python获取某年中每个月的第一天和最后一天  网站建设保证美观性,需要考虑的几点问题!  如何获取PHP WAP自助建站系统源码?  Laravel怎么上传文件_Laravel图片上传及存储配置  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  微信推文制作网站有哪些,怎么做微信推文,急?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  北京企业网站设计制作公司,北京铁路集团官方网站?  常州企业网站制作公司,全国继续教育网怎么登录?  教学论文网站制作软件有哪些,写论文用什么软件 ?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  长沙企业网站制作哪家好,长沙水业集团官方网站?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  nginx修改上传文件大小限制的方法  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  轻松掌握MySQL函数中的last_insert_id()  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel如何实现模型的全局作用域?(Global Scope示例)  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  高防服务器租用首荐平台,企业级优惠套餐快速部署  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何在腾讯云免费申请建站?  Python高阶函数应用_函数作为参数说明【指导】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何快速搭建安全的FTP站点?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel如何创建自定义中间件?(Middleware代码示例)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  如何在万网主机上快速搭建网站?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  JS弹性运动实现方法分析  微信小程序 require机制详解及实例代码  微信小程序 五星评分(包括半颗星评分)实例代码  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何在云虚拟主机上快速搭建个人网站?  如何在阿里云高效完成企业建站全流程?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像