干货篇 | 平均负载和CPU使用率你还在傻傻分不清楚吗(含案例)

前言

今年春招的时候,那是一个春意盎然的下午,我正在进行一场没有硝烟的战争——面试。我特别清楚地记得,那天是我接种新冠疫苗后的第二天,脑子晕乎乎的,感觉自己没有开机,所以面试过程中回答得不尽人意。(但是面试官真的人很好哈哈哈)

img

鲁迅先生说过:“真正的勇士,敢于直面惨淡的人生”,而我需要敢于直面糟糕的面试

面试结束后,我就赶紧将面试过程中问到的问题记录了下来,并打算做一个复盘

img

其中,让我印象最深的便是“你跟我说说什么是平均负载以及什么是CPU使用率,它们之间有什么关系吗

平均负载

我们先来说说什么是平均负载

我们在终端输入 top 命令或者 uptime 命令,就能显示出系统过去1 分钟、5 分钟、15 分钟的平均负载(如图所示,红框部分)

img

  • 平均负载是指单位时间内,处在可执行状态和不可中断睡眠状态的进程的平均数。也就是说,它包括了处在执行态,阻塞态和就绪态的进程。

可能有小伙伴会问,什么是可执行状态的进程和不可中断睡眠状态的进程?

其中,**可执行状态的进程包括正在被CPU执行的进程以及在就绪队列上等待CPU执行的进程,**也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程(也就是进程的三个基本状态中的执行态和就绪态)

而不可中断睡眠状态的进程即指处于内核关键流程中的进程,并且这些流程不可被打断。比如最常见的就是等待硬件设备的I/O响应。也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程(也就是进程的三个基本状态中的阻塞态)。

介绍完了什么是平均负载后,可能有小伙伴又会问:怎么判断系统的负载情况是否过大过小呢?

这里我举一个简单的例子

假设系统上有两个CPU:如果负载为1,那么意味着CPU有百分之50的空闲如果负载为2,那么意味着所有的CPU都刚好被完全占用如果负载为4,那么意味着有超过一半的进程竞争不到CPU

如何判断系统的平均负载是否合理?

  • 如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
  • 但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载,即系统的负载在逐渐减少。
  • 反过来,如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了。
  • 在实际生产环境中,当平均负载高于 CPU 数量 70% 的时候,我们就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能

这里我再举个简单的例子:

假设我们在一个只有一个CPU的系统上看到平均负载为:1.73,0.60,7.98。那么说明在过去1分钟内,系统有73%的超载,在过去15分钟内,系统更是达到了698%的超载,但就整体趋势来看,系统的负载是逐渐降低的。

CPU使用率

讲完平均负载,我们再来了解一下CPU使用率。

CPU使用率是指在单位时间内CPU处在非空闲态的时间比,反映了CPU的繁忙程度

比如说:比如说单核CPU一秒内处在非空闲态的时间为0.6秒,那么它的CPU使用率就是60%

而双核CPU一秒内处在非空闲态的时间分别为0.6s和0.4s,那么它的CPU使用率为(0.4+0.6)/ 2 * 100% = 50%

看到这里,想必大家都对这两个概念有一个大体上的了解了吧

总的来说,系统负载或者说系统的平均负载,它的参考标准是进程数;而CPU使用率的参考标准是CPU的忙碌时

俗话说:“NO PICTURE NO BB ”,为了让大家更直观的感受这两个概念的区别,我将会配合着图再讲解一个例子:

有一家银行,他只有一个业务窗口,每次只能接待一个人(单核CPU)。有一天一共有五个人来了,那么就会出现一人在办理手续,其余四人在等待的情况(CPU负载为5)我们约定在业务窗口的那个人只有真正在办理业务才算是真正使用这个窗口,才算意味着窗口在忙碌(CPU使用率)

在这里插入图片描述

平均负载和CPU使用率的关系

在介绍完了这两个概念之后,真正的重点内容才刚刚开始

前面我们说到,面试官的最后一个问题就是:平均负载和CPU使用率的关系

