引言:更多相关请看 JVM+GC解析系列
面试问题:生产环境服务器变慢,诊断思路和性能评估谈谈?可以通过下面几个命令查看解决。
整机:top
性能指标。uptime,系统性能命令的精简版。
命令:top
效果:
top - 18:56:36 up 12:22, 4 users, load average: 0.01, 0.06, 0.06
Tasks: 267 total, 1 running, 266 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2027952 total, 176992 free, 814960 used, 1036000 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1024676 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10432 root 20 0 162128 2428 1600 R 0.7 0.1 0:04.02 top
11212 root 20 0 162152 2420 1588 S 0.7 0.1 0:03.14 top
17 root rt 0 0 0 0 S 0.3 0.0 0:01.16 watchdog/2
834 root 20 0 324680 6908 5392 S 0.3 0.3 1:13.84 vmtoolsd
1 root 20 0 193912 7064 4204 S 0.0 0.3 0:06.64 systemd
...
命令:uptime
效果:
18:58:58 up 12:24, 4 users, load average: 0.00, 0.04, 0.05
任务队列参数
首先第一行是任务队列参数:
top - 18:56:36 up 12:22, 4 users, load average: 0.01, 0.06, 0.06
其显示跟uptime命令一样,代表的意思分别是当前时间,系统开机到现在的运行时间(格式为日,时:分),当前登录用户数,系统负载(三个数值分别为1分钟、5分钟、15分钟前到现在的平均值)。
注意:如果下面的结果值大于60,代表系统负载数过大:
(系统负载的三个值相加) / 3 * 100
系统负载:是任务队列的平均长度,一般包括cpu正在运行的进程数或线程和等待cpu的进程或线程数。Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。
进程信息
第二行为进程信息:
Tasks: 267 total, 1 running, 266 sleeping, 0 stopped, 0 zombie
分别表示:进程总数,正在运行的进程数,睡眠的进程数,停止的进程数,僵尸进程数。
什么是僵尸进程:简单来说就是完成了生命周期但却依然留在进程表中的那些进程,称之为 “僵尸进程”。
CPU信息
第三行为CPU信息:
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第三行cpu使用情况分别表示:用户空间占用CPU百分比,内核空间占用CPU百分比,用户进程空间内改变过优先级的进程占用CPU百分比,空闲CPU百分比,等待输入输出的CPU时间百分比,硬件中断占cpu比例,软件中断占cpu比例,虚拟系统等待得到真正的cpu资源时间比例(如果这个值为50,表明你vm需要cpu时有一半时间在等待)。
内存情况
第四行为内存情况:
KiB Mem : 2027952 total, 176992 free, 814960 used, 1036000 buff/cache
第四行分别表示:物理内存总量,空闲内存总量,使用的物理内存总量,用作内核缓存的内存量。
交换区情况
第五行为交换区情况:
KiB Swap: 2097148 total, 2097148 free, 0 used. 1024676 avail Mem
第五行分别表示:交换区总量,空闲交换区总量,使用的交换区总量,缓冲的交换区总量(内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入)。
交换区:交换区是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。
进程信息
第七行开始的如下参数:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10432 root 20 0 162128 2428 1600 R 0.7 0.1 0:04.02 top
11212 root 20 0 162152 2420 1588 S 0.7 0.1 0:03.14 top
默认情况下仅显示比较重要的PID进程id、USER进程所有者的用户名、PR优先级、NI-nice值、VIRT进程使用的虚拟内存总量、RES进程使用的且未被换出的物理内存大小、SHR共享内存大小、S进程状态、%CPU上次更新到现在的CPU时间占用百分比、%MEM进程使用的物理内存百分比、TIME+ 进程使用的CPU时间总计、COMMAND命令名/命令行几个列!
可以通过下面的快捷键来更改显示内容:更改显示内容通过f键可以选择显示的内容(按f键之后会显示列的列表,按 a-z。即可显示或隐藏对应的列,最后按回车键确定)。按o键可以改变列的显示顺序(按小写的a-z可以将相应的列向右移动,而大写的A-Z 可以将相应的列向左移动,最后按回车键确定)。按大写的F或O键,然后按a-z可以将进程按照相应的列进行排序,而大写的R键可以将当前的排序倒转。
参数详解如下:
| 列名 | 含义 |
|---|---|
| PID | 进程id |
| PPID | 父进程id |
| RUSER | Real user name |
| UID | 进程所有者的用户id |
| USER | 进程所有者的用户名 |
| GROUP | 进程所有者的组名 |
| TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
| PR | 优先级 |
| NI | nice值。负值表示高优先级,正值表示低优先级 |
| P | 最后使用的CPU,仅在多CPU环境下有意义 |
| %CPU | 上次更新到现在的CPU时间占用百分比 |
| TIME | 进程使用的CPU时间总计,单位秒 |
| TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
| %MEM | 进程使用的物理内存百分比 |
| VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
| SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb |
| RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
| CODE | 可执行代码占用的物理内存大小,单位kb |
| DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
| SHR | 共享内存大小,单位kb |
| nFLT | 页面错误次数 |
| nDRT | 最后一次写入到现在,被修改过的页面数。 |
| S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
| COMMAND | 命令名/命令行 |
| WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
| Flags | 任务标志 |
常用命令
top // 每隔5秒显式所有进程的资源占用情况
top -d 2 // 每隔2秒显式所有进程的资源占用情况
top -c // 每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789// 每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 // 每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
CPU:vmstat
查看CPU(包含不限于)。命令:
vmstat -n 2 3
效果:
procs(进程) -------memory(内存)------- -swap(交换)- --io-- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 159088 212 1038740 0 0 2 1 12 14 0 0 100 0 0
0 0 0 158808 212 1038740 0 0 0 0 106 123 0 0 100 0 0
0 0 0 158808 212 1038740 0 0 0 0 65 84 0 0 100 0 0
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数表示时间间隔数,单位是秒,第二个参数是表示次数。比较重要的是procs和cpu。
procs:
r 运行和等待CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大;
b 等待资源的进程数,比如正在等待磁盘I/O、网络I/0等。

