前言有一次面试,面试官问了一个问题,cpu使用率不高,但是Load(平均负载)很高,你是怎么发现问题的?那时候还不明白Load的意思。面试官解释说,这个指标反映了有很多进程处于不间断状态。根据我以往的后端开发经验,回答可能是系统中出现了很多ioblocking,多是网络io问题导致的。使用命令netstat-tnp查看tcp连接中是否有很多time_wait状态...我知道我的回答很片面。事后回顾并做笔记。熟悉Linux的都知道什么是loadaverage,可以使用topuptime命令查看loadaverage指标。使用manuptime查看Loadaverage说明:系统平均负载是处于可运行或不可中断状态的平均进程数。处于可运行状态的进程正在使用CPU或正在等待使用CPU。处于不可中断状态的进程正在等待某些I/O访问,例如等待磁盘。取三个时间间隔的平均值。负载平均值未针对系统中的CPU数量进行标准化,因此负载平均值为1意味着单CPU系统一直处于加载状态,而在4CPU系统上则意味着它有75%的时间处于空闲状态。理解重点,平均负载是指单位时间内系统中平均可运行且不可中断的进程数。称为平均活动进程数。值得注意的是,它与CPU使用率没有直接关系。使用命令psaux查看进程的状态stat,如本文所述:R状态,可运行状态(Running/Runnable),CPU正在使用或正在等待CPUProcessD状态,不可中断状态(UninterrupttitleSleep,也称为DiskSleep),是内核态关键进程中的一个进程,是不可中断的。为什么D状态不能被打断?比如系统调用硬件设备的I/O响应。为了保证数据的一致性,在磁盘设备返回数据之前不能被其他进程中断或中断。如果中断的话,很容易造成磁盘数据和进程数据不一致。因此,不可中断(D)状态是系统对进程和硬件设备的一种保护机制。平均活跃进程数,严格来说,它是活跃进程数的指数衰减平均值(一定数量的下降速度与其值成正比)。通常,可以理解为单位时间内活跃的进程数。CPU利用率与均衡负载从CPU的角度来看,Loadaverage只是反映单位时间内占用CPU的进程数,CPU利用率与进程数没有直接关系。我们可以使用命令topvmstat查看CPU使用率,如下几个指标:%us:表示用户空间程序的cpu使用率(不是nice调度的)%sy:表示系统空间的cpu使用率,主要是kernel程式。%ni:表示nice调度的程序在用户空间的cpu使用率。%id:空闲cpu%wa:CPU运行时等待io的时间%hi:CPU处理的硬中断数%si:CPU处理的软中断数%st:如何衡量虚拟机窃取CPU的合理平均负载一般情况下,如果平均负载低于CPU个数,则机器性能满足服务要求,超过一些也无所谓。loadaverage并不能直接代表cpu的使用率,可能是ioblocking比较多。当loadaverage高于CPU数量的70%时,可能会导致进程响应变慢,从而影响服务的正常运行。一般来说,topuptime提供三个时间点的loadaverage指标,分别是:1分钟、5分钟、15分钟。这反映了系统最近的状态变化趋势。在实际生产环境中,我们需要做长期的监控记录。如果出现异常数值变化,比如平均负载是CPU数量的两倍,需要分析排查问题。综合分析loadbalance和CPUutilization这两个指标的差异,综合以下可能的情况:loadaverage高,CPUuse率高,或者CPU密集型进程(线程)正在运行,或者有很多等待CPU的进程(线程)调度loadaverage高,cpuuse低,运行IO密集型进程,两者都比较低,normalloadaverage低,cpuuse高,这是一个不存在的模拟案例和工具我们如何分析负载均衡在这两类指标和CPU利用率不同组合的情况下,寻找指标变化的源头?以下环境为LinuxArch4.19/4CPU/8GMemorytoolliststress系统压力测试工具sysstat性能分析工具包:mpstat多核CPU分析性能工具,mp表示多处理器(multiprocessor)pidstat进程性能分析工具,pid表示进程号。用于查看进程的CPU、内存、I/O、上下文切换指标。模拟场景使用压力来模拟以下场景。CPU-intensiveprocesses#模拟一个cpu使用率100%,时间限制为600sstress--cpu1--timeout600IO-intensiveprocessstress的-i选项,spawnNworkersspinningonsync()#模拟一个进程执行syncstressnon-stop-i1--timeout600大量进程#模拟16个进程,cpu使用率为100%,限时600sstress--cpu16--timeout600工具指标mpstat-PALL5监控所有CPU,每5秒输出一组数据,注意指标%usr使用率,%iowaitIO阻塞时间,从中可以判断是CPU密集型还是IO密集型pidstat-u51统计间隔5秒以内,已经使用CPU的进程的数据,注意指标%usr使用率,%wait等待使用CPU的时间,从中可以判断进程(线程)是否过多