也就是说CPU使用率的升高与下降跟平均负载的增大与减小有没有什么关系,我将通过下面这个案例来跟大家讲解一下。

CPU使用率高的情况

案例开始前,我先简单说明一下本次案例的虚拟机的配置

  • 内存1GB
  • 一个CPU
  • 版本:CentOS 7.6

首先下载相关工具包

其中 sysstat 工具是用来查看系统的整体性能情况的,例如CPU使用率和平均负载这些指标,而 stress 则是一个压力测试工具,用来模拟出各种性能压力

# 下载相关工具包
 yum install -y sysstat stress

之后我们使用 stress 工具来模拟CPU使用率为100%

#--timeout 600:持续时间为600s
stress --cpu 1 --timeout 600

接着等待一段时间,我们来看一下系统的平均负载情况

uptime... load average: 1.11, 0.59, 0.29

可以看到,在单核CPU系统里,过去的时间里的平均负载是在逐渐上升的,而过去1分钟内的平均负载甚至达到了1.11,这说明CPU已经被完全占满。

我们使用 sysstat 工具包中的 mpstat 查看 cpu 性能情况

mpstat -P ALL 5

在这里插入图片描述

这里我们可以看到,用户态CPU使用率已经达到了100%

总结:CPU使用率的升高会导致系统平均负载的上升

除此之外:

  • 系统内出现大量等待I/O的进程(系统I/O压力大)的时候也会导致平均负载升高,但是CPU使用率不一点升高
  • 系统内出现大量的进程,进程数远远超过了CPU数量的情况下也会导致平均负载的升高和CPU使用率的升高

总结

