84

/ sys / block / [disk] / queue / schedulerに書き込むことで、実行中のカーネル上の特定のデバイスのI/Oスケジューラーを変更できると思われることを読みました。たとえば、私のシステムで見ることができます:

anon@anon:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

デフォルトは完全に均等化キューイングスケジューラです。私が疑問に思っているのは、カスタムカーネルに4つのスケジューラーすべてを含めることに何らかの用途があるかどうかです。カーネルが正しいハードウェア用の正しいスケジューラー、特にフラッシュベースのドライブ用の「noop」スケジューラーと従来のドライブ用の他のスケジューラーを選択するのに十分賢くない限り、複数のスケジューラーをコンパイルすることにはあまり意味がないようです。ハードドライブ。

これは本当ですか?

4

5 に答える 5

110

に記載され/usr/src/linux/Documentation/block/switching-sched.txtているように、特定のブロックデバイスのI/Oスケジューラは実行時に変更できます。新しいスケジューラーを使用する前に以前のスケジューラーの要求がすべてフラッシュされるため、待ち時間が発生する可能性がありますが、デバイスが頻繁に使用されている場合でも問題なく変更できます。

# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo anticipatory > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq

理想的には、すべてのニーズを満たす単一のスケジューラーがあります。まだ存在していないようです。多くの場合、カーネルには、ワークロードに最適なスケジューラーを選択するための十分な知識がありません。

  • noop多くの場合、I / Oのスケジュールを変更しようとするとリソースが無駄になる、メモリでバックアップされたブロックデバイス(ramdiskなど)やその他の非回転メディア(フラッシュ)に最適です。
  • deadlineレイテンシーを厳しく制限しようとする軽量スケジューラーです
  • cfqI/O帯域幅のシステム全体の公平性を維持しようとします

デフォルトはanticipatory長い間あり、多くの調整を受けましたが、2.6.33(2010年初頭)で削除されました。 cfqそのパフォーマンスは合理的であり、公平性はマルチユーザーシステム(およびシングルユーザーデスクトップでさえ)にとって良い目標であるため、しばらく前にデフォルトになりました。一部のシナリオでは、データベースは独自のスケジューリングとアクセスパターンをすでに持っている傾向があり、最も重要なサービスであることが多いため、例としてよく使用されます(公平性を気にする人はいますか?)-anticipatory調整可能であるという長い歴史がありますこれらのワークロードで最高のパフォーマンスを実現し、deadlineすべてのリクエストを基盤となるデバイスに非常に迅速に渡します。

于 2009-06-18T02:59:19.227 に答える
20

udevルールを使用して、hwのいくつかの特性に基づいてシステムにスケジューラーを決定させることができます。
SSDおよびその他の非回転ドライブのudevルールの例は次のようになります。

# set noop scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

新しいudevルールファイル内(例:)/etc/udev/rules.d/60-ssd-scheduler.rulesこの回答はDebianWikiに基づいています

SSDディスクがルールを使用するかどうかを確認するには、事前にトリガー属性を確認することができます。

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done
于 2016-02-03T10:20:50.040 に答える
7

カーネルにさまざまなカーネルをサポートさせる目的は、再起動せずにそれらを試すことができるようにすることです。次に、システムを介してテストワークロードを実行し、パフォーマンスを測定して、それをアプリの標準にすることができます。

最新のサーバーグレードのハードウェアでは、noopの1つだけがまったく有用であるように見えます。他の人は私のテストでは遅いようです。

于 2009-06-17T21:24:42.007 に答える
0

これは、起動時に「elevator」パラメーターをカーネルコマンドライン(grub.cfgなど)に追加することで設定できます。

例:

elevator=deadline

これにより、「期限」がすべてのブロックデバイスのデフォルトのI/Oスケジューラになります。

システムの起動後にスケジューラーを照会または変更する場合、または特定のブロックデバイスに別のスケジューラーを使用する場合は、ツールioschedsetをインストールして使用することをお勧めします。

https://github.com/kata198/ioschedset

Archlinuxを使用している場合は、aurで利用できます。

https://aur.archlinux.org/packages/ioschedset

使用例:

# Get i/o scheduler for all block devices
[username@hostname ~]$ io-get-sched
sda:    bfq
sr0:    bfq

# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none

# Set sda to use "kyber"
[username@hostname ~]$ io-set-sched kyber /dev/sda
Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:
+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change
[username@hostname ~]$ io-get-sched
sda:    kyber
sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ io-set-sched deadline
Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!
+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda
[username@hostname ~]$ io-get-sched sda
sda:    mq-deadline

使用法は自明である必要があります。ツールはスタンドアロンであり、bashのみが必要です。

お役に立てれば!

編集:免責事項、これらは私が書いたスクリプトです。

于 2018-12-11T21:27:38.440 に答える
-3

Linuxカーネルは、実行時にIOスケジューラを自動的に変更しません。つまり、今日のLinuxカーネルは、セカンダリストレージデバイスのタイプに応じて「最適な」スケジューラを自動的に選択することはできません。起動時または実行時に、IOスケジューラを手動で変更することができます。

デフォルトのスケジューラーは、/linux-2.6/block/ Kconfig.ioschedにあるファイルの内容に基づいて起動時に選択されます。echoただし、 / sys / block / [DEV] / queue / schedulerにあるファイルに有効なスケジューラー名を入力することにより、実行時にIOスケジューラーを変更することができます。例えば、echo deadline > /sys/block/hda/queue/scheduler

于 2012-11-13T21:44:17.430 に答える