TL;DR
OS やミドルウェアといった様々なレイヤーを扱っていても、ディスクの Read/Write 速度というものは必ずボトルネックになりえる要素として存在する。ディスクがボトルネックになっているか疑わしいと考えた時、簡易的にディスクのスループットを計測する方法を紹介。
-
dd
コマンド、pv
コマンドを利用することでディスクスループットが簡易的に計測することが可能
利用シーン
一例となりますが、ファイル圧縮処理を行う時に圧縮処理がなぜか遅い、といった場合等に紹介する方法での調査が有用だと考えます。
ディスクの Read スループットを計測する
dd
コマンドを利用して計測対象のディスクを if
に設定、 of
に /dev/null
を指定することで Read スループットを計測することが可能です。ちなみに注意としては dd
コマンドとなるため、あくまでシーケンシャルのアクセスになることを意識することが大事だと思います。
-
/dev/sda1
の Read スループットを計測する例
dd if=/dev/sda1 of=/dev/null bs=16k status=progress
出力は下記のような内容となります。
584122368 bytes (584 MB) copied, 4.61756 s, 127 MB/s
各コマンドにおける処理速度を計測する
上記で紹介した方法は、ほぼ純粋なディスク速度となります。ですが利用シーンの例にもある通り、例えば圧縮処理が遅いといった時に、それが純粋なディスク速度が遅いのか圧縮処理がボトルネックになっていて遅いのか切り分けたい場合があると思います。そのような場合に有効なのが各コマンドの処理速度を計測することができる pv
コマンドとなります。
pv コマンドとは
pv
コマンドはパイプ処理を実施する時に、パイプを渡るデータ量を計測するコマンドとなります。例えば、下記のような例がある場合 tar
コマンドから lz4
コマンドへ渡るデータ量、すなわち tar
コマンドの処理がどの程度の速度で実施されているか確認することができます。これによって、下記コマンドの実行速度がなぜか遅いといった場合に tar
コマンドがボトルネックになっているのか、lz4
コマンドがボトルネックになっているか当たりをつけることができます。
tar -b 256 -cvf - /data/ | lz4 -c
使い方
下記のように計測したいパイプの間に pv
コマンドを挟むことで計測することが可能です。
-
tar
コマンドの速度を計測する例
tar -b 256 -cvf - /data/ | pv | lz4 -c > /dev/null
-
lz4
コマンドの速度を計測する例
tar -b 256 -cvf - /data/mysql/ | lz4 -c | pv > /dev/null
出力は下記のような内容となります。
8.66GiB 0:00:04 [2.19GiB/s] [ <=> ]
おわりに
ディスクの性能を測る方法は数多くあると思いますが、今回は手軽に確認ができる方法として上記方法を紹介しました。ディスクへのアクセスもRead
Write
に加えて Random IO
Sequential IO
、速度の指標も IOPS
Throughput
というように様々な種類があるため、常に「今回はどのようなアクセスパターンが発生する処理なのか」等を意識するとボトルネックの発見に円滑に近づけたりすると思います。