Linux 服务器的性能诊断工具

查看整机系统性能

top

使用 top 命令,可以查看系统的负载情况,重点关注的是 %CPU%MEMload average 三个性能指标。

1
top

这里的 load average: 0.08, 0.10, 0.12 代表系统的平均负载,三个值分别表示系统在过去 1 分钟、5 分钟、15 分钟内的平均负载情况。通常情况下,这个数值越低越好,因为它反映了系统的负载情况,即系统中正在运行或等待运行的进程数量。值得一提的是,在 top 命令运行期间,按下键盘的数字键 1,可以看到每个 CPU 的使用率。

htop

使用 htop 命令,通过友好和丰富的界面,可以更方便地查看和管理系统资源的使用情况。

1
htop

htop 是一个交互式的系统监控工具,输出结果的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1  [                                        0.0%]     Tasks: 94, 103 thr; 1 running
2 [ 0.1%] Load average: 0.00 0.01 0.05
3 [ 0.0%] Uptime: 10 days, 03:45:28
4 [ 0.0%]
Mem[|||||||||||||||||||||||||||||||||||867/15861MB]
Swp[ 0/7999MB]

PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
943 root 20 0 1.7G 53968 6720 S 0.0 0.3 0:03.56 systemd
937 root 20 0 1.7G 37500 6348 S 0.0 0.2 0:05.76 (sd-pam)
923 root 20 0 381M 18424 11140 S 0.0 0.1 0:00.38 NetworkManager
911 root 20 0 6.2G 12932 8568 S 0.0 0.1 0:01.14 Xorg
707 root 20 0 1.8G 11920 7476 S 0.0 0.1 0:01.55 dockerd
841 root 20 0 1.6G 11692 4380 S 0.0 0.1 0:00.60 polkitd
918 root 20 0 1.3G 9264 5144 S 0.0 0.1 0:00.56 ModemManager
...

在这个界面中,可以使用键盘上的方向键和其他功能键来浏览进程列表和查看系统资源的使用情况。可以按下 F1 键查看帮助文档,以了解更多操作方法。

uptime

使用 uptime 命令,可以查看系统的运行时间以及系统的平均负载。

1
uptime

uptime 是系统性能命令的精简版,输出结果的格式如下:

1
15:32:11 up 10 days,  5:17,  2 users,  load average: 0.08, 0.10, 0.12

查看 CPU 信息

vmstat

使用 vmstat 命令,可以查看进程、内存、I/O 操作和 CPU 活动等统计信息。一般配合两个数字参数来使用,第一个参数是采样的时间间隔(以秒为单位),第二个参数是采样的次数。

1
vmstat -n 2 3   // 每隔2秒采样一次,一共采样3次

vmstat 命令的输出结果格式如下:

vmstat 命令的输出结果说明如下:

  • procs

    • r: 正在运行或等待运行的进程数量。如果这个数字长期高于 CPU 核心数量,则表示系统可能存在 CPU 瓶颈。
    • b: 在等待 I/O 操作完成时被阻塞的进程数量。如果这个数字持续增长,则表示可能存在磁盘 I/O、网络 I/O 等瓶颈。
  • memory:

    • swpd: 虚拟内存已使用的大小(单位:KB)。即表示被换出到磁盘的内存大小。
    • free: 空闲内存的大小(单位:KB)。
    • buff: 用作缓冲区的内存大小(单位:KB)。缓冲区是用于存储文件系统元数据的内存。
    • cache: 用作缓存的内存大小(单位:KB)。缓存是用于存储文件数据的内存。
    • si: 每秒从磁盘交换到内存的数据量(单位:KB)。
    • so: 每秒从内存交换到磁盘的数据量(单位:KB)。
  • swap:

    • si: 每秒从磁盘交换到内存的数据量(单位:KB)。
    • so: 每秒从内存交换到磁盘的数据量(单位:KB)。
  • io:

    • bi: 每秒从块设备读取的块数量(单位:blocks/s)。
    • bo: 每秒写入块设备的块数量(单位:blocks/s)。
  • system:

    • in: 每秒中断的数量,包括时钟中断。
    • cs: 每秒上下文切换的数量(单位:次 /s)。
  • cpu

    • us:用户进程的 CPU 时间占用百分比,us 值越高,用户进程消耗的 CPU 时间越多,如果长期大于 50%,则需要优化程序。
    • sy:内核进程的 CPU 时间占用百分比。
    • id:CPU 空闲时间占用百分比。
    • wa:等待 I/O 操作完成的 CPU 时间占用百分比。
    • st:被虚拟机监控程序(如 KVM)偷取的 CPU 时间百分比

