I/O スケジューラについて 後編

前編中編に続きとりあえずまとめの後編。

bonnieを使ったベンチマークにより中編で良さげなI/O schedulerを3つ(V/R, sio, deadline)に絞り込みました。

今回はI/O schedulerのパラメータを弄って3種の優劣を競ってみようと思います。

計測環境

  • xperia x10 os2.3.3 スケジューラベンチ用のカスタムカーネル2.6.29
  • CPU周波数は1,152MHz固定
  • SDカードはシリコンパワー class10 16GB
  • SDバッファは3,072KB
  • 測定はSD toolsで各5回(Bonnieは時間がかかりすぎるです 😯 )

各I/O schedulerのパラメータ

以下のパラメータは2011モデルxperiaの2.6.32カーネルのものなので、バージョンによって多少のパラメータ名差異があります。

パラメータは /sys/block/任意のブロック/queue/iosched/ 以下にあります。

V/R

  • async_expire, sync_expire…sync_expireとasync_expireはそれぞれ、同期および非同期リクエストの有効期限を制御する。値を0に設定することで完全に無効にできる。デフォルト値は  async_expire=5000, sync_expire=500
  • fifo_batch…期限切れのリクエストを発行する間の時間を制御するために使用される。値を増やすとスループットを犠牲にしてタイトに。値を増やすとスループットが向上。デフォルト値は 16
  • rev_penalty…値を1にするとSSTFというスケジューリングをする。値が増加するとSCANというスケジューリングに近づく。デフォルト値は10

deadline

  • fifo_batch…V/Rに同じく。
  • front_merges…この値を1に設定すると、スケジューラの中で既存のリクエストに隣接するリクエストがキューの最後尾ではなく先頭にマージされる。デフォルト値は1
  • read_expire…このスケジューラで最も重要なパラメータ、読み込みリクエストがサービスを受けられるまでの最大待ち時間を指示する。デフォルト値は500
  • write_expire…書き込みリクエストがサービスを受けられるまでの最大待ち時間。デフォルト値は5000
  • writes_starved…読み込みリクエストが書き込みリクエストに対して得られる優先レベルを変更する。デフォルト値は2

sio

  • async_expire, sync_expire…V/Rに同じく。
  • fifo_batch…V/Rに同じく。

これが各スケジューラの設定できる値と一覧。

測定2パターンの結果(デフォルト値とパラメータチューンの時と)

echo "deadline" > /sys/block/mmcblk0/queue/scheduler;
echo "300" > /sys/block/mmcblk0/queue/iosched/read_expire; #default 500
echo "4" > /sys/block/mmcblk0/queue/iosched/writes_starved; #default 2
echo "18000" > /sys/block/mmcblk0/queue/iosched/write_expire; #default 5000
echo "1" > /sys/block/mmcblk0/queue/iosched/fifo_batch; #default 16
echo "1" > /sys/block/mmcblk0/queue/iosched/front_merges; #default 1

echo "vr" > /sys/block/mmcblk0/queue/scheduler;
echo "600" > /sys/block/mmcblk0/queue/iosched/async_expire; #default 5000
echo "1" > /sys/block/mmcblk0/queue/iosched/fifo_batch; #default 16
echo "1" > /sys/block/mmcblk0/queue/iosched/rev_penalty; #default 10
echo "250" > /sys/block/mmcblk0/queue/iosched/sync_expire; #default 500
echo "3072" > /sys/block/mmcblk0/queue/read_ahead_kb;

echo "sio" > /sys/block/mmcblk0/queue/scheduler;
echo "18000" > /sys/block/mmcblk0/queue/iosched/async_expire; #default 5000
echo "1" > /sys/block/mmcblk0/queue/iosched/fifo_batch; #default 16
echo "300" > /sys/block/mmcblk0/queue/iosched/sync_expire; #default 500

パラメータチューンの際のパラメータは上の数値です。

結果から。

スケジューラwrite MB/sread MB/s
deadline8.717.8
11.518.6
8.718.2
9.018.4
10.818.6
 平均9.718.3 
tuned deadline10.218.0
11.318.5
11.518.3
10.818.5
9.018.5
 平均10.618.4
 V/R9.719.1
10.519.4
10.419.4
10.719.0
9.618.7
 平均10.219.1
tuned V/R10.919.2
9.419.2
9.818.8
10.719.1
10.319.5
 平均10.2 19.2 
 sio10.319.1
9.818.6
9.918.8
9.718.8
10.818.1
 平均10.1 18.7 
tuned sio8.818.3
8.618.3
11.518.5
10.918.4
10.218.0
平均10.0 18.3 

ちょっと見にくいのは置いといて、

V/R > deadline > sio

ということになりました。

x10と他の端末ではカーネルのバージョンやSDカードの仕様、端末に至るまであらゆる要素が違いますが、オススメなスケジューラは V/R である、と括ってしまっていいと思います。

使用したパラメータが一番いいというわけではないのでこれからもパラメータのチューニングは詰めてパフォーマンスを引き出してやります。

sio に至ってはデチューンになってしまっているというw

関連記事

コメントを残す

メールアドレスが公開されることはありません。