どうもLinuxは,HDDのファイルの読み書きが遅いような気がする。
なんか大きなファイルアクセスが有る時なんか,他のプロセスは待たされているような気がする。もし待たされるようなことになっているんであれば,待たせないようにするってことで,こういうことの調整はI/Oサブシステムのスケジューラーってのが管理しているみたいだ。

HDDは,データを読み書きするためにヘッドを正しい位置に素早く移動させ,読み書きする場所を回ってくるのを待つ必要がある。これはRAM等に比べ時間が何倍もかかってしまう。その結果,HDDアクセスがシステム速度のボトルネックになる可能性があり,このボトルネックの影響を最小限に抑えるためにスケジュール管理をしているんだろう。

スケジューラアルゴリズムの役割は,エレベータに例えるとわかりやすい。
エレベータが忙しい時,1階に到着すると,多くの人が乗ってきて行き先を好き勝手に押す。この時これを押された順番に止まって行っては大変なことになる。仮にボタンが押された順番通りに動くようにすると,最初に3階に行ってから10階に行き,その後2階に行ってからまた4階に行くなんてのは,利用者は怒ってしまう。それよりも,2階,3階,4階,10階という順番に停止する方が効率的だからね。

LinuxのI/Oスケジューラーもこれに似たようなことをしているんだろうけど,最近の高層マンションの最上階に住んでいるような人は,1階から自分の部屋に行くたびに何度も止まったりしていらいらしちゃうと思う。こんな理由から,低層階には一切止まらず上層階に直行するエレベータが良く高層ビルには設置されている。上層階に住んでいる人にはメリットだが,低層階に住んでいる人はエレベータが減ってしまう。

まあ,結局全て対応できるものは無いということかも・・・

I/Oスケジューラーの変更 anchor.png

  • 起動時にパラメータを渡す
    Kernel 2.6.x以降では,grub起動時にスケジューラーを選択するようになっているみたい。
    /boot/grub/grub.conf
    title Fedora (2.6.32.23-170.fc12.i686.PAE)
            root (hd0,0)
            kernel /vmlinuz-2.6.32.23-170.fc12.i686.PAE ro root=/dev/mapper/vg_yueno-lv_root  LANG=ja_JP.UTF-8 KEYBOARDTYPE=pc KEY
    TABLE=jp106 rhgb elevator=スケジューラーのタイプ quiet
            initrd /initramfs-2.6.32.23-170.fc12.i686.PAE.img
    elevator=xxxxには以下のパラメーターが設定できる。
cfq
これがデフォルト。completely fair queuingの略で,完全公平な列って言う意味。このシステムでは,スケジューラが多数の内部リクエストキューを作成して,動作するプロセスが1つずつこれらのキューに割り当てられる。このスケジューラが,リクエストを各キューの先頭から取り出して,ディスパッチキューに入れる。この時,なるべくシーク時間が最小限になるよう並べられる。この後,次の内部リクエストキューを調べに行って,この作業を繰り返して,ディスパッチキューを埋めていく。
中規模/大規模のマルチプロセッサシステムでうまく機能するシステムで,デフォルトスケジューラになっている。
deadline
遅延を小さくすることを目的としたもの。realtimeシステムに近い動作を行い,ラウンドロビンで複数のI/O要求を公平にさばこうとする。I/O待ち時間の限界点(deadline)を設けて,それが近付いたものを優先的に順序入れ替えを行ってパフォーマンスを稼ぐ。
noop
最もシンプルなスケジューラで,リクエストをマージしてキューに入れ,それらがキューの先頭に到着した順番で処理を行う。
anticipatory
次に来るリクエストは,対応が行われたばかりのディスクブロックの次の位置になると予想する,という仕組みになっている。リード・ライトを実行したあとで,スケジューラは若干のディレイを強制的に入れ,特定のアプリが次のディスクブロックにリクエストを出す時間を与える。このようなリクエストが(予想通り)来ると,別のリクエストに対応すべく移動させられるのではなく,ディスクヘッドが適切な位置に移動してこちらのリクエストに対応する。
外部リクエストに,定期的に中断されないような作業に適している。データにシーケンシャルにアクセスするWeb サーバーなんかには向いているが,ランダムにアクセスするデータベースサーバーのようなシステムには向かない。
  • /sysファイルでもダイナミックに変更出来るようだ
    現在のHDDでの設定の確認
    # cat /sys/block/sda/queue/scheduler
    sdb(HDD)をdeadlineに設定する。
    # echo deadline > /sys/block/sdb/queue/scheduler

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 636, today: 3, yesterday: 0
最終更新: 2020-12-26 (土) 16:07:53 (JST) (1189d) by yuji