Home Linux ディスク パフォーマンス モニタリング(df,du,iostat,pidstat の使用法)
Post
Cancel

Linux ディスク パフォーマンス モニタリング(df,du,iostat,pidstat の使用法)

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に従います。

サーバーの利用可能なディスク容量を確認する


サーバーの利用可能なディスク容量を確認するためのいくつかのコマンドがあります。 代表的なものとして dfdu コマンドがあります。

  • 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 フィールドの意味

FilesystemSizeUsedAvailUse%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ディスクの入出力を待機していた時間の割合
%stealSteal 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を確認することができます。

This post is licensed under CC BY 4.0 by the author.

[Leet Code풀이] 201. Bitwise AND of Numbers Range

Linuxメモリパフォーマンスモニタリング(free, psコマンドの使用方法)