一起CPU很闲,load却很大的案例分析

news2024/11/30 2:29:46

1、软硬件环境

        硬件: 飞腾E2000Q 平台

        软件: linux 4.19.246

2、问题现象

系统在上电后,无意中发现系统的平均负载很大,数值显示远超过cpu的承载能力。心想也没有跑什么业务程序呀,吓得赶紧运行top命令,瞅一瞅CPU都在干些啥么,然后4个CPU 都表示我一直在摸鱼呀,啥也没干,100%的空闲,没有做任何事情,而且有图有真相!

系统的average load 表示过去1分钟、5分钟、15分钟的平均负载分别为12、9.4、4.67

这个结果就表示我一个4人团队,你要我做12个人的活??当然这也不是不可以,CPU有自己的队列机制管理,不行就排队呗。

但是CPU在空闲的情况下,为何load会很大呢?


 

3 问题分析

 要搞明白这个问题,首先要搞明白 何种情况下消耗的CPU时间会被计算进average load ?

其实这个问题在之前的文章中已经讲过:深度睡眠和浅度睡眠 这里再简单叙述一下

CPU的load 其实是指 CPU的 任务队列里的 具有的负载量。 

比如,任务队列里有1个满负载的任务,load=1 , 如果有2个满负载的任务,load=2 (不管几个核都是2)。但是如果就1个核的话,load > 1 就说明 负载有点重了。但是如果 load = 2 , 有 4个核,说明负载还算轻松,因为还有2个空闲的核(团队还有2个人可以干活)。如果有两个不是满负载的任务,0.3  0.4 这两个任务的负载加起来0.7的负载 ,1个核 就可以很轻松。

但是 load average 只看CPU的话,有些情况下会不准。

比如下面的情况,正常质量高性能高的硬件,计算出来的load average应该低,质量差性能低的硬件计算出来的 load average 应该高。

举例,读磁盘的操作,是包括CPU消耗 + IO消耗的一种操作,同样都是1Ghz 的CPU ,同样的代码,在高速硬盘上和低速软盘上跑起来的结果可能就是不一样。

高速硬盘 80%的时间花费在了CPU上,而低速硬盘,绝大部分时间花在了读磁盘上(CPU等待磁盘IO)。这样计算的就不准了。

所以load的统计就把CPU等待磁盘IO的时间计算上了。

所以,一般 load average 高的话,CPU利用率又很低,要么你用了 task_uninterruptible 要么你的磁盘很慢。因为磁盘的睡眠都是task_uninterruptible的。那为什么磁盘的睡眠是深度睡眠又不能被中断的呢?举个例子就是代码的执行是一边load,一边执行的,这个过程是不能被中断的!

以上我们可知,睡眠的进程/线程( D状态),是会被统计到 CPU的 load里的!

那么我们的思路就来了!

1、看看系统里有没有读写磁盘的操作,有没有CPU在等待IO的情况

2、寻找D状态的进程或者线程,看看到底是谁在搞怪!

我们首排查第1点。

iostat显示 没有磁盘的读写!排除这种情况!

 通过ps命令看到两种内核线程是D状态的,他们的睡眠时间会被统计到average load中的

 第二个内核线程board是我们其中一个驱动的,禁掉以后,问题依然存在,那么osal_kthread就是最大的嫌疑人了!

我们来看看它到底是何方神圣,在内核代码里我们查询它的蛛丝马迹

 这是飞腾CPU SCE security的驱动,该驱动我们用不到,禁掉以后,系统运行2小时,load显示很低了!

到这里,我们已经确定罪魁祸首就是它了!下面我们看看它的内核线程是不是是不是在睡觉。

在它的主体驱动框架里 看到 drivers/crypto/te/merak_driver/common/te_worker.c,在没有工作任务的时候就去睡觉!

从上图可以看出,实际的休眠是在OSAL_COMPLETION_COND_WAIT()完成的, 但是这里依然看不到TASK_UNINTERRUPTIBLE, 还是无法确定是深度睡眠,我们继续往下挖。

OSAL_COMPLETION_COND_WAIT()
	--> osal_completion_wait()
		-->wait_for_completion()

 最后一个函数 wait_for_completion 的睡眠就是 TASK_UNINTERRUPTIBLE的!!!

到这里,验证了下面这句话:

一般 load average 高的话,CPU利用率又很低,要么你用了 task_uninterruptible 要么你的磁盘很慢。

以上,解释了为什么top显示4个核都空闲,load会很大的原因。 

4 总结

  • 磁盘IO读写在排队的时候,是深度睡眠
  • 深度睡眠 uninterruptible sleep 的进程/线程会被标记成D状态,不响应任何信号,杀不掉
  • CPU 的load 不光统计CPU消耗的时间,D状态进程睡眠时间也会被统计上。
  • 一般 load average 高的话,CPU利用率又很低,要么你用了 task_uninterruptible 要么你的磁盘很慢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人车端到端驾驶模型概述

摘要: 通常,端到端驾驶模型使用一个深度神经网络来完成这种映射,网络的所有参数为联合训练而得。这种方法因它的简洁高效而引人关注。 引言 在搭建无人车时,我和小伙伴们的主要工作是建立一个驾驶模型。所谓的驾驶模型是控制无人…

idea模板配置

