Linux 磁盘的性能指标和观察方法

磁盘性能指标

说到磁盘性能的衡量标准,必须要提到五个常见指标,也就是我们经常用到的,使用率、饱和度、IOPS、吞吐量

以及响应时间等。这五个指标,是衡量磁盘性能的基本指标。

  • 使用率,是指磁盘处理I/0的时间百分比。过高的使用率(比如超过80%),通常意味着磁盘I/O存在性能瓶颈。

  • 饱和度,是指磁盘处理I/O的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为100%时,磁盘无法接受新的I/O请求。

  • IOPS (Input/Output Per Second) ,是指每秒的I/0请求数。

  • 吞吐量,是指每秒的I/O请求大小。

  • 响应时间,是指I/0请求从发出到收到响应的间隔时间。

这里要注意的是,使用率只考虑有没有I/O,而不考虑I/O的大小。换句话说,当使用率是100%的时候,磁盘依然有可能接受新的I/O请求。

这些指标,很可能是你经常挂在嘴边的,一讨论磁盘性能必定提起的对象。不过我还是要强调一点,不要孤立地去比较某一指标,而要结合读写比例、I/O类型(随机还是连续)以及I/O的大小,综合来分析。

IOSTAT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@linux:~# iostat -d -x 1
Linux 4.15.0-46-generic (linux) 03/29/2019 _x86_64_ (2 CPU)

Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 1.00 3.03 9.28 16.20 0.00 0.52 0.06 14.67 1.87 3.46 0.01 9.31 5.35 0.38 0.15
vdb 0.00 0.00 0.04 0.00 0.00 0.00 0.00 0.00 1.25 0.00 0.00 24.34 0.00 0.16 0.00
vdc 0.52 0.00 659.96 0.00 0.00 0.00 0.00 0.00 21.82 0.00 0.01 1273.55 0.00 11.29 0.59

Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 0.00 2.00 0.00 20.00 0.00 3.00 0.00 60.00 0.00 2.00 0.00 0.00 10.00 0.00 0.00
vdb 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 0.00 0.00
vdc 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 0.00 0.00

Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 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 0.00 0.00
vdb 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 0.00 0.00
vdc 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 0.00 0.00

参数说明

需要注意:

  • %util ,就是我们前面提到的磁盘 I/O 使用率;

  • r/s+ w/s ,就是 IOPS; rkB/s+wkB/s ,就是吞吐量;

  • r_await+w_await ,就是响应时间。

    在观测指标时,也别忘了结合请求的大小( rareq-sz 和 wareq-sz)一起分析。

pidstat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
root@linux:~# pidstat -d 1
Linux 4.15.0-46-generic (linux) 03/29/2019 _x86_64_ (2 CPU)

02:49:15 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:16 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:17 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:18 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:19 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:20 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:21 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:22 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:23 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:24 PM 0 272 0.00 8.00 0.00 0 systemd-journal

02:49:24 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:25 PM 0 272 0.00 224.00 0.00 0 systemd-journal
02:49:25 PM 104 982 0.00 4.00 0.00 0 rsyslogd

02:49:25 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:26 PM 0 5348 1100.00 7752.00 7752.00 4 check-new-relea

02:49:26 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:27 PM 0 4416 0.00 0.00 0.00 5 kworker/u128:0
02:49:27 PM 0 5348 32.00 0.00 0.00 1 check-new-relea
02:49:27 PM 0 5356 0.00 8.00 0.00 0 bash

02:49:27 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:28 PM 0 1 1364.00 7752.00 7752.00 0 systemd

02:49:28 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
02:49:29 PM 0 210 0.00 472.00 0.00 0 jbd2/vda1-8

02:49:29 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

02:49:30 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

从 pidstat 的输出你能看到,它可以实时查看每个进程的 I/O 情况,包括下面这些内容。

  • 用户 ID(UID)和进程 ID(PID) 。
  • 每秒读取的数据大小(kB_rd/s) ,单位是 KB。
  • 每秒发出的写请求数据大小(kB_wr/s) ,单位是 KB。
  • 每秒取消的写请求数据大小(kB_ccwr/s) ,单位是 KB。
  • 块 I/O 延迟(iodelay),包括等待同步块 I/O 和换入块 I/O 结束的时间,单位是时钟周期。

iotop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
6 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [mm_percpu_wq]
7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
11 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
12 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/0]
13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/1]
14 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1]
15 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
16 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]