当前位置: 首页 > Linux

PerformanceBasics了解Linux系统平均负载和CPU使用率

时间:2023-04-07 00:09:35 Linux

前言作为性能测试工程师,每当发现电脑变慢时,我们通常的标准姿势就是执行uptime或top命令来了解系统负载情况。比如如下图,我在命令行输入uptime命令,系统会返回一行信息。appletekimbp:~apple$uptime20:44up21days,6:41,2users,loadaverages:2.852.332.91但是我想问的是,你们知道上面每一列输出的意思吗?20:44当前时间到21天,6:41系统运行时间2个用户正在登录系统平均负载为系统在1分钟、5分钟、15分钟内的平均负载。loadaverages:2.852.332.91这行信息显示屏后半部分显示“loadaverage”,意思是“系统的平均负载”,里面有三个数字,可以判断系统负载是否是大还是小。什么是系统平均负载?估计有同学会说,平均负载不就是单位时间的CPU使用率吗?上面的2.85表示CPU使用率为285%。事实上,情况并非如此。CPU负载值表示在Linux系统上正在运行的作业的平均数量,处于可运行状态(读取一组机器语言的程序指令对应于进程执行线程),或者非常重要的是休眠但不可中断(不可中断)交错睡眠状态))。也就是说,要计算CPU负载值,只考虑正在运行或等待分配CPU时间的进程。不考虑正常睡眠进程(休眠)、僵尸进程或停止进程。简单来说,平均负载是指单位时间内系统处于可运行、不可中断状态的平均进程数,即平均活跃进程数,与CPU使用率没有直接关系。进程状态代码R正在运行或可运行(在运行队列中)D不可中断睡眠(通常是IO)S可中断睡眠(等待事件完成)Z死亡/僵尸,终止但未被其父进程停止T,由作业控制停止信号还是因为被tracked[...]这里先解释可运行状态和不可中断状态。可运行进程是指正在使用CPU或者正在等待CPU的进程,也就是我们经常用ps命令看到的处于R状态(Running或Runnable)的进程。处于不可中断状态的进程是指在内核态中处于关键进程的进程,这些进程是不可中断的,比如等待硬件设备的I/O响应。也就是我们在Ps命令中看到的D态(UninterruptibleSleep,又称DiskSleep)过程。例如,一个进程在磁盘上读写数据时,为了保证数据的一致性,在得到磁盘的回复之前不能被其他进程打断或者中断,此时的进程处于一个不间断状态。如果此时进程中断,很容易出现磁盘数据和进程数据不一致的问题。因此,不可中断状态实际上是系统对进程和硬件设备的一种保护机制。因此,我们可以简单的理解为平均负载实际上就是平均活跃进程数。平均活跃进程数直观理解为单位时间内的活跃进程数。由于平均值是活动进程数,因此理想情况下每个CPU上应该只有一个进程在运行,以便每个CPU得到充分利用。以下是单核处理器计算机中不同负载值的含义:0.00:没有作业正在运行或等待CPU执行,即CPU完全空闲。因此,如果一个正在运行的程序(进程)需要执行一项任务,它会向操作系统请求CPU,并立即将CPU时间分配给该进程,因为没有其他进程在争夺它。0.50:没有作业在等待,但CPU正在处理之前的作业,并且它的处理能力为50%。在这种情况下,操作系统也可以立即将CPU时间分配给其他进程,而不会暂停。1.00:队列中没有作业,但CPU正在以100%的容量处理以前的作业,因此如果一个新进程请求CPU时间,它必须等待另一个作业完成或当前CPU套接字时间(例如,CPUtick)由于,操作系统决定给定进程优先级的下一个。1.50:CPU作业达到其容量的100%,15个作业中有5个请求CPU时间,即33.33%,并且必须排队等待其他作业用完分配的时间。因此,一旦超过1.0的阈值,系统就可以说是超载了,因为它无法立即处理100%的请求工作。显然,“loadaverage”的值越低,比如0.2或0.3,代表服务器的工作量越小,系统负载越低。上面的类比看不懂怎么办?好吧,让我们看一个简单的类比。我们先假设最简单的情况,你的电脑只有一个CPU,所有的操作都必须由这个CPU完成。那么,我们不妨把这个CPU想象成一座桥,桥上只有一条车道,所有的车辆都必须通过这条车道。(显然,这座桥是单向的。)系统负载为0,这意味着桥上没有汽车。0.5的系统负载意味着一半的桥梁被车辆占用。1.0的系统负载意味着桥的所有段都充满了流量,这意味着桥是“满的”。然而,必须指出的是,在此之前,这座桥仍然可以通车。系统负载为1.7,表示车辆太多,桥已经被占用(100%),等待上桥的车辆占桥上车辆的70%。以此类推,2.0的系统负载意味着等待上桥的车辆与桥面上的车辆一样多;系统负载为3.0意味着等待上桥的车辆数量是桥面上车辆数量的两倍。简而言之,当系统负载大于1时,后面的车辆必须等待;系统负载越大,他们必须等待过桥的时间就越长。CPU系统负载基本等同于上面的类比。网桥的通行能力是CPU的最大工作量;桥上的车辆是等待CPU处理的进程。如果CPU每分钟最多可以处理100个进程,那么系统负载0.2就意味着CPU在这1分钟内只处理了20个进程;系统负载1.0表示CPU在这1分钟内恰好处理了100个进程;系统负载1.7,这意味着除了CPU正在处理的100个进程之外,还有70个进程正在排队等待CPU处理。为使电脑运行顺畅,系统负载不要超过1.0,这样就没有进程需要等待,所有进程都可以在第一时间处理。显然,1.0是一个临界值,超过这个值,系统就不是最佳状态了,你要干预。多处理器和多核系统在具有多个处理器或内核(多个逻辑CPU)的系统中,CPU负载值的含义取决于系统中存在的处理器数量。因此,具有4个处理器的计算机在达到4.00的负载之前不会以100%使用,因此在解释top、htop或uptime等命令给出的3个负载值时,您要做的第一件事是将它们分开。系统中存在的逻辑CPU数量并从中得出结论。例如,如果您的计算机有2个CPU会怎样?2个CPU意味着计算机的处理能力增加了一倍,同时可以处理的进程数也增加了一倍。还是用桥来比喻,两个CPU意味着桥有两条车道,通行能力翻了一番。所以两个CPU表示系统负载可以达到2.0,此时每个CPU可以达到100%的工作负载。一般而言,对于具有n个CPU的计算机,最大可接受的系统负载为n.0。芯片厂商往往在一个CPU内部包含多个CPU核心,称为多核CPU。在系统负载方面,多核CPU类似于多个CPU,所以在考虑系统负载时,必须考虑这台电脑有多少个CPU,每个CPU有多少个核心。然后,将系统负载除以内核总数,只要每个内核的负载不超过1.0,计算机就可以正常工作。您如何知道您的PC有多少个CPU内核?CPU利用率如果我们查看在给定时间间隔内通过CPU的不同进程,利用率百分比将表示CPU执行与每个进程对应的指令的时间相对于该时间间隔的分数。但是这样的计算只考虑正在运行的进程,而不是那些正在等待的进程,无论它们是在队列中(可运行状态)还是睡眠但不可中断(例如等待I/O操作结束)。因此,该指标可以让我们了解哪些进程对CPU的挤压最大,但如果系统过载或未充分利用,则无法提供系统状态的真实情况。在实际工作中,我们经常将平均负载与CPU使用率混淆。由上可知,平均负载是指单位时间内处于可运行状态和不可中断状态的进程数。所以,它不仅包括正在使用CPU的进程,还包括等待CPU和等待I/O的进程。至于CPU占用率,从上面的解释我们知道是单位时间内的繁忙程度,不一定和平均负载完全对应。例如:对于一个CPU密集型进程,大量使用CPU会导致平均负载增加,此时两者是一致的。I/O密集型进程,等待I/O也会导致更高的平均负载,但不一定会导致CPU使用率高。调度大量等待CPU的进程也会导致平均负载很高,此时CPU占用率也会比较高。注意Input/Output(I/O)操作在本文中已经反复强调,不间断的休眠状态非常重要(第一张图中的D),因为有时候你可以在电脑中发现非常高的负载值不同的运行进程利用率相对较低。如果你不去想这个状态,你会觉得情况莫名其妙,不知道该如何应对。当一个进程在等待一些资源被释放并且它的执行不能被中断时,比如当它在等待一个不间断的I/O操作(不是所有的都是不间断的)时,它就在这个状态下完成。通常,发生这种情况的原因是磁盘故障、网络文件系统(例如NFS故障)或大量使用非常慢的设备(例如USB1.0Pendrive)。在这种情况下,我们将不得不使用替代工具,如iostat或iotop,它们将指示哪些进程正在执行更多I/O操作,以便我们可以终止这些进程或为它们分配较低的优先级(不错的命令)可以将更多的CPU时间分配给其他更多关键过程。Sometricks系统过载,负载值高于1.0有时不是问题,因为即使有一些延迟,CPU也会处理队列中的作业,负载会再次降低到1.0以下的值。但如果系统的持续负载值大于1,则意味着它无法吸收所有执行中的负载,因此它的响应时间会增加,系统会变得缓慢无响应。高于1的高值,尤其是最后5分钟和15分钟的平均负载是一个明显的症状,表明我们需要改进计算机的硬件以通过限制用户可以对系统执行的操作来节省更少的资源,或者除了采取多个相似节点之间的负载。因此,我们提出如下建议:=0.70:没有任何反应,但需要监控CPU负载。如果这种情况持续一段时间,必须在事情变得更糟之前进行调查。=1.00:存在问题,您必须找到并修复它,否则系统负载的大幅飙升将导致您的应用程序变慢或无响应。=3.00:您的系统变得非常慢。甚至很难从命令行操作它来试图找出问题的原因,所以修复它比我们以前做的要长。您冒着系统变得更加饱和并且肯定会崩溃的风险。=5.00:您可能无法恢复系统。您可以等待奇迹自发地降低负载,或者如果您知道发生了什么并且负担得起,您可以在控制台中启动kill-9之类的命令并祈祷它在某个时候运行,以减轻系统负载并重新获得对其的控制。否则,您别无选择,只能重新启动计算机。