日常在的后端开发或者运维同事们,最怕的事情之一就是服务器的负载突然飙升,这可能又意味着一个个夺目Call马上要打过来了。碰到这种情况怎么办,大家第一反应一定是登陆到服务器上,先敲一个top命令看看Load Average吧。
今天这篇文章和大家说说怎么看这个Load Average

TOP界面

准备好,咱们先来看看在linux 中打top命令是什么样子的:
1619065884(1).png
如图所看到当我们按下top命令,显示出的界面一共可以分为6个部分,接下来我们对这几个部分进行一一介绍,系好安全带,准备发车。

第一部分:运行时间、用户数、平均负载

第一部分,也就是第一行,最关键的部分在于 红色细线框起来的部分,我们一般叫他平均负载Load Average,这个是用来表述服务器负载情况的数值,分别是1分钟、5分钟和15分钟。
经常会有人说Load Average这一个指标就能说明系统负载高了,这句话是对的。那么具体是哪里压力大了呢?这三个数值是怎么计算出来的呢?可能很多人一下子都说不上来。

先来说说定义吧:在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。三个数字分别代表了1分钟,5分钟,15分钟的统计值。

所以,这个数值的确能反应服务器的负载情况。但是,这个数值高了也并不能直接代表这台机器的性能有问题。可能是因为正在进行CPU密集型的计算,也有可能是因为I/O问题导致运行队列堵了。所以,当我们看到这个数值飙升的时候,还得具体问题具体分析。直接升级机器是简单粗暴,但是治标不治本。

第一行主要内容有:

top - 12:27:48 up 96 days,  49 min,  2 users,  load average: 0.06, 0.17, 0.18

top:当前时间
up:机器运行了多少时间
users:当前有多少用户
load average:分别是过去1分钟,5分钟,15分钟的负载

具体需要关注的果然还是load average这三个数值。大家都知道,一个CPU在一个时间片里面只能运行一个进程,CPU核数的多少直接影响到这台机器在同时间能运行的进程数。所以一般来说Load Average的数值别超过这台机器的总核数,就基本没啥问题。

第二部:总进程数、运行、休眠、停止、僵尸进程数

Tasks: 188 total,   4 running, 184 sleeping,   0 stopped,   0 zombie

Tasks:当前有多少进程
running:正在运行的进程
sleeping:正在休眠的进程
stopped:停止的进程
zombie:僵尸进程

running越多,服务器自然压力越大。

第三部分:CPU使用情况

%Cpu(s):  6.0 us,  2.0 sy,  0.0 ni, 92.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

us: 用户进程占CPU的使用率
sy: 系统进程占CPU的使用率
ni: 用户进程空间改变过优先级
id: 空闲CPU占用率
wa: 等待输入输出的CPU时间百分比
hi: 硬件的中断请求
si: 软件的中断请求
st: steal time

这一行代表了CPU的使用情况,us长期过高,表明用户进程占用了大量的CPU时间。us+sy如果长期超过80或者90,可能就代表了CPU性能不足,需要加CPU了。

第四部分&第五部分:内存情况

MiB Mem :   1829.3 total,     75.1 free,   1109.4 used,    644.7 buff/cache
MiB Swap:   1025.0 total,      1.3 free,   1023.7 used.    537.7 avail Mem 
total:内存总量
free:空闲内存
used:使用的
buffer/cache:写缓存/读缓存

第四第五行分别是内存信息和swap信息。所有程序的运行都是在内存中进行的,所以内存的性能对与服务器来说非常重要。不过当内存的free变少的时候,其实我们并不需要太紧张。真正需要看的是Swap中的used信息。Swap分区是由硬盘提供的交换区,当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。

第六部分:进程信息

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                     
2135903 root      20   0  385892  68856  11452 S   1.0   3.7  37:59.46 XX-XXXXXX                                    
  70619 mysql     20   0 1783500 452612   6476 S   0.7  24.2 323:18.36 mysqld                                      
    641 dbus      20   0   56980   2064   1036 S   0.3   0.1  16:51.29 dbus-daemon                                 
 398400 www       20   0  160908  16552   9956 S   0.3   0.9  11:10.14 XXX-XXX                                     
1089992 root      20   0  428904   8920   2720 S   0.3   0.5 196:20.75 barad_agent                                 
2135748 root      20   0  715032  26152   7676 S   0.3   1.4  10:04.51 fail2ban-server                             
2468048 www       20   0  264480  44564  20256 S   0.3   2.4   0:19.36 nginx                                       
2511415 root      20   0 1026944  76988  13612 S   0.3   4.1  53:30.38 YDService                                   
4124529 redis     20   0   61936   7912   1548 R   0.3   0.4  51:57.88 redis-server                                
                                                

PID:进程id
USER:进程所有者
PR:优先级。数值越大优先级越高
NI:nice值,负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量
SWAP:进程使用的虚拟内存中被换出的大小
RES:进程使用的、未被换出的物理内存大小
SHR:共享内存大小
SHR:共享内存大小
S:进程状态。D表示不可中断的睡眠状态;R表示运行;S表示睡眠;T表示跟踪/停止;Z表示僵尸进程。
%CPU:上次更新到现在的CPU占用百分比 ;
%MEM:进程使用的物理内存百分比 ;
TIME+:进程使用的CPU时间总计,单位1/100秒;
COMMAND:命令名/命令行

这些就是进程信息了,从这里可以看到哪些进程占用系统资源的概况。

其他

top当然是我们最常见的查看系统状况的命令。其他命令还有很多。vmstat,w,uptime ,iostat这些都是常用的命令。