特别注意

us + sy 的参考值为 80%,如果 us + sy 大于 80%,说明系统可能存在 CPU 资源不足的问题。

mpstat

使用 mpstat 命令,可以查看每个 CPU 的统计信息,包括 CPU 的使用情况、上下文切换、中断等。

1
mpstat -P ALL 5     // 每隔5秒显示一次每个CPU的统计信息

pidstat

使用 pidstat 命令,可以查看进程的 CPU、内存、I/O 以及上下文切换等资源的使用情况。

1
2
3
pidstat -u 5    // 每隔5秒显示一次所有进程的CPU使用情况
pidstat -u 5 -p 14421 //每隔5秒显示一次进程ID为14421的CPU使用情况
pidstat -u 5 -p 14421 25541 //每隔5秒显示一次进程ID为14421、25541的CPU使用情况

pidstat 命令的输出结果格式如下:

1
2
15时06分35秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
15时06分40秒 1000 5997 0.40 0.40 0.00 0.80 17 java

pidstat 命令的输出结果说明如下:

  • PID:进程 ID。
  • %usr:用户空间的 CPU 使用率,即进程在用户模式下消耗 CPU 的百分比。
  • %system:内核空间的 CPU 使用率,即进程在内核模式下消耗 CPU 的百分比。
  • %guest:虚拟 CPU 使用率,即进程运行虚拟 CPU 的时间百分比。
  • %CPU:进程在所有 CPU 上的 CPU 使用率。
  • CPU:进程运行的 CPU 编号。
  • Command:进程的命令名称。

查看内存信息

free

使用 free 命令,可以查看系统内存的使用情况,包括物理内存、交换空间和系统缓存的使用情况。

1
2
3
4
free       // 输出的内存大小会以KB为单位显示
free -m // 输出的内存大小会以MB为单位显示
free -g // 输出的内存大小会以GB为单位显示
free -h // 输出的内存大小会自动以人类能看懂的方式(如KB、MB、GB)来显示

free 命令的输出结果格式如下:

1
2
3
              total        used        free      shared  buff/cache   available
Mem: 16238752 3190972 8253404 520508 4799376 12177876
Swap: 2097148 0 2097148

free 命令的输出结果说明如下:

  • total: 总的物理内存大小。
  • used: 已经被使用的物理内存大小。
  • free: 可用的物理内存大小。
  • shared: 被共享的内存大小,一般为 0。
  • buff/cache: 用作缓存的内存大小。
  • available: 可用的内存大小。
  • Swap total: 交换空间的总大小。
  • Swap used: 已经被使用的交换空间大小。
  • Swap free: 可用的交换空间大小。

查看硬盘信息

df

使用 df 命令,可以查看磁盘空间的使用情况,包括磁盘的总空间、已用空间、可用空间以及文件系统的挂载点。

1
df -h       // 输出的磁盘空间大小会以人类能看懂的方式(如KB、MB、GB)来显示

iostat

使用 iostat 命令,可以查看磁盘 I/O 活动、磁盘分区的吞吐量和响应时间等。

1
iostat -xdk 2 3     // 每隔2秒采样一次,一共采样3次

iostat 命令的输出结果格式如下:

1
2
3
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 34.63 1.56 2.57 28.16 148.78 85.77 0.91 220.93 5.91 351.07 3.30 1.36
sdb 0.00 0.01 0.41 0.00 4.72 0.04 23.32 0.00 3.06 3.06 1.75 2.75 0.11

iostat 命令的输出结果说明如下:

  • Device:磁盘或分区的设备名。
  • rrqm/s:每秒钟合并的读取请求。
  • wrqm/s:每秒钟合并的写入请求。
  • r/s:每秒钟完成的读取请求次数(独立请求)。
  • w/s:每秒钟完成的写入请求次数(独立请求)。
  • rkB/s:每秒从磁盘读取的数据量,单位为 KB/s。
  • wkB/s:每秒写入到磁盘的数据量,单位为 KB/s。
  • avgrq-sz:平均每个请求的扇区数。
  • avgqu-sz:平均请求队列长度。
  • await:平均 I/O 操作等待时间(单位为毫秒)。
  • r_await:平均读取操作等待时间(单位为毫秒)。
  • w_await:平均写入操作等待时间(单位为毫秒)。
  • svctm:平均 I/O 操作服务时间(单位为毫秒)。
  • %util:设备利用率,即设备在采样周期内的活动时间与周期总时间的比率。

