当前位置: 首页 > Linux

一篇文章告诉你loadaverage的来龙去脉

时间:2023-04-06 04:17:13 Linux

loadaverage?没那么难前言作为开发人员,我们绕不开的一道坎就是在服务器上对系统进行监控,当系统出现异常时,我们需要快速排查。我们今天所知道的平均负载是监控的重要组成部分。在学习loadaverage之前,我们需要了解相关指标,根据指标看清相关问题。正因为如此,我们才由浅入深地了解了下面的知识。常用相关命令Loadaverage相关工具了解案例分析常用相关命令常用top命令、uptime命令、htop命令。top是一个常用的性能分析工具,可以实时动态查看系统的整体情况和各个进程的资源占用情况。top命令提供动态交互界面,也提供热键操作。top命令的详细解释请参考https://man.linuxde.net/top。top命令里面有详细的分析。网站提供了很多命令查询,忘记命令可以上去查询。注:本站为可采集工具。网站正常运行时间显示系统运行时间和系统平均负载。显示时间为:当前时间、系统运行时长、在线用户数、平均负载。可与手表结合使用。ruiqi@ruiqi:~/content$uptime15:24:41up3min,2users,loadaverage:0.34,0.48,0.22htophtop是一款比top更详细的监控软件,操作起来也更方便。它有以下优点:操作比top相对简单,默认支持图形界面的鼠标操作水平或垂直浏览进程列表,查看所有进程,当然还包括完整的命令行。操作技巧比较多,htop并不是每个linux系统都默认安装的,需要在每个系统上安装。显示方法也有类似top的参考。Averageload什么是平均负载在上面的每一个命令中,都可以看到loadaverage这个参数,这是平均负载的英文标识。三个序列分别为1min、5min、15min。可能有朋友会说,平均负载不就是CPU占用率吗?这句话说的对也对,说的也不对。那个你怎么说?一般来说,分析负载可以分为以下三种类型:CPU密集型进程,需要消耗大量的CPU资源。这时候大量的CPU消耗会导致平均负载的增加。IO密集型进程需要等待IO,此时也会增加负载,但是这种情况下CPU占用率并不高。还有一种等待CPU的情况。这个时候CPU消耗很高,CPU的等待时间也很高,平均负载也很高。说到平均负载的增加,平均负载是多少?在了解平均负载之前,先了解一下Linux中进程的几种状态:TASK_RUNNINT:R简称,可执行状态TASK_INTERRUPTIBLE:S简称,可中断睡眠状态,能够响应信号。TASK_UNINTERRUPTIBLE:D简称,不可中断的睡眠状态。这种状态主要说明内核在处理某些进程时是不可中断的。不可中断状态可以认为是一种保护机制,保证系统和进程、设备之间的一致性。TASK_STOPPED||TASK_TRACED:简称T,暂停状态或跟踪状态,TASK_DEAD-EXIT_ZOMBIE:简称Z,退出状态,进程为僵尸进程,进程无法被杀死,不响应任务信号。TASK_DEAD-EXIT_DEAD:简称X,退出状态,进程即将被销毁。平均负载可以简单理解为一定时间内系统处于可运行、不可中断状态的平均进程数。可运行态就是我们上面提到的TASK_RUNNING,可运行态,包括正在使用CPU或者等待CPU的进程。处于不可中断状态的进程:就是我们上面提到的TASK_UNINTERRUPTIBLE进程,记为D。所以我们可以看出loadaverage不仅仅是一个runnable进程,还是一个不可中断进程。判断平均负载的标准使用top、uptime、htop命令可以很方便的查看系统当前的负载情况。但是被认为是不合理数据的平均负载是多少呢?由于每个服务器或客户端的硬件配置不同,我们不能简单地定义一个特定的值来说明平均负载的好坏。但是我们理解平均负载的理想情况是等于CPU的数量。根据这篇文章,我们首先确定机器的CPU数量,方法有很多种。从文件中读取CPU的数量$grep'modelname'/proc/cpuinfomodelname:Intel(R)Core(TM)i7-6700KCPU@4.00GHzmodelname:Intel(R)Core(TM)i7-6700KCPU@4.00GHz或使用wc-l统计$grep'modelname'/proc/cpuinfo|wc-l2top/htop使用top按快捷键1看有多少CPU使用htop,看数量可以看出有多少CPU评价标准。知道CPU个数后,视角转回loadaverage,发现这个参数有3个值,分别是1m、5m、15m。那么应该用哪个时间来表示负载标准呢?其实也很简单。它们的分表代表了1m、5m、15m范围内的平均负荷,代表了这段时间内负荷运行的趋势。根据不同时刻的值,可以判断系统负载变化的趋势,便于获取平均负载的变化。一般情况下,当负载超过系统容量的70%时,监控人员就需要引起注意,检查系统是否有异常。当然,70%只是理论值,需要根据不同的机器做出不同的判断。例如,如果服务器是旧服务器,则可以针对其负载指标降低平均负载。负荷过大时,及时采取应急措施。相关工具了解由于我们没有实际的环境来实现,所以我们需要模拟环境。在实施案例之前,我们需要学习相关的工具来帮助我们辅助实验环境的搭建。stressstress是posix系统下生成cpu/Menory/IO/Disk加载工具的压力测试工具stressinstallubuntuinstallsudoapt-getinstallstresscentosinstallCentos7##enablethird-partysourcerpm-ivhhttp://apt.sw.be/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm##安装stressyuminstallstressCentos6##启用三方源yuminstallepel-release##安装stressyuminstallstressStress参数说明-?显示帮助信息-v显示版本号-q不显示运行信息-n,--dry-run显示指令执行完成-t--timeoutN指定运行N秒后停止--backoffN等待N个细微之处开始运行-c--cpu生成n个进程,每个进程重复计算随机数的平方根-i--io生成n个进程,每个进程重复调用sync(),sync()用于将内容写入内存到硬盘-m--vmn生成n个进程,每个进程不断调用内存分配malloc和内存释放free函数--vm-bytesb指定malloc时内存的字节数(默认256MB)--vm-hangN指示每个消耗内存的进程在分配内存后进入休眠状态,与正常无限分配和释放内存相反,有利于模拟一台只有少量内存的机器-d--haddn产生n次执行write和unlink函数的进程--hadd-bytesB指定写入的字节数,默认为1GB--hadd-noclean不写入随机ASCII数据文件Unlink时间单位可以是秒s、分钟m、小时h,daysd,yeary,文件大小单位可以是K,M,GStress使用教程multiCPUstress-c13multiiooperationstress--io5stress-i5output生成多个CPU和多个io进程并定期停止stress1分钟-c4-i4--timeout1mstress:info:[19613]dispatchinghogs:4cpu,4io,0vm,0hddstress:info:[19613]successfulruncompletedin60soutputfilestothelocalstress-d1--hdd-bytes1G当然stress不止这些,但是需要注意的是stress不能模拟更复杂的场景,而且压力的stressCPU在用户态,内核态不产生压力如果需要更复杂的压力测试,我们也可以使用stress-ng。sysstatsysstat是一个常用的性能监控工具包,它包含了多个性能工具。比如下面我们会用到mpstat、pidstat、iostat、sar等命令。安装ubuntusudoapt-getinstallsysstat2.centosyuminstallsysstatmpstatmpstat会输出所有CPU的平均统计信息命令使用:~$mpstat-A这个命令相当于我们的mpstat-u-lALL-pALLLinux4.15.0-55-generic(瑞奇)08/31/2019_x86_64_(2CPU)07:15:31AMCPU%usr%nice%sys%iowait%irq%soft%steal%guest%gnice%idle07:15:31AMall0.770.011.8317.850.000.210.000.000.0079.3207:15:31AM0.740.011.4216.580.000.000.000.000.000.0080.8307:15:31AM10.81AM10.812.2519.000.000.000.000.000.0077.8107:15:15:15:31USR%NIACE%NIAT%NIAT%NIAT%NIACE%USR%NICE%Usr%%IRQ%Soft%STEAS%Guest%GNICE%Idle07:15:31AM所有0.770.011.8317.850.000.000.000.0079.3207:15:31AM0.760.000.000.000.000.0077.7007:15:31AMintr/s07:15:31AM所有177.2407:15:31AM0118.2807:15:31AM1119.0207:15:31AMCPU0/s1/s6/s8/s9/s12/s14/s15/s16/s17/s18/s19/秒24/秒25/秒26/秒27/秒28/秒29/秒30/秒31/秒32/秒33/秒34/秒35/秒36/秒37/秒38/秒39/秒40/s41/s42/s43/s44/s45/s46/s47/s48/s49/s50/s51/s52/s53/s54/s55/s56/s57/s58/sNMI/sLOC/sSPU/sPMI/sIWI/sRTR/sRES/sCAL/sTLB/sTRM/sTHR/sDFR/sMCE/sMCP/sHYP/sERR/sMIS/sPIN/sNPI/sPIW/s07:15:31AM00.000.000.000.000.000.000.000.000.0042.520.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.590.130.000.0041.940.000.000.000.0016.350.180.000.000.000.000.000.000.000.000.000.000.000.0007:15:31AM10.000.000.000.000.000.000.000.000.000.000.000.000.002.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000。000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.0055.250.000.000.000.0017.080.000.000.000.000.000.000.000.000.0000.0007:15:15:31AM/s/stimer/stimer/snet/snet/snet/snet_rx/sblock/sirq_poll/sirq_poll/sirq_poll/sirq_poll/sirq_poll/sirq_poll/sirq_poll/sirq_poll/Tasklet/sSCHED/SHRTIMER/SRCU/S07:15:31AM0.0028.960.0042.850.000.1325.0020.6507:31AM10.0045.750.002.890.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.250.25.25.000.25.000.25.000.25.000.000.000.25.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.41.41.030.41.41.0029.0029.02.01cressdict:P:carryALL,输出每个CPU的统计信息ruiqi@ruiqi:~$mpstat-PALLLinux4.15.0-55-generic(ruiqi)08/31/2019_x86_64_(2CPU)07:17:31AMCPU%usr%nice%sys%iowait%irq%soft%Steal%GUEST%GUEST%IDLE07:17:31AMall0.770.011.8317.830.000.210.000.0079.3407:17:31AM0.740.011.4216.570.000.000.0080.8507:31AM1.8:31AM0.022.2519.090.000.010.000.000.0077.83N:表示每隔几秒输出一次CPU信息I:表示输出每个处理器的中断统计信息u:表示输出所有CPU的统计信息pidstatpidstat用于监控进程和当前内核管理的线程,并且还可以查看子进程和线程的状态pidstat-t-pprocessnumber23#指定进程的cpu信息统计每两秒输出3次pidstat-pALL#显示所有进程信息pidstat-u51#显示CPU信息,每五秒显示一组pidstat-d2#输出io统计信息,2秒为统计信息案例从上面的例子我们可以看出负载增加的几种场景,以帮助我们理解这方面内容,我们创建一个例子来演示。机器环境如下搭建虚拟机环境:双核内存2g,操作系统ubuntu18.04,安装stress、top、htop。高的。模拟具有压力的CPU密集型进程。stress-c10--timeout600使用top命令查看平均负载。从图中可以看出,loadaverage是逐渐增加的。系统已进入高负载状态。mpstat-pALL显示所有信息并检查导致负载增加的原因。从图中可以看出,CPU使用率基本为100%,而iowait等待为0,说明平均负载增加是CPU使用率过高造成的。的。那么如何查看是哪个进程导致了如此高的CPU占用,这里可以使用pidstat命令查看。pidstat-pALL#显示所有进程信息pidstat-u51#显示CPU信息,每五秒显示一组pidstatpidstat-d2#输出io统计信息,2秒为统计信息pidstat-t-p进程号23#每两秒统计一次指定进程的cpu信息,输出3次给其他需要等待IO的IO密集型进程。这时,负载也会增加。但是这种情况下CPU占用率并不高,多进程方式造成的负载升高。这两种情况,使用mpstat观察负载,找出是cpu超限还是io等待,或者是进程过多导致的负载导致cpu等待增加,最后使用pidstat找到对应的进程,查看其情况。小结本文主要介绍了平均负载的来源,顺便提到了压力测试工具stress、stress-ng、mpstat、pidstat指令。使用这些工具来帮助我们进行系统监控和问题查找。·END·路虽远,去必行微信ID:YoungRUIQ·END·路虽远,路终必到微信ID:YoungRUIQ