/proc/[pid]/io でプロセス個別でI/O速度を測る
サーバ全体のI/Oの使用状況を確認するのには幾つか方法がある。
個別のプロセスのI/O情報を稼働中のサービス内で追いたい場合、デバッガ・プロファイラを走らせる様な重そうな方法以外に手軽な方法が見つからなかった。
作った後にpidstat -d -p [pid] 1
で目的を果たせる事に気付いた。
pidstat
は後で調べます。
もしかしたらstrace -c
でシステムコールにかかった時間を追う方法は筋が良いかも知れない。
とりあえず/proc/[pid]/io
が使えそうだったので整形する簡単なコマンドを作ってみた。
プロセス個別にI/O速度を測るコマンド
プロセス個別の情報を知りたいときは/proc/[pid/
以下を確認すれば良い。
man 5 proc で調べられるが、環境のmanが古くて/proc/[pid]/io
の節が存在しなかったのでMan page of PROCを読んだ。
これによると以下が書かれていた。
項目 | 意味 |
---|---|
rchar | 読み出し文字数(端末とかも含まれるのでディスクデバイスかは不明) |
wchar | 書き込み文字数(端末とかも含まれるのでディスクデバイスかは不明) |
syscr | 読み出しシステムコール数 |
syscw | 書き込みシステムコール数 |
read_bytes | 読み出しバイト数(ストレージ層から取得しようとしたバイト数) |
write_bytes | 書き込みバイト数(ストレージ層から転送しようとしたバイト数) |
cancelled_write_bytes | キャンセルされた書き込みバイト数(ページキャッシュのトランケートにより引き起こされる) |
プロセスの総転送量ではなく速度が知りたかったので定期的に取得して差を計算するだけで欲しい値が取れる。 下みたいな簡易のコマンドで秒間の速度が測れる。今はもう少し書き換えてJSONでも吐ける様にした。
|
|
サーバ全体のI/Oを確認する方法
vmstatはサーバのプロセスの稼働状態全体の経過を追う
仮想メモリの情報としてブロックデバイスとのI/Oも含まれる。以下man
から転載。
|
|
- io.bo
-
ブロックデバイスから受け取ったブロック数[blocks/sec]
- io.bo
-
ブロックデバイスに送ったブロック数[blocks/sec]
sar -d でディスク情報を詳細に出力する
sarはシステム情報の何でも屋で-d
オプションでディスク情報を出してくれる。
|
|
項目 | 意味 |
---|---|
DEV | ブロックデバイスを指していて devX-Y(X: メジャー番号, Y: マイナー番号)となる |
tps | 1秒間に実際にデバイスに発行される転送要求数(論理的に複数要求が1件にまとめられる場合もあり) |
rd_sec/s | 1秒間の読み込みセクタ数(1セクタ: 512Byte) |
wr_sec/s | 1秒間の読み込みセクタ数(1セクタ: 512Byte) |
avgrq-sz | デバイスに発行された要求の平均サイズ(セクタ数) |
avgqu-sz | 発行された転送要求のキュー長 |
await | デバイスに発行された転送要求の完了までのレイテンシ(キューイングタイムも含む) |
svctm | 実際に転送に掛かった時間 |
%util | 転送要求をデバイスに発行しているCPU時間の割合 |
他のサーバリソースを確認するコマンド
iostat
, dstat
, iotop
がある。ちなみにdstat
,iotop
はPython製のツール。
ツール | 主な用途 |
---|---|
iostat | CPU, デバイス・パーティッション・NFSへのI/Oの統計情報を表示する |
dstat | サーバの統計情報をだいたい素敵に表示してくれる |
iotop | topコマンド風I/O監視ツール |