点击上方“民工哥技术之路”选择“星标”

每天10点为你分享不一样的干货

 

原因总结

产生的原因一句话总结就是: 等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。
下面内容是具体的原理分析:
在分析负载为什么高之前先介绍下什么是负载、多任务操作系统、进程调度等相关概念。

什么是负载

什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常)
负载分为两大部分: CPU负载、IO负载
例如,假设有一个进行大规模科学计算的程序,虽然该程序不会频繁地从磁盘输入输出,但是处理完成需要相当长的时间。 因为该程序主要被用来做计算、逻辑判断等处理,所以程序的处理速度主要依赖于cpu的计算速度。 此类cpu负载的程序称为“计算密集型程序”。
还有一类程序,主要从磁盘保存的大量数据中搜索找出任意文件。 这个搜索程序的处理速度并不依赖于cpu,而是依赖于磁盘的读取速度,也就是输入输出(input/output,I/O).磁盘越快,检索花费的时间就越短。 此类I/O负载的程序,称为“I/O密集型程序”。

什么是多任务操作系统

Linux操作系统能够同时处理几个不同名称的任务。但是同时运行多个任务的过程中,cpu和磁盘这些有限的硬件资源就需要被这些任务程序共享。即便很短的时间间隔内,需要一边在这些任务之间进行切换到一边进行处理,这就是多任务。
运行中的任务较少的情况下,系统并不是等待此类切换动作的发生。但是当任务增加时,例如任务A正在CPU上执行计算,接下来如果任务B和C也想进行计算,那么就需要等待CPU空闲。也就是说,即便是运行处理某任务,也要等到轮到他时才能运行,此类等待状态就表现为程序运行延迟。
uptime输出中包含“load average”的数字
[root@localhost ~]# uptime11:16:38 up  2:06, 4 users, load average: 0.00, 0.02, 0.05

Load average从左边起依次是过去1分钟、5分钟、15分钟内,单位时间的等待任务数,也就是表示平均有多少任务正处于等待状态。 在load average较高的情况下,这就说明等待运行的任务较多,因此轮到该任务运行的等待时间就会出现较大的延迟,即反映了此时负载较高。

进程调度

什么是进程调度:
进程调度也被一些人称为cpu上下文切换意思是: CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态: 当前运行任务转为就绪(或者挂起、中断)状态,另一个被选定的就绪任务成为当前任务。 进程调度包括保存当前任务的运行环境,恢复将要运行任务的运行环境。
在linux内核中,每一个进程都存在一个名为“进程描述符”的管理表。 该进程描述符会调整为按照优先级降序排序,已按合理的顺序运行进程(任务)。 这个调整即为进程调度器的工作。
调度器划分并管理进程的状态,如:
  • 等待分配cpu资源的状态。
  • 等待磁盘输入输出完毕的状态。
下面在说一下进程的状态区别:
状态
说明
运行态(running)
只要cpu空闲,任何时候都可以运行
可中断睡眠(interruptible)
为恢复时间无法预测的长时间等待状态。 如,来自于键盘设备的输入。
不可中断睡眠:(uninterruptible)
主要为短时间时的等待状态。 例如磁盘输入输出等待。 被IO阻塞的进程
就绪态(runnable)
响应暂停信号而运行的中断状态。
僵死态(zombie)
进程都是由父进程创建,并销毁; 在父进程没有销毁其子进程,被销毁的时候,其子进程由于没有父进程被销毁,就会转变为僵死态。
下面举例来说明进程状态转变:
这里有三个进程A、B、C同时运行。 首先,每个进程在生成后都是可运行状态,也就是running状态的开始,而不是现在运行状态,由于在linux内核中无法区别正在运行的状态和可运行的等待状态,下面将可运行状态和正在运行状态都称为running状态。
  • 进程A:running
  • 进程B:running
  • 进程C:running
running的三个进程立即成为调度对象。 此时,假设调度器给进程A分配了CPU的运行权限。
  • 进程A:running (正在运行)
  • 进程B:running
  • 进程C:running
