ディスクI/Oスケジューラの設定
今、仕事でDBの設計を行っているのだが、OS周りのチューニングが色々と必要らしい。例えば、LinuxのディスクI/Oスケジューラというものも設定が必要とのこと。
つまり、ディスクI/Oが発生した際に、HDDヘッドがランダムに移動すること防ぎ、ディスクのシーク量を減少させることが目的のようだ。
今回は、ディスクI/Oスケジューラについて、調べた内容をメモ書きとして残しておく。
ディスクI/Oスケジューラ
ディスクI/Oスケジューラとは、アプリケーションなどから発行された複数のI/O要求を並び変えるソフトウェアを指す。
OSからI/O要求が新規に追加された際には、I/Oスケジューラが呼び出されるようになっており、新しい要求をキューに追加する。
このとき、要求をキューに追加するアルゴリズムとして、次の4つが存在する。
noop
最もシンプルなスケジューラで、I/O要求を単純に要求順に処理する。
noopはスケジューリング負荷が小さく、ランダムアクセスが高速なハードウェアに適していると考えられている。
deadline
ディスク上で位置が近いI/O要求を優先して処理を行うことで、HDDヘッドの移動量を削減する。位置が近いI/O要求を優先するため、HDDヘッドから遠くにあるI/O要求は後回しされるが、待ち時間の限界値(deadline)より長く待たされているI/O要求が発生した際には、そのI/O要求を優先する。
deadlineの設定によりレイテンシの上限が保証されるため、リアルタイムアプリケーションやデータベース管理に適していると言われている。
anticipatory(AS)
I/O要求を予測し、その予測に基づいて処理を行う。位置が近い場所へのI/Oがすぐ後に発行されると予測 した場合、I/O要求の処理を遅延させ、近隣のI/O要求が発行されるのを待ってから、I/O要求の処理を行う。つまり、いくつかのI/O要求を貯めてから処理を行う性質がある。
ただしDeadlineと同様に、待ち時間の長いI/O要求が発生した場合にはI/O待ちを中断し、待ち時間の長いI/O要求を優先して処理する。
anticipatoryは、データにシーケンシャルにアクセスするWebサーバなどに有効とされている。
cfq(Completely Fair Queuing)
スケジューラは内部に多数のキューを保持しておき、プロセス単位でI/O要求をそれらキューに割り振っていく。処理対象のキューを一定間隔で切り替えることで、プロセス間でI/O要求は公平に処理されていく。
また、Deadlineやanticipatoryと同様に待ち時間の長いI/O要求が存在した場合、それを優先的に処理していく。
Oracle 12cでの設定
Oracle社提供のマニュアルによると、OracleのASMのパフォーマンス向上のために、Deadline I/Oスケジューラを使用することが推奨されているようだ。
スケジューラの確認方法
スケジューラの確認は、以下のコマンドで行える。
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
このうち[]で囲まれているものが現在の設定値となる。
スケジューラを変更したい場合は、下記のコマンドで変更できる。
echo noop > /sys/block/sda/queue/scheduler
cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq
ただし、上記は一時的 な変更であるため、恒久的な変更を行うためにはカーネル引数として以下を設定する。
elevator=変更したいアルゴリズム
※ elevator=deadlineなど
参考・引用
以下、参考・引用させて頂いたブログ・記事など
OSSはアルミニウムの翼で飛ぶ: RHEL I/Oスケジューラの変更
・仮想化環境におけるI/Oスケジューラの動作と性能に関する考察
http://www.internetconference.org/ic2010/PDF/ic2010-session-1-3.pdf