在Linux中如何使用iotop和iostat監(jiān)控磁盤I/O活動(dòng)?
你知道在 Linux 中我們使用什么工具檢修和監(jiān)控實(shí)時(shí)的磁盤活動(dòng)嗎?如果 Linux 系統(tǒng)性能變慢,我們會(huì)用 top 命令 來(lái)查看系統(tǒng)性能。它被用來(lái)檢查是什么進(jìn)程在服務(wù)器上占有如此高的使用率,對(duì)于大多數(shù) Linux 系統(tǒng)管理員來(lái)說(shuō)很常見(jiàn),現(xiàn)實(shí)世界中被 Linux 系統(tǒng)管理員廣泛采用。
如果在進(jìn)程輸出中你沒(méi)有看到很大的不同,你仍然有選擇查看其他東西。我會(huì)建議你在 top
輸出中檢查 wa
狀態(tài),因?yàn)榇蠖鄶?shù)時(shí)間里服務(wù)器性能由于在硬盤上的高 I/O 讀和寫降低了性能。如果它很高或者波動(dòng),很可能就是它造成的。因此,我們需要檢查硬盤上的 I/O 活動(dòng)。
我們可以在 Linux 中使用 iotop
和 iostat
命令監(jiān)控所有的磁盤和文件系統(tǒng)的磁盤 I/O 統(tǒng)計(jì)。
什么是 iotop?
iotop
是一個(gè)類似 top
的工具,用來(lái)顯示實(shí)時(shí)的磁盤活動(dòng)。
iotop
監(jiān)控 Linux 內(nèi)核輸出的 I/O 使用信息,并且顯示一個(gè)系統(tǒng)中進(jìn)程或線程的當(dāng)前 I/O 使用情況。
它顯示每個(gè)進(jìn)程/線程讀寫 I/O 帶寬。它同樣顯示當(dāng)?shù)却龘Q入和等待 I/O 的線程/進(jìn)程花費(fèi)的時(shí)間的百分比。
Total DISK READ
和 Total DISK WRITE
的值一方面表示了進(jìn)程和內(nèi)核線程之間的總的讀寫帶寬,另一方面也表示內(nèi)核塊設(shè)備子系統(tǒng)的。
Actual DISK READ
和 Actual DISK WRITE
的值表示在內(nèi)核塊設(shè)備子系統(tǒng)和下面硬件(HDD、SSD 等等)對(duì)應(yīng)的實(shí)際磁盤 I/O 帶寬。
如何在 Linux 中安裝 iotop ?
我們可以輕松在包管理器的幫助下安裝,因?yàn)樵撥浖谒械?Linux 發(fā)行版?zhèn)}庫(kù)中都可以獲得。
對(duì)于 Fedora 系統(tǒng),使用 DNF 命令 來(lái)安裝 iotop
。
$ sudo dnf install iotop
對(duì)于 Debian/Ubuntu 系統(tǒng),使用 API-GET 命令 或者 APT 命令 來(lái)安裝 iotop
。
$ sudo apt install iotop
對(duì)于基于 Arch Linux 的系統(tǒng),使用 Pacman Command 來(lái)安裝 iotop
。
$ sudo pacman -S iotop
對(duì)于 RHEL/CentOS 的系統(tǒng),使用 YUM Command 來(lái)安裝 iotop
。
$ sudo yum install iotop
對(duì)于使用 openSUSE Leap 的系統(tǒng),使用 Zypper Command 來(lái)安裝 iotop
。
$ sudo zypper install iotop
在 Linux 中如何使用 iotop 命令來(lái)監(jiān)控磁盤 I/O 活動(dòng)/統(tǒng)計(jì)?
iotop
命令有很多參數(shù)來(lái)檢查關(guān)于磁盤 I/O 的變化:
# iotop
10
如果你想檢查那個(gè)進(jìn)程實(shí)際在做 I/O,那么運(yùn)行 iotop
命令加上 -o
或者 --only
參數(shù)。
# iotop --only
11
細(xì)節(jié):
IO
:它顯示每個(gè)進(jìn)程的 I/O 利用率,包含磁盤和交換。SWAPIN
: 它只顯示每個(gè)進(jìn)程的交換使用率。
什么是 iostat?
iostat
被用來(lái)報(bào)告中央處理單元(CPU)的統(tǒng)計(jì)和設(shè)備與分區(qū)的輸出/輸出的統(tǒng)計(jì)。
iostat
命令通過(guò)觀察與它們平均傳輸率相關(guān)的設(shè)備活躍時(shí)間來(lái)監(jiān)控系統(tǒng)輸入/輸出設(shè)備負(fù)載。
iostat
命令生成的報(bào)告可以被用來(lái)改變系統(tǒng)配置來(lái)更好的平衡物理磁盤之間的輸入/輸出負(fù)載。
所有的統(tǒng)計(jì)都在 iostat
命令每次運(yùn)行時(shí)被報(bào)告。該報(bào)告包含一個(gè) CPU 頭部,后面是一行 CPU 統(tǒng)計(jì)。
在多處理器系統(tǒng)中,CPU 統(tǒng)計(jì)被計(jì)算為系統(tǒng)層面的所有處理器的平均值。設(shè)備頭行后緊跟顯示每個(gè)配置的設(shè)備一行的統(tǒng)計(jì)。
iostat
命令生成兩種類型的報(bào)告,CPU 利用率報(bào)告和設(shè)備利用率報(bào)告。
在 Linux 中怎樣安裝 iostat?
iostat
工具是 sysstat
包的一部分,所以我們可以輕松地在包管理器地幫助下安裝,因?yàn)樵谒械?Linux 發(fā)行版的倉(cāng)庫(kù)都是可以獲得的。
對(duì)于 Fedora 系統(tǒng),使用 DNF Command 來(lái)安裝 sysstat
。
$ sudo dnf install sysstat
對(duì)于 Debian/Ubuntu 系統(tǒng),使用 APT-GET Command 或者 APT Command 來(lái)安裝 sysstat
。
$ sudo apt install sysstat
對(duì)于基于 Arch Linux 的系統(tǒng),使用 Pacman Command 來(lái)安裝 sysstat
。
$ sudo pacman -S sysstat
對(duì)于 RHEL/CentOS 系統(tǒng),使用 YUM Command 來(lái)安裝 sysstat
。
$ sudo yum install sysstat
對(duì)于 openSUSE Leap 系統(tǒng),使用 Zypper Command 來(lái)安裝 sysstat
。
$ sudo zypper install sysstat
在 Linux 中如何使用 sysstat 命令監(jiān)控磁盤 I/O 活動(dòng)/統(tǒng)計(jì)?
在 iostat
命令中有很多參數(shù)來(lái)檢查關(guān)于 I/O 和 CPU 的變化統(tǒng)計(jì)信息。
不加參數(shù)運(yùn)行 iostat
命令會(huì)看到完整的系統(tǒng)統(tǒng)計(jì)。
# iostat
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.45 0.02 16.47 0.12 0.00 53.94
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
nvme0n1 6.68 126.95 124.97 0.00 58420014 57507206 0
sda 0.18 6.77 80.24 0.00 3115036 36924764 0
loop0 0.00 0.00 0.00 0.00 2160 0 0
loop1 0.00 0.00 0.00 0.00 1093 0 0
loop2 0.00 0.00 0.00 0.00 1077 0 0
運(yùn)行 iostat
命令加上 -d
參數(shù)查看所有設(shè)備的 I/O 統(tǒng)計(jì)。
# iostat -d
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
nvme0n1 6.68 126.95 124.97 0.00 58420030 57509090 0
sda 0.18 6.77 80.24 0.00 3115292 36924764 0
loop0 0.00 0.00 0.00 0.00 2160 0 0
loop1 0.00 0.00 0.00 0.00 1093 0 0
loop2 0.00 0.00 0.00 0.00 1077 0 0
運(yùn)行 iostat
命令加上 -p
參數(shù)查看所有的設(shè)備和分區(qū)的 I/O 統(tǒng)計(jì)。
# iostat -p
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.42 0.02 16.45 0.12 0.00 53.99
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
nvme0n1 6.68 126.94 124.96 0.00 58420062 57512278 0
nvme0n1p1 6.40 124.46 118.36 0.00 57279753 54474898 0
nvme0n1p2 0.27 2.47 6.60 0.00 1138069 3037380 0
sda 0.18 6.77 80.23 0.00 3116060 36924764 0
sda1 0.00 0.01 0.00 0.00 3224 0 0
sda2 0.18 6.76 80.23 0.00 3111508 36924764 0
loop0 0.00 0.00 0.00 0.00 2160 0 0
loop1 0.00 0.00 0.00 0.00 1093 0 0
loop2 0.00 0.00 0.00 0.00 1077 0 0
運(yùn)行 iostat
命令加上 -x
參數(shù)顯示所有設(shè)備的詳細(xì)的 I/O 統(tǒng)計(jì)信息。
# iostat -x
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.41 0.02 16.45 0.12 0.00 54.00
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
nvme0n1 2.45 126.93 0.60 19.74 0.40 51.74 4.23 124.96 5.12 54.76 3.16 29.54 0.00 0.00 0.00 0.00 0.00 0.00 0.31 30.28
sda 0.06 6.77 0.00 0.00 8.34 119.20 0.12 80.23 19.94 99.40 31.84 670.73 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.13
loop0 0.00 0.00 0.00 0.00 0.08 19.64 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
loop1 0.00 0.00 0.00 0.00 0.40 12.86 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
loop2 0.00 0.00 0.00 0.00 0.38 19.58 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
運(yùn)行 iostat
命令加上 -d [設(shè)備名]
參數(shù)查看具體設(shè)備和它的分區(qū)的 I/O 統(tǒng)計(jì)信息。
# iostat -p [Device_Name]
# iostat -p sda
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.38 0.02 16.43 0.12 0.00 54.05
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 0.18 6.77 80.21 0.00 3117468 36924764 0
sda2 0.18 6.76 80.21 0.00 3112916 36924764 0
sda1 0.00 0.01 0.00 0.00 3224 0 0
運(yùn)行 iostat
命令加上 -m
參數(shù)以 MB 為單位而不是 KB 查看所有設(shè)備的統(tǒng)計(jì)。默認(rèn)以 KB 顯示輸出。
# iostat -m
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.36 0.02 16.41 0.12 0.00 54.09
Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
nvme0n1 6.68 0.12 0.12 0.00 57050 56176 0
sda 0.18 0.01 0.08 0.00 3045 36059 0
loop0 0.00 0.00 0.00 0.00 2 0 0
loop1 0.00 0.00 0.00 0.00 1 0 0
loop2 0.00 0.00 0.00 0.00 1 0 0
運(yùn)行 iostat
命令使用特定的間隔使用如下的格式。在這個(gè)例子中,我們打算以 5 秒捕獲的間隔捕獲兩個(gè)報(bào)告。
# iostat [Interval] [Number Of Reports]
# iostat 5 2
Linux 4.19.32-1-MANJARO (daygeek-Y700) Thursday 18 April 2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
29.35 0.02 16.41 0.12 0.00 54.10
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
nvme0n1 6.68 126.89 124.95 0.00 58420116 57525344 0
sda 0.18 6.77 80.20 0.00 3118492 36924764 0
loop0 0.00 0.00 0.00 0.00 2160 0 0
loop1 0.00 0.00 0.00 0.00 1093 0 0
loop2 0.00 0.00 0.00 0.00 1077 0 0
avg-cpu: %user %nice %system %iowait %steal %idle
3.71 0.00 2.51 0.05 0.00 93.73
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
nvme0n1 19.00 0.20 311.40 0.00 1 1557 0
sda 0.20 25.60 0.00 0.00 128 0 0
loop0 0.00 0.00 0.00 0.00 0 0 0
loop1 0.00 0.00 0.00 0.00 0 0 0
loop2 0.00 0.00 0.00 0.00 0 0 0
運(yùn)行 iostat
命令與 -N
參數(shù)來(lái)查看 LVM 磁盤 I/O 統(tǒng)計(jì)報(bào)告。
# iostat -N
Linux 4.15.0-47-generic (Ubuntu18.2daygeek.com) Thursday 18 April 2019 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.38 0.07 0.18 0.26 0.00 99.12
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3.60 57.07 69.06 968729 1172340
sdb 0.02 0.33 0.00 5680 0
sdc 0.01 0.12 0.00 2108 0
2g-2gvol1 0.00 0.07 0.00 1204 0
運(yùn)行 nfsiostat
命令來(lái)查看 Network File System(NFS)的 I/O 統(tǒng)計(jì)。
# nfsiostat