前言
作为一名运维工程师,我们应该对服务器性能的相关指标要做到了然于心
俗话说:“知己知彼,百战百胜”
只有对服务器性能的相关指标很熟悉,才能在服务器出现性能问题的时候快速找出问题所在,对于运维人员来讲,其能力主要体现在“找到问题”,即定位问题上,而不是“解决问题”。因为找出问题的难度往往比解决问题要高。
当服务器出现性能问题的时候,比如说:
- 像在双十一这种流量高峰期,服务器 CPU 使用率过高报警,你登录 Linux 上去 top 完之后,却不知道怎么进一步定位,到底是系统 CPU 资源太少,还是程序并发部分写的有问题?
- 当发现系统负载过高告警的时候,到底是什么原因导致系统负载过高?
这些问题这些场景,在实际生产环境中是很容易碰到的,而且其复杂度往往并不低
那么,今天我们来讲一个很常用的系统性能查看工具——top,同时来简单聊一下 top 工具输出的内容分别是什么。
在面试过程中,让你准确说出 top 命令输出的各个内容也是面试官特别喜欢问的一个问题,因为这往往能反映出你的对系统性能的了解程度
我们先在服务器里面运行 top 命令
看到这张图片,你是不是感觉到头皮发麻,不知道从哪里下手比较好。我第一次看的时候,差点没把我心态搞崩
我们可以这样,将 top 输出来的内容分为两个部分,如下图:
既然分成了两部分之后,我们就先从第一部分开始讲起
Part 1
在第一部分中,显示的是系统的整体使用情况
我们其实可以将它分成5行
我们先来看第一行:
16:41:16 up 27 min, 5 users, load average: 0.00, 0.01, 0.05
从左到右依次是
16:41:16 up 27 min
:系统当前时间和系统运行时间(开机时间)5 users
:登录到这台服务器的终端数,或者说有多少个用户登录到这台服务器上load average: 0.00, 0.01, 0.05
:过去1分钟、5分钟、15分钟内的平均负载
至于什么是平均负载,在我的《干货篇 | 平均负载和CPU使用率你还在傻傻分不清楚吗(含案例)》这篇文章中以及提到过,感兴趣的小伙伴可以看一下
接下来到第二行:
Tasks: 110 total, 2 running, 108 sleeping, 0 stopped, 0 zombie
这一行显示的是系统的相关进程信息
110 total
:进程总数。这里表示系统当前一共有110个进程2 running
:正在运行的进程数。这里表示有2个正在运行的进程数108 sleeping
:睡眠的进程数。有108个0 stopped
:停止的进程数。0 zombie
:僵尸进程数
第三行:
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
在这一行里,包含着跟CPU使用率相关的各种指标(当有多个CPU时,其内容可能不止一行),我们一一来看一下
%Cpu(s)
:表示占CPU总时间的百分比us
:user。代表处在用户态的CPU时间(不包括下面的nice时间,但包括了guest时间)sy
:sys。代表处在内核态的CPU时间ni
:nice。代表低优先级进程处在用户态的CPU时间,也就是说改变过nice值的进程的CPU时间id
:idle。代表空闲时间(不包括iowait)wa
:iowait。代表等待I/O的CPU时间hi
:irq。代表处理硬中断的CPU时间si
:softirq。代表处理软中断的CPU时间st
:steal。代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间
第四行:
KiB Mem : 995896 total, 603328 free, 151460 used, 241108 buff/cache
在这一行里,显示的是系统的物理内存使用情况,默认以字节为单位
total
:表示总内存大小free
:表示未使用内存大小used
:表示已使用内存大小buff/cache
:表示缓存和缓冲区的大小
对于buff/cache我来简单提一点:**Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。**后面我会专门写一篇文章来介绍
第五行:
KiB Swap: 2097148 total, 2097148 free, 0 used. 661432 avail Mem
在这一行里,显示的是系统的交换分区使用情况。
KiB Swap
:交换分区使用情况total
:总量free
:空闲的交换分区量used
:已被使用的交换分区量avail Mem
:可用于进程下一次分配的物理内存量
看到这里,有小伙伴可能会想问,什么是交换分区?
交换分区:
- 缩写为 swap。
- swap通过将硬盘空间当成内存来使用,把系统的可用内存变大了
- 可以把进程暂时不用的数据存储到磁盘中(这个过程为换出),当进程要访问这些数据时,再从磁盘读取这些数据到内存中(这个过程称为换入)。
至此,我们第一部分的内容就已经介绍完了
Part 2
接下来,就到我们划分的第二部分的内容了,在这一部分里面都是各个进程的一些资源使用情况
我们只需要看第一行,也就是背景色是白色那一行
我们来看一下它们所代表的的含义
PID(Process ID) | 进程id号 |
---|---|
USER(User Name) | 进程所有者的用户名 |
PR(Priority) | 进程优先级 |
NI(Nice Value) | 进程的Nice值,负值表示高优先级;正值表示低优先级 |
VIRT(Virtual Image ) | 进程虚拟内存大小(只要是进程申请过的内存,即便还没有真正分配物理内存也会计算在内)单位为kb |
RES(Resident size) | 进程实际使用的物理内存大小(不包括swap和共享内存)单位kb |
SHR(Shared Mem Size) | 共享内存大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。单位kb |
S(Status) | 表示进程的状态 |
%CPU | 进程的CPU时间占用CPU总时间的百分比 |
%MEM | 进程使用的物理内存占系统总内存的百分比 |
TIME+ | 进程使用的CPU时间总计。单位1/100秒 |
COMMAND | 命令名 |
关于上面表格里面写的进程的状态,我在这里简要概括一下关于进程的几种状态
- R(Running 或 Runnable):可执行状态。表示进程处在CPU的就绪队列中(就绪态或者运行态)
- D(Disk Sleep):不可中断睡眠状态。这时候进程一般在跟硬件交互,并且在交互的过程中不允许被其他进程打断中断
- Z(Zombie):僵尸进程。表示该进程已经结束了,但是其父进程没有回收它的资源(比如进程的描述符、PID等)
- S:可中断睡眠状态。表示进程因等待某个事件而被系统挂起,当进程等待的事件发生时,就会被唤醒并进入R状态
- T(Stopped或Traced):表示进程处于暂停或者跟踪状态
- X:进程已经消亡