我们来回顾一下今天所学的内容:

  • 系统负载:指处在可执行状态和不可中断状态的进程的总数

    • 可执行状态的进程:表示正在被CPU执行的和在就绪队列中等待被CPU执行的进程
    • 不可中断状态进程:表示当前该进程正在等待某种事件的响应,并且这个状态是不可被打断的,比较常见的有跟硬件交互的时候、等待硬件I/O
  • 系统平均负载:单位时间内处在可执行状态和不可中断状态的进程的平均数

  • CPU使用率:表示在单位时间内CPU处在非空闲态的时间比,反映了CPU的繁忙程度

  • CPU使用率升高会导致系统平均负载的升高

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Spark Streaming 和 Flink 都是流处理框架,但在一些方面有所不同。 1. 数据处理模型 Spark Streaming 基于批处理模型,将流数据分成一批批进行处理。而 Flink 则是基于流处理模型,可以实时处理数据流。 2. 窗口处理 Spark Streaming 的窗口处理是基于时间的,即将一段时间内的数据作为一个窗口进行处理。而 Flink 的窗口处理可以基于时间和数据量,可以更加灵活地进行窗口处理。 3. 状态管理 Spark Streaming 的状态管理是基于 RDD 的,需要将状态存储在内存中。而 Flink 的状态管理是基于内存和磁盘的,可以更加灵活地管理状态。 4. 容错性 Flink 的容错性比 Spark Streaming 更加强大,可以在节点故障时快速恢复,而 Spark Streaming 则需要重新计算整个批次的数据。 总的来说,Flink 在流处理方面更加强大和灵活,而 Spark Streaming 则更适合批处理和数据仓库等场景。 ### 回答2: Spark Streaming 和 Flink 都是流处理框架,它们都支持低延迟的流处理和高吞吐量的批处理。但是,它们在处理数据流的方式和性能上有许多不同之处。下面是它们的详细比较: 1. 处理模型 Spark Streaming 采用离散化流处理模型(DPM),将长周期的数据流划分为离散化的小批量,每个批次的数据被存储在 RDD 中进行处理,因此 Spark Streaming 具有较好的容错性和可靠性。而 Flink 采用连续流处理模型(CPM),能够在其流处理过程中进行事件时间处理和状态管理,因此 Flink 更适合处理需要精确时间戳和状态管理的应用场景。 2. 数据延迟 Spark Streaming 在处理数据流时会有一定的延迟,主要是由于对数据进行缓存和离散化处理的原因。而 Flink 的数据延迟比 Spark Streaming 更低,因为 Flink 的数据处理和计算过程是实时进行的,不需要缓存和离散化处理。 3. 机器资源和负载均衡 Spark Streaming 采用了 Spark 的机器资源调度和负载均衡机制,它们之间具有相同的容错和资源管理特性。而 Flink 使用 Yarn 和 Mesos 等分布式计算框架进行机器资源调度和负载均衡,因此 Flink 在大规模集群上的性能表现更好。 4. 数据窗口处理 Spark Streaming 提供了滑动、翻转和窗口操作等灵活的数据窗口处理功能,可以使用户更好地控制数据处理的逻辑。而 Flink 也提供了滚动窗口和滑动窗口处理功能,但相对于 Spark Streaming 更加灵活,可以在事件时间和处理时间上进行窗口处理,并且支持增量聚合和全量聚合两种方式。 5. 集成生态系统 Spark Streaming 作为 Apache Spark 的一部分,可以充分利用 Spark 的分布式计算和批处理生态系统,并且支持许多不同类型的数据源,包括Kafka、Flume和HDFS等。而 Flink 提供了完整的流处理生态系统,包括流SQL查询、流机器学习和流图形处理等功能,能够灵活地适应不同的业务场景。 总之,Spark Streaming 和 Flink 都是出色的流处理框架,在不同的场景下都能够发挥出很好的性能。选择哪种框架取决于实际需求和业务场景。 ### 回答3: Spark Streaming和Flink都是流处理引擎,但它们的设计和实现方式有所不同。在下面的对比中,我们将比较这两种流处理引擎的主要特点和差异。 1. 处理模型 Spark Streaming采用离散流处理模型,即将数据按时间间隔分割成一批一批数据进行处理。这种方式可以使得Spark Streaming具有高吞吐量和低延迟,但也会导致数据处理的粒度比较粗,难以应对大量实时事件的高吞吐量。 相比之下,Flink采用连续流处理模型,即数据的处理是连续的、实时的。与Spark Streaming不同,Flink的流处理引擎能够应对各种不同的实时场景。Flink的实时流处理能力更强,因此在某些特定的场景下,它的性能可能比Spark Streaming更好。 2. 窗口计算 Spark Streaming内置了许多的窗口计算支持,如滑动窗口、滚动窗口,但支持的窗口计算的灵活性较低,只适合于一些简单的窗口计算。而Flink的窗口计算支持非常灵活,可以支持任意窗口大小或滑动跨度。 3. 数据库支持 在处理大数据时,存储和读取数据是非常重要的。Spark Streaming通常使用HDFS作为其数据存储底层的系统。而Flink支持许多不同的数据存储形式,包括HDFS,以及许多其他开源和商业的数据存储,如Kafka、Cassandra和Elasticsearch等。 4. 处理性能 Spark Streaming的性能比Flink慢一些,尤其是在特定的情况下,例如在处理高吞吐量的数据时,在某些情况下可能受制于分批处理的架构。Flink通过其流处理模型和不同的调度器和优化器来支持更高效的实时数据处理。 5. 生态系统 Spark有着庞大的生态系统,具有成熟的ML库、图处理库、SQL框架等等。而Flink的生态系统相对较小,但它正在不断地发展壮大。 6. 规模性 Spark Streaming适用于规模小且不太复杂的项目。而Flink可扩展性更好,适用于更大、更复杂的项目。Flink也可以处理无限制的数据流。 综上所述,Spark Streaming和Flink都是流处理引擎,它们有各自的优缺点。在选择使用哪一个流处理引擎时,需要根据实际业务场景和需求进行选择。如果你的业务场景较为复杂,需要处理海量数据并且需要比较灵活的窗口计算支持,那么Flink可能是更好的选择;如果你只需要简单的流处理和一些通用的窗口计算,Spark Streaming是更为简单的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼Linux运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值