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

服务器性能指标负载(Load)分析及排查

时间:2023-03-16 18:15:21 科技观察

在平时的工作中,衡量服务器性能时,往往会涉及到几个指标,如load、cpu、mem、qps、rt等,每个指标都有其独特的含义。很多时候线上出现问题的时候,往往伴随着某些指标的异常。在大多数情况下,某些指标会在问题发生之前提前显示异常。对这些指标的理解和查看、异常的解决等,是程序员重要且必备的技能。在这篇文章中,我们将主要介绍一个比较重要的指标——机器负载(Load),主要涉及负载的定义、负载的查看方式、负载过高的排查方法。什么是负载?随着互联网的快速发展和业务量的不断提升,基于网络的数据访问流量快速增长,尤其是数据中心、大型企业、门户网站,其访问流量甚至达到10Gb/s。同时,借助HTTP、FTP、SMTP等应用,服务器网站为访问者提供越来越丰富的内容和信息,服务器逐渐被数据淹没;此外,大多数网站(尤其是电子商务等网站)需要提供24小时不间断的服务,任何服务中断或通信中关键数据的丢失都将造成直接的商业损失。这些都对应用服务提出了高性能、高可靠的需求,这些海量的访问数据都是负载。查看机器负载在Linux机器上,有多个命令可以查看机器负载信息。其中包括uptime、top、w等。uptime命令可以打印系统的总运行时间和系统的平均负载。uptime命令显示的信息是:当前时间,系统已经运行了多长时间,当前有多少用户登录,过去1分钟、5分钟、15分钟系统的平均负载。?~uptime13:29up23:41,3users,loadaverages:1.741.871.97这行信息的后半部分显示“loadaverage”,意思是“系统的平均负载”,里面有三个数字,从我们可以判断系统负载是大还是小。1.741.871.97这三个数字分别表示系统在1分钟、5分钟和15分钟内的平均负载。我们一般表示为load1、load5、load15。w命令w命令的主要作用其实就是显示当前登录系统的用户信息。但与who不同的是,w命令更强大。w命令还可以显示:当前时间、自系统启动以来的时间、登录用户数、最近1分钟、5分钟和15分钟系统的平均负载。然后是每个用户的各种数据,项目依次显示:登录账号、终端名、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前运行进程的命令行。?~w14:08up23:41,3users,loadaverages:1.741.871.97USERTTYFROMLOGIN@IDLEWHATHollisconsole-six1423:40-holliss000-six??1420:24-zshholliss001-six15-w从上面w命令的结果可以看出当前系统时间14:08,系统启动至今23小时41分钟,一共3个用户登录,过去1分钟、5分钟、15分钟系统平均负载为1.74分别为1.87和1.97。这与正常运行时间得到的结果相同。下面还打印了一些登录用户的数据,这里就不详细介绍了。top命令top命令是Linux下常用的性能分析工具。它可以实时显示系统中各个进程的资源使用情况,类似于Windows的任务管理器。?~topProcesses:244total,3running,9stuck,232sleeping,1484threads14:16:01LoadAvg:1.74,1.87,1.97CPUusage:8.0%user,6.79%sys,85.19%idleSharedLibs:116Mresident,16Mdata,14Mlinkedit.Memresidenthymshared.6P630prionReg2s,8.0%user,6.79%sys,85.19%idleSharedLibs:7819Mused(1692Mwired),370Munused.VM:682Gvsize,533Mframeworkvsize,6402060(0)swapins,7234356(0)swapouts.Networks:packets:383006/251Min,334448/60Mout.88/Disks:25103540GCPUDCOM%.PIDMANTHwritten#WQ#PORTMEMPURGCMPRSPGRPPPIDSTATEBOOSTS%CPU_ME%CPU_OTHRSUIDFAULTSCOWMSGSENTMSGRECVSYSBSDSYSMACHCSW30845top3.000:00.491/10213632K0B0B308451394running*0[1]0.000000.0000003283+112203556+101770+8212+119901+823+30842GoogleChrom0.000:47.39170155130M0B0B11461146sleeping*0[1]0.000000.00000501173746269711767837821364228444830310043Intheoutput上面,LoadAvg:1.74,1.87,1.97显示了负载信息。机器的正常负载范围对于机器负载多少才算正常,一直以来争议很大,不同的人有不同的理解。对于单个CPU,有人认为Load超过0.7就超出了正常范围。有人认为只要不超过1就可以了。也有人认为单个CPU的负载在2以下是可以接受的。为什么会有这么多不同的理解?这是因为不同的机器除了CPU的影响外,还有其他因素。运行的程序、机器内存,甚至机房的温度都可能不一样。例如,一些机器用于定期执行大量正在运行的批处理任务。这段时间Load可能会飙升的比较高。其他时间可能会更低。那么我们是否应该在这段飙升的时间里排查问题呢?我的建议是,最好根据自己机器的实际情况,建立一个指标的基线(比如上个月的平均值),只要每天的负载在基线之上和之下即可。如果范围不是太大,可以接受。如果间隙过大,可能需要人工干预检查。如何降低负载负载高的原因可能很复杂,可能是硬件问题,也可能是软件问题。如果是硬件问题,说明机器性能确实不行,所以解决方法很简单,直接换机器就行了。前面我们提到,CPU占用、内存占用、IO消耗都会导致高负载。如果是软件问题,可能是Java中的某些线程被长时间占用,或者大量内存被持续占用导致的。建议从以下几个方面排查代码问题:1.是否存在内存泄漏导致频繁GC。2、是否有死锁。3、是否有大字段的读写。4、是否是数据库操作引起的,排查SQL语句问题。这是另一个建议。如果发现线上机器负载飙升,可以考虑先转储栈内存,然后重启暂时解决问题,再考虑回滚排除故障。1、使用uptime查看当前负载,发现负载在飙升。2、使用top命令查看占用CPU高的进程ID。3、使用top命令查看哪个线程的占用率高。4、使用printf命令查看本线程的十六进制数。5.也可以使用jstat()查看GC情况,看是否频繁FGC,然后使用Usejmapdumpmemory看是否有内存泄漏。