(実験)ioniceコマンドの動作確認

投稿者: | 2019年3月12日
みなさんこんにちはヒロウミです。「プロのための Linuxシステム・10年効く技術 」を読んでいてioniceコマンドが紹介されていたので実際に挙動を確かめてみたいと思いま す。
とても面白い書籍なのでみなさんぜひ手に取ってみることをお勧めします。


環境

  • CentOS7
  • ionice: 2.23.2

実験内容

  • 同時に同じ量のディスクI/Oを行うプロセスを実行してioniceで意図した制限がかかるかを確認する。
    • プロセスA : -c 1「Real time」最優先でいかなるプロセスよりも優先されるようにする
    • プロセスB : -c 3「Idel」全てのプロセスの後回し
    • 想定結果 : プロセスAが終了してからプロセスBのI/O処理が開始されるはずなので、プロセスBはプロセスAの2倍近く実行時間がかかるはず。
  • I/Oスケジューラが「cfq」の場合のみ動作することを確認する
    • ioniceのマニュアルにある通り、「cfq」で動作するとある。別のI/Oスケジューラが設定されている場合は意図した動作にならないはず。
# man ionice
~~snip~~
NOTES
       Linux supports I/O scheduling priorities and classes since 2.6.13 with the CFQ I/O scheduler.
~~snip~~

実験

(現在のI/Oスケジューラを確認する)
deadlineのためこの状態ではioniceは想定通りの動作にならないはず
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

(ioniceを実行:deadlineの場合)
プロセスA(25111):10.0276 秒
プロセスB(25112):10.2504 秒
上記の通りほぼ同じ実行時間になっており、ioniceコマンドは効いていない
# ionice -c 1 dd if=/dev/zero of=/tmp/tmp0 bs=1M count=500 oflag=direct & ionice -c 3 dd if=/dev/zero of=/tmp/tmp1 bs=1M count=500 oflag=direct & wait
[1] 25111
[2] 25112
500+0 レコード入力
500+0 レコード出力
524288000 バイト (524 MB) コピーされました、 10.0276 秒、 52.3 MB/秒
[1]-  終了                  ionice -c 1 dd if=/dev/zero of=/tmp/tmp0 bs=1M count=500 oflag=direct
500+0 レコード入力
500+0 レコード出力
524288000 バイト (524 MB) コピーされました、 10.2504 秒、 51.1 MB/秒
[2]+  終了                  ionice -c 3 dd if=/dev/zero of=/tmp/tmp1 bs=1M count=500 oflag=direct

(I/Oスケジューラをcfqに変更する)
# echo "cfq" > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

(ioniceを実行:cfqの場合)
プロセスA(25231):5.65182 秒
プロセスB(25232):10.2343 秒
上記の通りプロセスBの実行時間がプロセスAの約2倍になっており、ioniceコマンドは効いていることがわかる
# ionice -c 1 dd if=/dev/zero of=/tmp/tmp0 bs=1M count=500 oflag=direct & ionice -c 3 dd if=/dev/zero of=/tmp/tmp1 bs=1M count=500 oflag=direct & wait
[1] 25231
[2] 25232
500+0 レコード入力
500+0 レコード出力
524288000 バイト (524 MB) コピーされました、 5.65182 秒、 92.8 MB/秒
[1]-  終了                  ionice -c 1 dd if=/dev/zero of=/tmp/tmp0 bs=1M count=500 oflag=direct
500+0 レコード入力
500+0 レコード出力
524288000 バイト (524 MB) コピーされました、 10.2343 秒、 51.2 MB/秒
[2]+  終了                  ionice -c 3 dd if=/dev/zero of=/tmp/tmp1 bs=1M count=500 oflag=direct

以上でioniceコマンドの実験は終了です。
もし、ioniceコマンドを使う機会があるならI/Oスケジューラを確認しとかないと「あれ?うまくいかないな?」となってしまうかもしれませんね。
各I/Oスケジューラの特徴なんかはいろんなサイトに詳しく書かれているので参照してみてください。 それではまた。