科普:什么是IO HANG

IO HANG 其实就是 IO 假死,一般来说可能是 IO 负载过高导致的。IO 负载高的原因也有可能是因为内存不足导致启用了 swap,频繁的对swap 进行读写而导致的 IO 高。

在Linux 中,我们可以通过一些工具来判断当前系统的 IO 状态。

iostat

示例用法

1
iostat -d -k 2
  • -d 表示,显示设备(磁盘)使用状态。

  • -k 表示让某些使用 block 为单位的列强制使用 kB 为单位。

  • 2表示,数据显示每隔3秒刷新一次。

更多说明可以man 查看说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@aliyun fwj]# iostat -d -k 3
Linux 4.20.13-1.el7.elrepo.x86_64 (aliyun) 2019年03月05日 _x86_64_ (1 CPU)

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.46 7.94 34.18 2899273 12489384

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 2.51 0.00 14.07 0 28

iotop

说明

  • 默认情况下按照 IO 使用量倒序排序,可以用左右箭头操作排序的字段。
  • 按 r 切换排序方式。
  • 按 o 只显示有磁盘 IO 活动的进程。
  • 更多参数及返回结果说明,可以参阅 iotop 的 man 帮助。
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
44
45
46
47
48
49
50
51
52
Total DISK READ :	0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 39.22 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1359 be/3 root 0.00 B/s 0.00 B/s 0.00 % 0.19 % [jbd2/vda1-8]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_gp]
4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_par_gp]
6 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H-kblockd]
8 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [mm_percpu_wq]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
11 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
3084 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % rsyslogd -n [rs:main Q:Reg]
13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/0]
14 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
15 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
16 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kauditd]
17 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
18 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [oom_reaper]
19 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [writeback]
20 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kcompactd0]
21 be/5 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksmd]
22 be/7 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khugepaged]
23 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [crypto]
24 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kintegrityd]
25 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]
26 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [tpm_dev_wq]
27 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]
28 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [edac-poller]
29 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [devfreq_wq]
30 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdogd]
13343 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
13344 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
13345 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
34 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswapd0]
13347 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
13348 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
13349 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defa~ux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
3111 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % AliYunDunUpdate
3113 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % AliYunDunUpdate
3114 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % AliYunDunUpdate
3119 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % AliYunDunUpdate
3081 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % rsyslogd -n [in:imjournal]
13913 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:1-events]
24179 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 443 -container-ip 172.17.0.2 -container-port 443
2309 be/4 chrony 0.00 B/s 0.00 B/s 0.00 % 0.00 % chronyd
24184 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 443 -container-ip 172.17.0.2 -container-port 443
121 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthrotld]
122 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [acpi_thermal_pm]
123 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kmpath_rdacd]
124 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kaluad]

free

通过查看内存的swap 分区是否占用过高也可以辅助判断IO 负载是否过高。

1
2
3
4
[root@aliyun fwj]# free  -h
total used free shared buff/cache available
Mem: 985M 165M 272M 1.5M 547M 644M
Swap: 0B 0B 0B