当前位置: 首页 > 科技观察

一分钟用十条命令排查Linux服务器性能_0

时间:2023-03-12 02:10:08 科技观察

如果你的Linux服务器突然负载骤增,报警信息快要炸爆你的手机,如何在最短时间内找出Linux性能问题?Netflix性能工程团队BrendanGregg撰写了这篇博文,以了解他们如何使用十个命令在一分钟内诊断机器性能问题。概述通过执行以下命令,您可以在1分钟内大致了解系统资源使用情况。uptimedmesg|tailvmstat1mpstat-PALL1pidstat1iostat-xz1free-msar-nDEV1sar-nTCP,ETCP1top这些命令有的需要安装sysstat包,有的是procps包提供的。这些命令的输出有助于快速定位性能瓶颈并检查所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)指标,也称为USE方法.让我们一一介绍这些命令。这些命令的更多参数和说明请参考命令的使用手册。(1)uptime$uptime23:51:26up21:31,1user,loadaverage:30.02,26.43,19.02这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据代表了在不间断IO进程中等待CPU资源和阻塞的进程数(进程状态为D)。这些数据可以让我们从宏观上了解系统资源的使用情况。该命令的输出分别表示1分钟、5分钟和15分钟的平均负载。通过这三个数据,可以了解服务器负载是趋于紧张还是区域正在缓和。如果1分钟平均负载高,但15分钟平均负载低,说明服务器负载高,需要进一步排查CPU资源消耗在哪里。反之,如果15分钟平均负载高,1分钟平均负载低,有可能已经过了CPU资源紧张的时刻。从上面例子的输出可以看出最近1分钟的平均负载很高,比最近15分钟的负载高很多。因此,我们需要继续查看当前系统中哪些进程消耗了大量资源。可以使用下面介绍的vmstat、mpstat等命令进一步排查。(2)dmesg|tail$dmesg|tail[1880957.563150]perlinvokedoom-killer:gfp_mask=0x280da,order=0,oom_score_adj=0[...][1880957.563400]Outofmemory:Killprocess18694(perl)score246orsacrificechild[1880957.563408]Killedprocess18694(perl)total-vm:1972392kB,anon-rss:1953348kB,file-rss:0kB[2320864.954447]TCP:PossibleSYNfloodingonport7001.Droppingrequest.CheckSNMPcounters.Thiscommandwilloutput***10linesofthesystemlog.Intheoutputoftheexample,youcanseeakerneloomkillandaTCPpacketloss.Theselogscanhelptroubleshootperformanceissues.Don'tforgetthisstep.(3)vmstat1$vmstat1procs---------memory-------------swap-------io-----system--------cpu-----rbswpdfreebuffcachesisobiboincsussyidwast3400200889792737085918280005610961300320020088992073708591860000592132844282981100320020089011273708591860000095012154991000320020088956873712591856000481190024599900003200200890208737125918600000158984840981100^Cvmstat(8)命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。Thefollowingparameter1indicatesthatthestatisticalinformationisoutputoncepersecond.Theheaderofthetableindicatesthemeaningofeachcolumn.Thesecolumnsintroducesomecolumnsrelatedtoperformancetuning:r:thenumberofprocesseswaitingforCPUresources.ThisdatacanbetterreflecttheCPUloadthantheaverageload,andthedatadoesnotincludeprocesseswaitingforIO.如果这个值大于机器的CPU核数,说明机器的CPU资源已经饱和。free:系统中的可用内存量(以千字节为单位)。如果剩余内存不足,也会导致系统性能出现问题。下面介绍的free命令可以更详细的了解系统内存的使用情况。si,so:交换写入和读取的次数。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存不足。us,sy,id,wa,st:这些代表CPU时间的消耗,分别代表用户时间(user)、系统(kernel)时间(sys)、空闲时间(idle)、IO等待时间(wait)和Stolen时间(被盗,一般被其他虚拟机消费)。上面提到的CPU时间可以让我们快速了解CPU是否繁忙。一般情况下,如果用户时间和系统时间之和很大,说明CPU正在忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能是磁盘IO。从示例命令的输出可以看出,大量的CPU时间消耗在用户态,即用户应用程序消耗CPU时间。这不一定是性能问题。需要和r队列一起分析。(4)mpstat-PALL1$mpstat-PALL1Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)07:38:49PMCPU%usr%nice%sys%iowait%irq%soft%steal%guest%gnice%idle07:38:50PMall98.470.000.750.000.000.000.000.000.000.7807:38:50PM096.040.002.970.000.000.000.000.000.000.9907:38:50PM197.000.001.000.000.000.000.000.000.002.0007:38:50PM298.000.001.000.000.000.000.000.000.001.0007:38:50PM396.970.000.000.000.000.000.000.000.003.03[…]这个命令可以显示各个CPU的使用率,如果有一个CPU使用率特别高,那么可能是单线程应用程序导致的。(5)pidstat1$pidstat1Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)07:41:02PMUIDPID%usr%system%guest%CPUCPUCommand07:41:03PM090.000.940.000.941rcuos/007:41:03PM042145.665.660.0011.3215mesos-slave07:41:03PM043540.940.940.001.898java07:41:03PM065211596.231.890.001598.1127java07:41:03PM065641571.707.550.001579.2528java07:41:03PM60004601540.944.720.005.669pidstat07:41:03PMUIDPID%usr%system%guest%CPUCPUCommand07:41:04PM042146.002.000.008.0015mesos-slave07:41:04PM065211590.001.000.001591.0027java07:41:04PM065641573.0010.000.001583.0028java07:41:04PM10867181.000.000.001.000snmp-pass07:41:04PM60004601541.004.000.005.009pidstat^Cpidstat命令输出进程的CPU使用率。该命令会继续输出,不会覆盖之前的数据,方便观察系统动态。从上面的输出可以看出,两个JAVA进程占用了近1600%的CPU时间,消耗了大约16个CPU核的计算资源。(6)iostat-xz1$iostat-xz1Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)avg-cpu:%user%nice%system%iowait%steal%idle73.960.003.730.030.0622.21Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitr_awaitw_awaitsvctm%utilxvda0.000.230.210.184.522.0834.370.009.9813.805.422.440.09xvdb0.010.001.028.94127.97598.53145.790.000.431.780.280.250.25xvdc0.010.001.028.86127.79595.94146.500.000.451.820.300.270.26dm-00.000.000.692.3210.4731.6928.010.013.230.713.980.130.04dm-10.000.000.000.940.013.788.000.33345.840.04346.810.010.00dm-20.000.000.090.071.350.3622.500.002.550.235.621.780.03[...]^Ciostat命令主要用来查看机器的磁盘IO状态。该命令输出的列的主要含义为:r/s,w/s,rkB/s,wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)).过多的读写可能会导致性能问题。await:IO操作的平均等待时间,单位毫秒。这是应用程序在与磁盘交互时需要消耗的时间,包括IO等待和实际操作所花费的时间。如果这个值太大,可能是硬件设备遇到了瓶颈或者出现了故障。avgqu-sz:对设备发出的平均请求数。如果该值大于1,则可能是硬件设备饱和(部分前端硬件设备支持并行写入)。%util:设备利用率。该值表示设备的繁忙程度。经验值是,如果超过60,可能会影响IO性能(可以参考IO操作的平均等待时间)。如果达到100%,说明硬件设备已经饱和。如果显示逻辑设备的数据,设备利用率并不代表后端实际硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不代表应用性能一定会差。可以使用预读和写缓存等策略来提高应用程序性能。(7)free–m$free-mtotalusedfreesharedbufferscachedMem:245998245452214538359541-/+buffers/cache:23944222053Swap:000free命令可以查看系统内存的使用情况,-m参数表示以兆为单位显示。***两列分别表示用于IO缓存的内存量和用于文件系统页面缓存的内存量。需要注意的是第二行-/+buffers/cache,好像是cache占用了很多内存空间。这是Linux系统的内存使用策略。尽可能使用内存。如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被认为是可用内存。如果可用内存非常少,系统可能会使用swap区(如果配置的话),这会增加IO开销(可以在iostat命令中取消),降低系统性能。(8)sar-nDEV1$sar-nDEV1Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)12:16:48AMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s%ifutil12:16:49AMeth018763.005032.0020686.42478.300.000.000.000.0012:16:49AMlo14.0014.001.361.360.000.000.000.0012:16:49AMdocker00.000.000.000.000.000.000.000.0012:16:49AMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s%ifutil12:16:50AMeth019763.005101.0021999.10482.560.000.000.000.0012:16:50AMlo20.0020.003.253.250.000.000.000.0012:16:50AMdocker00.000.000.000.000.000.000.000.00^Csar这里的命令可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量来判断网络设备是否饱和。如示例输出所示,eth0网卡设备的吞吐率约为22Mbytes/s,即176Mbits/sec,未达到1Gbit/sec的硬件上限。(9)sar-nTCP,ETCP1$sar-nTCP,ETCP1Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)12:17:19AMactive/spassive/siseg/soseg/s12:17:20AM1.000.0010233.0018846.0012:17:19AMatmptf/sestres/sretrans/sisegerr/sorsts/s12:17:20AM0.000.000.000.000.0012:17:20AMactive/spassive/siseg/soseg/s12:17:21.AM.0:17:20AMatmptf/sestres/sretrans/sisegerr/sorsts/s12:17:21AM0.000.000.000.000.00^这里使用csar命令查看TCP连接状态,包括:active/s:每秒本地发起的TCP连接数,连接调用创建的TCP连接数;passive/s:每秒远程发起的TCP连接数,即accept调用创建的TCP连接数;retrans/s:每秒TCP重传次数;可以通过TCP连接数来判断性能问题是否是因为建立的连接过多,进而判断连接是主动发起还是被动接受。TCP重传可能是因为网络环境不好或者服务器压力过大,导致丢包。(10)top$toptop-00:15:40up21:56,1user,loadaverage:31.09,29.87,29.92Tasks:871total,1running,868sleeping,0stopped,2zombie%Cpu(s):96.8us,0.4sy,0.0ni,2.7id,0.1wa,0.0hi,0.0si,0.0stKiBMem:25190241+total,24921688used,22698073+free,60448buffersKiBSwap:0total,0used,0free.554208cachedMemPIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND20248root2000.227t0.012t18748S30905.229812:58java4213root20027225446464044232S23.50.0233:35.37mesos-slave66128titancl+2002434423321172R1.00.00:00.07top5235root20038.227g54700449996S0.70.22:02.74java4299root20020.015g2.682g16836S0.31.133:14.42java1root2003362029201496S0.00.00:03.82init2root200000S0.00.00:00.02kthreadd3root200000S0.00.00:05.35ksoftirqd/05root0-20000S0.00.00:00.00kworker/0:0H6root200000S0.00.00:06.94kworker/u256:08root200000S0.00.02:38.05rcu_schedtop命令包含前面几个命令的检查内容。比如系统负载(uptime)、系统内存使用(free)、系统CPU使用(vmstat)等。因此,通过这个命令,可以比较全面的查看系统负载的来源。同时top命令支持排序,可以按照不同的列进行排序,方便找出内存占用最多的进程、CPU占用最高的进程等进程。但是,与之前的一些命令相比,top命令的输出是一个瞬时值。如果你不一直盯着它看,你可能会错过一些线索。这时候可能需要暂停top命令的刷新来记录和对比数据。综上所述,有很多工具可以解决Linux服务器性能问题。上面介绍的一些命令可以帮助我们快速定位问题。例如,在前面的示例输出中,有多个证据证明JAVA进程占用了大量的CPU资源,后续可以对应用进行性能调优。