进程A分配了CPU,所以进程A开始处理。 进程B和C则在此等待进程A迁出CPU。 假设进程A进行若干计算之后,需要从磁盘读取数据。 那么在A发出读取磁盘数据的请求之后,到请求数据到达之前,将不进行任何工作。 此状态称为“因等待I/O操作结束而被阻塞”。 在I/O完成处理前,进程A就一直处于等待中,就会转为不可中断睡眠状态(uninterruptible),并不使用CPU。 于是调度器查看进程B和进程C的优先级计算结果,将CPU运行权限交给优先级较高的一方。 这里假设进程B的优先级高于进程C。
  • 进程A:uninterruptible (等待磁盘输入输出/不可中断状态)
  • 进程B:running (正在运行)
  • 进程C:running
进程B刚开始运行,就需要等待用户的键盘输入。 于是B进入等待用户键盘输入状态,同样被阻塞。 结果就变成了进程A和进程B都是等待输出,运行进程C。 这时进程A和进程B都是等待状态,但是等待磁盘输入输出和等待键盘输入为不同的状态。 等待键盘输入是无限期的事件等待,而读取磁盘则是必须短时间内完成的事件等待,这是两种不同的等待状态。 各进程状态如下所示:
  • 进程A:uninterruptible (等待磁盘输入输出/不可中断状态)
  • 进程B:interruptible (等待键盘输入输出/可中断状态)
  • 进程C:running (正在运行)
这次假设进程C在运行的过程中,进程A请求的数据从磁盘到达了缓冲装置。 紧接着硬盘对内核发起中断信号,内核知道磁盘读取完成,将进程A恢复为可运行状态。
  • 进程A:running (正在运行)
  • 进程B:interruptible (等待键盘输入输出/可中断状态)
  • 进程C:running (正在运行)
此后进程C也会变为某种等待状态。 如CPU的占用时间超出了上限、任务结束、进入I/O等待。 一旦满足这些条件,调度器就可以完成从进程C到进程A的进程状态切换。

负载的意义:

负载表示的是“等待进程的平均数”。 在上面的进程状态变换过程中,除了running状态,其他都是等待状态,那么其他状态都会加入到负载等待进程中吗?
事实证明,只有进程处于运行态(running)和不可中断状态(interruptible)才会被加入到负载等待进程中,也就是下面这两种情况的进程才会表现为负载的值。
  • 即便需要立即使用CPU,也还需等待其他进程用完CPU
  • 即便需要继续处理,也必须等待磁盘输入输出完成才能进行
下面描述一种直观感受的场景说明为什么只有运行态(running)和可中断状态(interruptible)才会被加入负载。
如: 在很占用CPU资源的处理中,例如在进行动画编码的过程中,虽然想进行其他相同类型的处理,结果系统反映却变得很慢,还有从磁盘读取大量数据时,系统的反映也同样会变的很慢。 但是另一方面,无论有多少等待键盘输入输出操作的进程,也不会让系统响应变慢。

什么场景会造成CPU低而负载确很高呢?

通过上面的具体分析负载的意义就很明显了,负载总结为一句话就是: 需要运行处理但又必须等待队列前的进程处理完成的进程个数。 具体来说,也就是如下两种情况:
  • 等待被授权予CPU运行权限的进程
  • 等待磁盘I/O完成的进程
cpu低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去执行别的任务或空闲,具体场景有如下几种。

场景一:磁盘读写请求过多就会导致大量I/O等待

上面说过,cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。 当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。

场景二:MySQL中存在没有索引的语句或存在死锁等情况

我们都知道MySQL的数据是存储在硬盘中,如果需要进行sql查询,需要先把数据从磁盘加载到内存中。 当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。
具体解决方法可以在MySQL中运行show full processlist命令查看线程等待情况,把其中的语句拿出来进行优化。

场景三:外接硬盘故障,常见有挂了NFS,但是NFS server故障

比如我们的系统挂载了外接硬盘如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。
结束语: 大概内容就是这样,如果有朋友遇到其他场景,欢迎留言补充。
作者:西门飞冰,一名90后it男,一直在北京工作,热爱运动,热爱冒险,热爱旅行。  原文地址:http://www.fblinux.com/?p=281。

关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货。

点我进入红包抽奖页面,感谢阅读,在看与转发支持!

点击【阅读原文】发现更多精彩内容~~

