web-dev-qa-db-ja.com

永続的なblockdev setra先読み設定

SLES 11 SP2サーバーの/dev/sda1/dev/sdb1にいくつかのSSDをマウントしましたが、blockdev --setraで先読み設定を微調整することができました。

Sudo blockdev --setra 4096 /dev/sda
Sudo blockdev --setra 4096 /dev/sdb
Sudo blockdev --getra /dev/sda
4096
Sudo blockdev --getra /dev/sdb
4096

起動時にこの設定を保持するにはどうすればよいですか?具体的には、対応する設定がsysctl.confにありますか、またはこれを実現するためにrcスクリプトで解決する必要がありますか?

14
Banjer

SSDディスクのパラメーターを設定するには、udevを使用することをお勧めします。このようにして、SSDなどにより適した特定のキュースケジューラを構成できます。多くのパラメーターに基づいて、一部のデバイスにのみパラメーターを適用することもできます。

次のコマンドを実行することにより、デバイス(ディスクモデルや製造元など)に一致するために必要な特定の属性を取得できます。

udevadm info -a -p /sys/block/sda

ブロックデバイスのすべてのATTRペアをチェックします。

もう1つの利点は、プラグ可能なディスク(エンクロージャーやホットスワップベイなど)のパラメーターを設定できることで、デバイスパラメーターが一致すれば、その設定がすべての新しいデバイスに適用されます。

Intel SSDに特定のスケジューラを適用する例、希望する先読み値(4096ブロック= 2048 kb)、および他のすべてのSSDに別のスケジューラを適用する例を次に示します。

cat /etc/udev/rules.d/99-ssd.rules
# http://unix.stackexchange.com/a/71409/36574
# Setting specific kernel parameters for a subset of block devices (Intel SSDs)
SUBSYSTEM=="block", ATTRS{model}=="Intel SSDSC*", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="2048", ATTR{queue/scheduler}="deadline"
# for all other non-rotational block devices set a scheduler to 'noop' and readahead to 1024KB
SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="1024", ATTR{queue/scheduler}="noop"

ファイルを保存した後、ルールがデバイスと一致するかどうか、およびudevadmを使用してudevが何を実行するかをテストできます。

udevadm test --action=add /sys/block/sda

これにより、udevがロードするすべてのルール、一致するもの、一致しないもの、デバイスが接続されたときにudevが行う決定がすべて出力されます。

お役に立てれば。

16
zorlem

先読みは、少なくとも/sys/sys/class/block/sda/queue/read_ahead_kb)、blockdevおよびhdparmhdparm -a)を介して設定できることに注意してください。

Debianおよびその派生物のhdparmには、ブート時およびホットプラグ時に(udevルールを介して)設定するデバイスごとの属性を指定するhdparm.confが付属しています。

だからあなたは持つことができます:

/dev/disk/by-id/my-disk... {
  read_ahead_sect = 4096
}

(あるブートから次のブートに変更できるsdaよりもIDを使用する方が良い).

10