idea版本:2023.1 未设置模板的idea,新建类会自动生成类注释 格式如下: /*** author user* date 2023/5/20 0020 14:25*/ public class User {} 其中,user为当前用户名 这里,如果希望将类注释改写成如下&#xff0…

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术,只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺,休息好了再继续卷,卷是常态,“仰卧起坐”也好,“卷的姿势”也好,都是在反复“卷起”的过程中寻找一些舒适和平衡…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息,我一直觉得,如果那真的发生了,会是人类的悲哀。 由于之前我存储的地址又挂了,所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下,发现有三个地址。 他说这第一个…

智能CAN/串口协议转换器LCNET Pro RS-232/485

智能CAN/串口协议转换器LCNET Pro RS-232/485提供一路RS-485、一路RS-232和一路CAN通道,实现CAN与串口RS-485或RS-232之间的双向数据智能转换。每个通道独立隔离,每路通道采用金升阳电源模块和信号隔离芯片实现2500VDC电气隔离,电源输入防反设…

基于Redis的Java分布式锁,接口并发处理,并发方案

Redis的分布式锁很多人都知道,比如使用Jedis的setNx、incr等方法都可以实现分布式锁的功能,但是Jedis需要自己管理连接池,就稍微麻烦一点。 今天介绍的是使用RedisTemplate切面编程自定义注解SPEL来实现分布式锁的功能,封装完成后…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应: 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉,这就是雪崩效应,那么其实短信服务又不是我们主要业务,这个时候我们可以采用服务降级,服务降级就是暂时的把短信服务停…

java学习——ArrayList和泛型(学习记录)

学习资料来自菜鸟教程 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 ArrayList 类位于 java.util 包中,使…

事件驱动模型IO模型

什么是事件驱动模型? 事件驱动模型是一种计算机编程模型,它通过等待事件的触发,在事件被触发时执行对应的处理函数。这种模型下,程序不再按照严格的顺序执行命令,而是以事件为驱动进行执行。事件驱动模型更适合处理大…

[RSA议题分析] Finding Vulnerabilities through Static Analysis and Scripting

文章目录 简介议题分析发现漏洞 - 什么时候/为什么什么是漏洞挖掘漏洞价值 如何挖洞逆向工程环境从哪开始挑战 总结 简介 作者讲了挖漏洞的目标,和一些常用的挖漏洞的方法和如果你像现在开始挖掘二进制漏洞,那么你可以从memcpy开始。除此之外&#xff0…

【SpringBoot系列】Spring EL表达式的简介和快速入门

介绍 Sping EL(Spring Expression Language 简称 SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象,它可以与 XML 或基于注解的 Spring 配置一起使用。语言语法类似于统一 EL,但提供了额外的功能,方法调用和字…

springboot+vue藏区特产销售平台(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的藏区特产销售平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

产品经理如何使用集简云实现工作流程自动化?

场景描述 作为一名产品经理,需要每天面对来自各个部门的需求,平时的工作内容更是复杂繁琐,画流程图、产品开发周期、产品描述、设计团队协作,新产品培训会、用户需求会,或跟进 bug 修复等等等等…… 对内不仅要参与业…

STM32与ESP32下载器设计

文章目录 背景STM32下载器使用现成的DAPlink选择自制DAPlink ESP32/ESP8266下载器连接接口STM32接口ESP32接口 背景 我们常用的单片机主要有STM32和ESP32,其中STM32下载要求SWD下载接口,ESP32下载要求串口,但需要控制ESP32 IO0和EN口高低电平…

前端人必须掌握的抓包技能(原理到实践)

目录 1. 前言 2. 抓包的原理 2.1 什么是抓包? 2.2 HTTP/HTTPS 抓包原理 2.2.1 HTTP 抓包原理 2.2.2 HTTPS 抓包原理 2.3 电脑如何抓手机的包 3. 抓包工具 whistle 3.1 whistle 是什么 如何快速使用 whistle 3.2 whistle 可以做的事情 4. whistle 实战案…

HP打印机网络连接扫描仪失败

财务反映,使用主机上的HP LaserJet Pro M329-HP Scan连接扫描仪提示失败。 测试果然失败,提示如下图: 点击修复后,提示 需要安装HP Print and Scan Doctor。 同意安装,并启动HP Print and Scan Doctor 点击开始,其开始搜索,过程有点慢。 第一次发现其连接错误,居然…

液晶显示常用概念

文章目录 数字液晶显示消隐区水平(行)消隐 HBlank垂直(场)消隐 VBlank RGB格式RGB555RGB565RGB888 VGA驱动原理时钟信号像素时钟同步信号DE信号(有效数据选通信号)DE信号与其他信号的关系 数字液晶显示消隐…

golang webhook源码和案例配合gitee实践

下载golang webhook源码和案例: https://download.csdn.net/download/qq_32421489/87824180 解压后go mod tidy下载依赖包 修改打包环境为Linux: go env -w GOOSlinux 打包命令:go build 打包后的可运行程序上传服务器后:参…

用本地连接集群进行压力测试,让你的测试更快更有效!

目录 引言 背景 详细步骤 1、首先打开终端 2、安装kubectl 3、配置kubeconfig 4.准备本地仓库文件 5.启动集群执行脚本 总结 引言 测试是软件开发中至关重要的一环,但长时间的等待和低效率的测试却常常让人感到烦躁。现在,我们推出了全新的解决…

真的裂开了呀,现在的00后,真是卷死了

谁说00后躺平了,但是有一说一,该卷的还是卷。这不,上个月我们公司来了个00后,工作没两年,跳槽到我们公司起薪22K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 …