特别注意

  • awit 的值越小,代表磁盘性能越好。
  • rkB/swkB/s 根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据的读写,肯定不正常,必须需要优化程序。
  • svctm 的值与 await 的值很接近,表示几乎没有 I/O 等待,磁盘性能好。如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,需要优化程序或更换更快的磁盘(如 SSD 硬盘)。

pidstat

使用 pidstat 命令,可以查看进程的磁盘 I/O 等统计信息。

1
2
3
pidstat -d -u 5                   // 每隔5秒显示一次所有进程的磁盘I/O情况
pidstat -d -u 5 -p 14421 // 每隔5秒显示一次进程ID为14421的磁盘I/O情况
pidstat -d -u 5 -p 14421 25541 // 每隔5秒显示一次进程ID为14421、25541的磁盘I/O情况

pidstat 命令的输出结果格式如下:

1
2
16时24分13秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
16时24分15秒 1000 5997 0.00 0.00 0.00 java

pidstat 命令的输出结果说明如下:

  • UID:进程所属用户的用户 ID。
  • PID:进程 ID。
  • kB_rd/s:每秒从磁盘读取的数据量(单位为 KB)。
  • kB_wr/s:每秒写入到磁盘的数据量(单位为 KB)。
  • kB_ccwr/s:每秒取消预读取的数据量(单位为 KB)。
  • Command:进程的命令名称。

查看网络信息

netstat

使用 netstat 命令,可以查看网络连接、路由表、接口统计信息等。

1
2
3
4
5
6
7
8
9
10
netstat -a  // 显示所有活动的网络连接
netstat -l // 显示所有监听端口
netstat -t // 显示所有 TCP 连接
netstat -u // 显示所有 UDP 连接
netstat -p // 显示进程和 PID
netstat -r // 显示路由表
netstat -i // 显示接口统计信息
netstat -n // 以数字形式显示网络连接和路由信息,忽略对 IP 地址和端口号的主机名解析
netstat -tuln | grep 3306 // 显示所有监听的 TCP 连接,并筛选出其中监听在本地端口 3306 上的连接
netstat -aon|grep 3306 // 显示所有的网络连接和监听端口,并筛选出本地端口为 3306 的连接,并显示与之相关联的进程 ID

netstat 命令的输出结果格式如下:

1
2
3
4
5
6
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5678/sendmail
tcp6 0 0 :::80 :::* LISTEN 9012/httpd
udp 0 0 0.0.0.0:68 0.0.0.0:* 3456/dhclient
udp 0 0 0.0.0.0:123 0.0.0.0:* 7890/ntpd

ifstat

使用 ifstat 命令,可以查看每个网络接口的输入和输出流量信息。Linux 系统默认是没有 ifstat 命令的,需要自行安装。

1
2
ifstat         // 查看所有网络接口的流量信息
ifstat eth0 // 查看特定网络接口的流量信息

ifstat 命令的输出结果格式如下:

1
2
3
4
5
6
7
8
Interface        RX Pkts/Rate    TX Pkts/Rate    RX Data/Rate    TX Data/Rate  
RX Errs/Drop TX Errs/Drop RX Over/Rate TX Coll/Rate
lo 1175 0 1175 0 103200 0 103200 0
0 0 0 0 0 0 0 0
eth0 8183 0 24556 0 677082 0 34262K 0
0 0 0 0 0 0 0 0
eth1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

iftop

使用 iftop 命令,可以实时查看系统的网络连接和流量使用情况。Linux 系统默认是没有 iftop 命令的,需要自行安装。

1
2
3
iftop            // 查看所有网络接口的实时流量信息
iftop -i eth0 // 查看特定网络接口的实时流量信息
iftop -n // 查看所有网络接口的实时流量信息,并禁用 DNS 反解析,以加快显示速度

iftop 命令的输出结果格式如下:

1
2
3
4
interface: en0
IP address is: 192.168.1.2
MAC address is: 00:1f:f3:6a:3d:97
1.94Mb 3.89Mb 5.83Mb

iftop 命令的输出结果说明如下:

  • iftop 默认每隔 2 秒更新一次数据。
  • iftop 默认输出 3 列数据,分别表示入站流量、出站流量和总流量。