us 用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时向多,如果长期大于50%,优化程序;
sy 内核进程消耗的CPU时间百分比。

id:处于空闲的CPU百分比。
wa:系统等待I0的CPUH时间百分比。
st:来自于一个虚拟机偷取的CPU时间的百分比。
额外
查看所有CPU核信息:
mpstat -P ALL 2
效果:
Linux 3.10.0-1062.7.1.el7.x86_64 (root) 2020年02月07日 _x86_64_ (8 CPU)
21时32分53秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
21时32分55秒 all 0.06 0.00 0.19 0.00 0.00 0.00 0.00 0.00 0.00 99.75
21时32分55秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分55秒 7 0.50 0.00 1.51 0.00 0.00 0.00 0.00 0.00 0.00 97.99
21时32分55秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
21时32分57秒 all 0.06 0.00 0.13 0.00 0.00 0.00 0.00 0.00 0.00 99.81
21时32分57秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
21时32分57秒 7 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00
^C
平均时间: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
平均时间: all 0.06 0.00 0.16 0.00 0.00 0.00 0.00 0.00 0.00 99.78
平均时间: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 7 0.50 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 98.50
每个进程使用cpu的用量分解信息:
pidstat -u 1 -p 进程编号
如:
pidstat -u 1 -p 37
效果:
Linux 3.10.0-1062.7.1.el7.x86_64 (root) 2020年02月07日 _x86_64_ (8 CPU)
21时34分11秒 UID PID %usr %system %guest %CPU CPU Command
21时34分12秒 0 37 0.00 0.00 0.00 0.00 6 watchdog/6
21时34分13秒 0 37 0.00 0.00 0.00 0.00 6 watchdog/6
21时34分14秒 0 37 0.00 0.00 0.00 0.00 6 watchdog/6
21时34分15秒 0 37 0.00 0.00 0.00 0.00 6 watchdog/6
21时34分16秒 0 37 0.00 0.00 0.00 0.00 6 watchdog/6
^C
平均时间: 0 37 0.00 0.00 0.00 0.00 - watchdog/6
内存:free
应用程序可用内存数。应用程序可用内存系统物理内存>70%,内存充足;应用程序可用内存系统物理内存<20%,内存不足,需要增加内存;20%<应用程序可用内存系统物理内存<70%内存基本够。用
命令:free(默认单位字节),效果:
total used free shared buff/cache available
Mem: 2027952 831952 156840 19908 1039160 1007696
Swap: 2097148 0 2097148
命令:free -g(默认单位G),效果:
total used free shared buff/cache available
Mem: 1 0 0 0 0 0
Swap: 1 0 1
命令:free -m(默认单位M),效果:
total used free shared buff/cache available
Mem: 1980 812 153 19 1014 983
Swap: 2047 0 2047
查看额外:pidstat -p 进程号 -r 采样间隔秒数。
硬盘:df
disk file查看磁盘剩余空闲数。-h:human给人类看的,展示更友好。 命令:df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 997584 0 997584 0% /dev
tmpfs 1013976 0 1013976 0% /dev/shm
tmpfs 1013976 10728 1003248 2% /run
tmpfs 1013976 0 1013976 0% /sys/fs/cgroup
/dev/mapper/centos-root 52403200 5291588 47111612 11% /
/dev/sda1 1038336 212840 825496 21% /boot
/dev/mapper/centos-home 28289540 39436 28250104 1% /home
tmpfs 202796 8 202788 1% /run/user/42
tmpfs 202796 36 202760 1% /run/user/0
/dev/sr0 4414592 4414592 0 100% /run/media/root/CentOS 7 x86_64
命令:df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 975M 0 975M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 11M 980M 2% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 5.1G 45G 11% /
/dev/sda1 1014M 208M 807M 21% /boot
/dev/mapper/centos-home 27G 39M 27G 1% /home
tmpfs 199M 8.0K 199M 1% /run/user/42
tmpfs 199M 36K 199M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
磁盘IO:iostat
磁盘I/O性能评估。
命令:iostat -xdk 2 3,效果:
Linux 3.10.0-1062.7.1.el7.x86_64 (root) 2020年02月07日 _x86_64_ (8 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.02 0.37 0.13 16.54 5.14 86.46 0.00 1.25 1.15 1.53 0.57 0.03
scd0 0.00 0.00 0.00 0.00 0.02 0.00 72.41 0.00 1.28 1.28 0.00 1.00 0.00
dm-0 0.00 0.00 0.32 0.15 16.31 5.07 89.49 0.00 1.40 1.29 1.63 0.58 0.03
dm-1 0.00 0.00 0.00 0.00 0.04 0.00 50.09 0.00 0.20 0.20 0.00 0.18 0.00
dm-2 0.00 0.00 0.01 0.00 0.04 0.04 15.04 0.00 0.21 0.20 0.46 0.19 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.50 0.00 4.00 0.00 16.00 0.00 1.00 1.00 0.00 1.00 0.05
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.50 0.00 4.00 0.00 16.00 0.00 1.00 1.00 0.00 1.00 0.05
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
磁盘块设备分布重点参数如下:
rkB/s每秒读取数据量;
wkB/s每秒写入数据量kB;
svctm I/O 请求的平均服务时间,单位毫秒;
await I/O 请求的平均等待时间,单位亳秒。值越小,性能越好;
%util 一秒中有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;
rkB/s、wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。svctm的值与awat的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于systm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘。
额外
命令:pidstat -d 采样间隔秒数 -p 进程号。
如:pidstat -d 2 -p 37。
Linux 3.10.0-1062.7.1.el7.x86_64 (root) 2020年02月07日 _x86_64_ (8 CPU)
22时37分10秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
22时37分12秒 0 37 0.00 0.00 0.00 watchdog/6
22时37分14秒 0 37 0.00 0.00 0.00 watchdog/6
^C
平均时间: 0 37 0.00 0.00 0.00 watchdog/6
网络IO:ifstat
默认本地没有,需下载安装ifstat:
wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
tar xzvf ifstat-1.1.tar.gz
cd ifstat-1.1
./configure
make
make install
命令:ifstat -l
lo ens33 virbr0
KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out
0.00 0.00 0.06 0.23 0.00 0.00
0.00 0.00 0.29 12.74 0.00 0.00
0.00 0.00 0.06 0.17 0.00 0.00
0.00 0.00 0.06 0.17 0.00 0.00
0.00 0.00 0.12 3.66 0.00 0.00
...
可通过参数查看:
各个网卡的in、out;
观察网络负载情况;
程序网络读写是否正常;
程序网终I/O优化;
增加网络I/O带宽