Linux ディスク パフォーマンス モニタリング
Linux をよく使用していますが、Linux 自体のパフォーマンスを理解することは常に難しく、混乱してしまいます。 Linux サーバーを運用する際には、以下のような質問が頻繁に発生します。
- 現在のサーバーの利用可能なディスク容量はいくらですか?
- 現在のサーバーのディスク I/O はどうですか?
- 現在どのプロセスがディスク I/O が最も多いですか?
- 現在のシステムはメモリをどれだけ使用していますか?
- 現在のプロセスごとのメモリ使用量はどのようですか?
- 現在のネットワーク速度はどうですか?
- ネットワーク速度がどの程度であれば十分だと判断できますか?
- どのプロセスがネットワークを最も多く消費していますか?
- …
これらの質問に答えるためには、Google で検索して都度コマンドを入力する必要があります。しかし、コマンドから出力される多くの指標が具体的に何を意味するのかを正確に理解せず、「おおよそこんな感じか」と進むことがよくあります。そこで、今回の冬季休暇を記念(?)して、Linux のパフォーマンス全般を測定できる方法と、各コマンドが示す意味について一度確認してみましょう。この記事では、Linux パフォーマンス モニタリングの一環として ディスク
に焦点を当てます。
はじめに
1
2
# cat /etc/issue
Ubuntu 18.04.4 LTS \n \l
以下に示すパフォーマンスモニタリングコマンドおよびその解釈は、Ubuntu 18.04
に従います。
サーバーの利用可能なディスク容量を確認する
サーバーの利用可能なディスク容量を確認するためのいくつかのコマンドがあります。 代表的なものとして df
、du
コマンドがあります。
- dfコマンド : Linuxシステム全体の(マウントされた)ディスク使用量を確認可能
- duコマンド : dfコマンドがシステム全体のディスクスペースを確認するコマンドであるのに対し、duコマンドは特定のディレクトリを基準にディスク使用量を確認可能
つまり、システム全体のディスク使用状況を知りたい場合は df コマンドを使用し、ディレクトリごとの容量を知りたい場合は du を使用します。
df (disk free)
dfはdisk freeの略です。 一度dfコマンドを使用してシステムの容量を確認してみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 395M 864K 394M 1% /run
/dev/vda1 79G 20G 56G 27% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 395M 0 395M 0% /run/user/111
tmpfs 395M 0 395M 0% /run/user/0
overlay 79G 20G 56G 27% /var/lib/docker/overlay2/bdbab02421d9c034584c15c70b6b199b8a9d52994a7969093ccfe7def03cc7d8/merged
overlay 79G 20G 56G 27% /var/lib/docker/overlay2/e085f26a8b95d761006b6d8ffe46bfca8843e3a5aee8a1d381912ed47e45a2ac/merged
現在利用しているクラウドPCのディスク使用量です。 参考までに、-h
オプションはギガバイト単位、-m
はメガバイト単位、-k
はキロバイト単位で表示されます。 各フィールドの意味は以下の通りです。
df フィールドの意味
Filesystem | Size | Used | Avail | Use% | Mounted on |
---|---|---|---|---|---|
ファイルシステム名 | 合計サイズ | 使用中の容量 | 利用可能な容量 | 使用率 | マウントされた場所 |
現在、ルート(/)にマウントされた /dev/vda1 が実際にLinuxマシンが使用している領域で、現在の使用容量は79GB中20GBです。
それでは、tmpfs、udev、overlay は何ですか?
- tmpfs 一時的なファイルシステム(temp file system)の略で、メモリをファイルのように使用できるファイルシステムです。物理的な保存メディアではなくメモリ(RAM)なので、電源が切れるとデータは失われます。高速な入出力が要求される作業に使用されます。
- udev 物理デバイスに関連するファイルノードを /dev ディレクトリに作成および削除するための領域
- overlay Dockerで使用されるオーバーレイ領域
du (disk usage)
ディレクトリごとに使用されるスペースを示す du
も試してみましょう。
1
2
3
# ホームディレクトリで以下のコマンドを試してみましょう。
# du -sh
4.4G .
du -sh
コマンドは現在のディレクトリ全体のディスク使用量をGB単位で表示します(単に du
を入力すると、現在のディレクトリのサブディレクトリ内のすべてのファイルのサイズが表示されるため、読みやすさが低いです)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ホームディレクトリで以下のコマンドを試してみましょう。
# 以下のコマンドは現在のディレクトリから1つ下のサブディレクトリを基準にして容量を表示します。
# du -sh *
1.5G surfer
63M deercode
876K elk_test
191M fss-data
8.0K why
224M Moview
272M open
61M openvscode-server-v1.73.0-linux-x64.tar.gz
39M selenium
4.0K sym
4.0K temp
4.0K test.py
53M A.py
サーバーのディスクIOの確認
サーバーのディスクIOを測定する方法には様々なものがあります。iotop、dstat、iostatなどがありますが、ここではiostat
に焦点を当てて紹介します。iostat
を使用するには、まずsystat
パッケージをインストールする必要があります。
sysstatのインストール
1
# apt install sysstat
iostatを使用したディスクIOの確認
1
2
3
4
5
6
7
8
9
# iostat
Linux 4.15.0-76-generic (vultr.guest) 01/21/2023 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.67 0.00 0.19 0.02 0.00 99.13
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.00 0.00 1 0
vda 2.97 0.94 22.82 28651719 695587005
上記のようにiostat
コマンドを実行すると、このような出力が表示されます。これらの情報は何を意味しているのでしょうか?
iostatメトリクス
まず、avg-gpu
から見てみましょう。
- avg-gpu
メトリクス | 説明 |
---|---|
%user | 使用者モードでのCPU時間の割合の出力値 |
%nice | 優先度ポリシーによって優先度が変更されたプロセッサが使用した時間の割合 |
%system | システムモードでのCPU時間の割合 |
%iowait | ディスクの入出力を待機していた時間の割合 |
%steal | Steal CPUの使用時間の割合 |
%idle | ディスクの入出力を待機していないアイドル状態の時間 |
- ディスク使用量の情報
メトリクス | 説明 |
---|---|
tps | ディスクデバイスが1秒間に処理した入出力のタスク数 |
kB_read/s | ディスクデバイスからの1秒間当たりの読み取りデータブロック単位 |
kB_wrtn/s | ディスクデバイスからの1秒間当たりの書き込みデータブロック単位 |
kB_read | ディスクデバイスから読み取ったデータブロック単位 |
kB_wrtn | ディスクデバイスに書き込まれたデータブロック単位 |
デバイスを1秒ごとにモニタリング
1秒ごとにデバイスだけをモニタリングしたい場合は、watchコマンドと組み合わせて使用することもできます。
1
2
3
4
5
6
7
8
# watch -n 1 iostat -d
Every 1.0s: iostat -d vultr.guest: Sat Jan 21 03:32:42 2023
Linux 4.15.0-76-generic (vultr.guest) 01/21/2023 _x86_64_ (2 CPU)
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.00 0.00 1 0
vda 2.97 0.94 22.82 28651747 695610233
プロセスごとのディスクIOの確認
プロセスごとのディスクIOを知ることができれば、pidstat
コマンドを使用できます。pidstat
コマンドは、前述のsysstatパッケージに含まれるコマンドです。つまり、pidstat
を使用するにはまずsysstatをインストールする必要があります。
pidstatを使用したプロセスごとのディスクIOの確認
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pidstat -d -p ALL
Linux 4.15.0-76-generic (vultr.guest) 01/21/2023 _x86_64_ (2 CPU)
03:40:22 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
03:40:22 AM 0 1 0.67 6.84 0.07 23 systemd
03:40:22 AM 0 2 0.00 0.00 0.00 0 kthreadd
03:40:22 AM 0 4 0.00 0.00 0.00 0 kworker/0:0H
03:40:22 AM 0 6 0.00 0.00 0.00 0 mm_percpu_wq
03:40:22 AM 0 7 0.00 0.00 0.00 0 ksoftirqd/0
03:40:22 AM 0 8 0.00 0.00 0.00 0 rcu_sched
03:40:22 AM 0 9 0.00 0.00 0.00 0 rcu_bh
03:40:22 AM 0 10 0.00 0.00 0.00 0 migration/0
...
上記のコマンドでは、
-d
はディスクIOを、-p ALL
はすべてのプロセスを表示することを意味します。
pidstatメトリクスの確認
メトリクス | 説明 |
---|---|
kB_rd/s | 該当プロセスが1秒間に読み込んだデータの量(KB単位) |
kB_wd/s | 該当プロセスが1秒間に書き込んだデータの量(KB単位) |
kB_ccwr/s | 該当プロセスのDirty Page Cacheによってキャンセルされた書き込みの量(KB単位) |
iodelay | 該当プロセスのディスク遅延を示します。ディレイにはディスクが同期するまでの時間も含まれます |
スレッド単位でディスクIOを確認
1
# pidstat -d -t -p ALL
もし-tオプションを付けると、スレッド単位までディスクIOを確認することができます。