加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

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

发布时间:2019-09-25 12:55:20 所属栏目:Windows 来源:民工哥技术之路
导读:副标题#e# 原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。 下面内容是具体的原理分析: 在分析负载为什么高之前先介绍下什么是负载、多任务操作系
副标题[/!--empirenews.page--]

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

原因总结

产生的原因一句话总结就是:等待磁盘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空闲。也就是说,即便是运行处理某任务,也要等到轮到他时才能运行,此类等待状态就表现为程序运行延迟。

  1. uptime输出中包含“load average”的数字  
  2. [root@localhost ~]# uptime  
  3. 11: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资源的状态。
  • 等待磁盘输入输出完毕的状态。

下面在说一下进程的状态区别:

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

下面举例来说明进程状态转变:

这里有三个进程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状态,其他都是等待状态,那么其他状态都会加入到负载等待进程中吗?

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读