CPU 使用率低 负载高的原因

2023-11-17

原因总结

产生的原因一句话总结就是:等待磁盘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 ~]# uptime
 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资源的状态。
  • 等待磁盘输入输出完毕的状态。

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

状态 说明
运行态(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故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。


常见的处理办法

网站相关进程导致负载高处理办法

  1. 直接把网站php或http或tomcat等网站服务重启,很多时候负载就降下来了
  2. 也可能是网站代码漏洞导致的,需要反馈开发一起查找原因和处理
  3. 把重复的tomcat kill全部掉重新启动

mysql进程导致的负载高处理办法

  1. 常见的就是mysql慢查询导致,可以在mysql慢查询日志找到相关sql语句,这需要对sql进行优化
  2. 还可以进入mysql,用show full processlistG;查看那个mysql进程执行时间比较久的慢查询。如果是内部后台使用的语句,可以先kill掉,优化后再执行。
  3. mysql读写太频繁,如果是读写频繁可以在%wa等待输入输出看的出来占用cpu百分比很大。也可以通过命令iostat查看系统读写情况。

还有可能是网络原因,系统硬件原因等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU 使用率低 负载高的原因 的相关文章

  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR

随机推荐

  • 小白的高德地图初体验(一) —— 打点

    小白的高德地图初体验 一 打点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • NetBeans下载安装

    1 下载 网址 Apache NetBeans Releases 2 安装 执行exe 选择安装目录和jdk
  • qemu搭建和运行起来一个linux内核环境

    qemu搭建和运行起来一个linux内核环境 参考了博客 搭建linux调试环境 一 qemu环境搭建vexpress开发平台 Edver 博客园 嵌入式Linux之QEMU模拟器 4 使用busybox制作根文件系统 ReCclay的博客
  • 【数字图像处理】图像的几何变换

    文章目录 图像几何变换的一般思路 图像平移 图像镜像 图像转置 图像缩放 图像旋转 插值算法 最近邻插值 双线性插值 高阶插值 包含相同内容的两幅图像可能由于成像角度 透视关系乃至镜头自身原因所造成的几何失真而呈现截然不同的外观 通过适当的
  • 【类】二维dp:动态规划背包问题

    dp n m 含义就是 当有n种物品时且背包有m容量时 这个背包能产生的最大价值 状态转换关系是 dp n m dp n 1 m dp n 1 m 新物品重量 意思就是 当面对新来的一个物品时 求这个情况下 背包能产生的最大价值 相当于求下
  • GB/T 35273—2020《信息安全技术个人信息安全规范》正式发布

    GB T 35273 2020 信息安全技术个人信息安全规范 2020年3月6日 国家市场监督管理总局国家标准化管理委员会正式发布 GB T 35273 2020 信息安全技术个人信息安全规范 GB T 35273 2020 信息安全技术个
  • LeetCode 53 最大子序列和

    给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 示例 输入 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6 进阶 如果你已经实现复杂度为 O
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?

    Go 面试系列 Goroutine 数量是越多越好吗 设置多少会影响GC调度呢 前言 现在的大厂都开始慢慢使用Go语言了 例如字节已经把Go作为后端开发的主要编程语言 但是Go的面试题总结的比较少 于是打算开启这个专栏 一起学习一起进步 前
  • 使用Koa2进行Web开发(二)静态文件与路由

    静态文件处理 这里选择koa static作为处理静态文件的中间件 const Koa require koa const app new Koa const serve require koa static app use serve d
  • redis连接数合理配置_redis连接数配置多少

    redis客户端连接数 redis通过监听一个TCP端口或socket的方式接收来自客户端的连接 当与客户端建立连接后 redis内部会进行如下操作 1 客户端socket会被设置为非阻塞模式 因为redis在网络时间处理上采用的是非阻塞多
  • 1σ Random Jitter of SSB for TIE & Period

    1 Random Jitter of SSB for TIE Period 该章节厘清了jitter基本概念 并给出了对应的表达式
  • python接口自动化7-post文件上传

    前言 文件上传在我们软件是不可少的 最多的使用是体现在我们后台 当然我们前台也会有 但是了解过怎样上传文件吗 这篇我们以禅道文档 创建文档 上传文件为例 post请求中的 Content Type multipart form data 这
  • 信息安全专业毕业设计选题推荐汇总

    大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的升学就业做准备 一边要为毕业设计耗费大量精力 学长给大家整理了信息安全专业不同方向最新精选选题 如对选题有任何疑问 都可以问学长哦 基于密码学的数据加密算
  • 字节跳动基于 Apache Hudi 的湖仓一体方案及应用实践

    300万字 全网最全大数据学习面试社区等你来 主流数仓架构 目前主流的数仓架构 Lambda 架构 能够通过实时和离线两套链路 两套代码同时兼容实时数据与离线数据 做到通过批处理提供全面及准确的数据 通过流处理提供低延迟的数据 达到平衡延迟
  • 探索智能文字识别:技术、应用与发展前景

    探索智能文字识别 技术 应用与发展前景 前言 一张图全览 大赛作品解读 随心记 你不对我对 小结 智能文字识别体系化解读 图像预处理 文字定位和分割 文字区域识别 图像校正 字体识别和匹配 结果后处理 小结 如何应对复杂场景下挑战 复杂场景
  • 数据库 SQL 实验报告存储过程和触发器

    年级 班号 组号 学号 专业 日期 姓名 实验名称 实验九 存储过程和触发器 实验室 实验 目的 或 要求 1 掌握存储过程的概念 作用 分类及对应的创建 删除语句的语法格式 2 掌握触发器的概念 作用 分类及对应的创建 删除语句的语法格式
  • 树莓派4b如何打开摄像头

    我主要用的方法是mjpg streamer 使用树莓派摄像头用input raspicam so input uvc so是USB插口摄像头使用 一开始是想用这个树莓派这个库的 但是解压下来发现 好家伙 就他没有 再尝试了各种办法之后都没有
  • C++编程故障处理——redefinition

    报错 src includes cpp error redefinition of const double variable src includes cpp error const double variable previously
  • google native client

    google native client 参考 1 https code google com p nativeclient 2 http www cnblogs com phinecos archive 2008 12 12 135381
  • CPU 使用率低 负载高的原因

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