人生は、お天気いろいろ

日々の生活やプログラミング等に関するメモ・雑文を記載しています

ディスク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スケジューラを使用することが推奨されているようだ。

 

Oracle Databaseのインストール前の作業

 

スケジューラの確認方法

スケジューラの確認は、以下のコマンドで行える。

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