一定不能放弃点“在看”

CPU 使用率低高负载的原因,看看这篇!相关推荐

  1. 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...

    我们都知道,CPU也就是中央处理器,可以说它是电脑的核心部分,相当于人们心脏对于身体的作用,可见其重要性.对于CPU来说,主要是帮助我们的电脑进行处理.运算以及控制数据.而说到与之相关的CPU使用率, ...

  2. CPU 使用率低 负载高的原因

    原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析: 在分析负载为什 ...

  3. cpu使用率低负载高,原因分析(转)

    原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么 ...

  4. cpu使用率低负载高,原因分析-----举例命令排查过程

    原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么 ...

  5. 一次详尽的问题定位记录:CPU使用率低负载高的排查过程

    历史原因,当前有一个服务专门用于处理mq消息,mq使用的阿里云rocketmq,sdk版本1.2.6(2016年). 随着业务的发展,该应用上的consumer越来越多,接近200+,导致该应用所在的 ...

  6. linux主机sys使用率忽高忽低,cpu使用率忽高忽低的原因和解决方法

    小编最近经常听说有的 人电脑cpu使用率老是忽高忽低,也不知道怎么回事虽然没怎么影响使用但是这无疑是一个潜在的隐患等到这个隐患爆发了对电脑的伤害可想而知,今天小编就来和大家说说cpu使用率忽高忽低的原 ...

  7. linux CPU使用率过高或负载过高的处理思路

    linux CPU使用率过高或负载过高的处理思路 1.查看系统CPU负载及使用率的命令为:top    vmstat top 命令:查看进程级别的cpu使用情况. vmstat 命令:查看系统级别的c ...

  8. CPU使用率过高的原因及解决方法

    常见的CPU使用率过高可不是职场CPU哦,而是电脑的中央处理器,CPU作为计算机系统重要的运算和控制核心,可谓是"很忙"的存在.在我们日常使用电脑设备时,由于打开的软件.游戏.网页 ...

  9. 解决win10cpu使用率100_如何正确理解 CPU 使用率和平均负载的关系?看完你就知道了...

    来自公众号:阿里巴巴中间件 CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理.程序运行的最终执行单元,相当于系统的"大脑".当 CP ...

最新文章

  1. trl meaning genearlly we find 6
  2. carsim学习笔记4——构建路面
  3. 一个让程序员男友记住一辈子的 IntelliJ IDEA 插件!
  4. SpringCloud工作笔记047---FastJson解析多级JSON_FastJson解析嵌套JSON_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
  5. 基于谷歌街景多位数字识别技术:TensorFlow的车牌号识别系统
  6. caffe安装简易教程
  7. 使用dos2unix批量转换文件
  8. 自控原理学习笔记-反馈控制系统的动态模型(3)-开环、闭环特征模型
  9. PMOS和NMOS的区分及导通方式
  10. IIS5.1完整安装包使用指南(详解版)
  11. 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...
  12. Android 65536 详解!
  13. 有向图的强连通分量(SCC)
  14. 基于vivado DDS ip核的DDS信号发生器(可调频调相)
  15. 构建属于自己的 jre Docker 镜像
  16. [CodeChef Trips]Children Trips
  17. 【太阳软件】动态ip代理为你详解这些长得很像的代理模式
  18. c++ xlsx、xls另存PDF
  19. Maven打包 关于“There aretest failures”的错误解决
  20. 西门子PLC-S7200smart--------------章节一modbus TCP通信

热门文章

  1. VC6环境下使用图形控件NTGraph的方法和步骤
  2. xp2系统下AMD的CPU双核完整补丁及其安装步骤
  3. ChatGPT:新晋CV工程师
  4. Nexus 7二代 新Nexus 7 中文版ROOT教程
  5. 计算机一级学平均数,excel计算平均值怎么做?计算机一级考试╭(╯ε╰)╮
  6. RSS Can:使用 Golang Rod 解析浏览器中动态渲染的内容:(四)
  7. 一千万条数据,怎么快速查询
  8. 最新!国有高速大数据最新解读及场景浅析
  9. 用python求几个整数的和_python里面整数
  10. 洛咕 P2403 [SDOI2010]所驼门王的宝藏