kernel:I/O Schedule

  • CPUリソースの割当スケジュールとは別に、デバイスI/Oもスケジューラがある(I/Oスケジューラ)

kernel2.6がサポートするI/O Scheduler

Name 内容
Complete Fair Queueing(CFQ) ProcessごとにQueueを割り当て、各Queueに均一の帯域幅を、I/O要求に優先度を設定する。優先度に基づきI/Oが処理される
deadline 特定の時間を経過しても実行されていないI/O処理を優先的に処理する(長時間I/O処理が実施されないことを防止する)。データベース管理システムのI/O処理等に向く
anticipatory deadlineスケジューラ改良型。Processごとの統計情報に基づき、一般的に連続的なI/O要求を行う傾向があることを利用して一連のI/O処理をまとめて実行するようにする
noop 要求順でのI/O処理
  • CFQはkernel2.6.18以降でのデフォルトI/Oスケジューラ
  • CFQはすべてのI/O要求を一度Queueに蓄積し、優先度に基づいてI/O処理を実施する。Processごとに割り当てられる帯域は均等であるため、高負荷の状態でもI/O処理を継続させることに向いている
  • anticipatoryは2.6.17までのkernelにおけるデフォルトI/Oスケジューラ。一定時間I/Oを蓄積してから連続的な処理をまとめて実行することによりデバイス読み込みなどの処理性能を高め、総合的なI/O性能の向上を図る

現在使用しているI/Oスケジューラを確認してみる

[root@tkcent1 ~]# cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 
  • 使用するI/Oスケジューラを変更するには、echoでschedulerファイルにI/Oスケジューラ名を埋め込む

I/OスケジューラをCFQからanticipatiryに変更してみる

[root@tkcent1 ~]# echo anticipatory > /sys/block/sda/queue/scheduler 
[root@tkcent1 ~]# cat /sys/block/sda/queue/scheduler 
noop [anticipatory] deadline cfq 
  • I/Oスケジューラの種類を問わずに使用することができるチューニング・パラメータとして、I/O request queueの最大長を指定する"nr_requests"がある

現在の"nr_requests"値を確認する

[root@tkcent1 ~]# cat /sys/block/sda/queue/nr_requests 
128
  • ここでの値の単位はI/O要求数。値を増やすことによりより多くのI/O要求を受け付けられるようになるが、I/Oデバイスの種類によってはQueueが長過ぎる状態となり、逆にパフォーマンスが悪化する場合もある(一般的に非同期I/O処理を行うI/Oデバイスでは有用)

"nr_requests"値を256に変更してみる

[root@tkcent1 ~]# echo 256 > /sys/block/sda/queue/nr_requests 
[root@tkcent1 ~]# cat /sys/block/sda/queue/nr_requests 
256