/dev/sda1
我在 SLES 11 SP2 服务器上安装了一些 SSD /dev/sdb1
,并且我能够使用以下命令调整预读设置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 脚本才能实现这一点?
答案1
我建议您使用 udev 来设置 SSD 磁盘的参数。通过这种方式,您可以配置更适合SSD等的特定队列调度程序。您还可以基于大量参数,仅将参数应用于某些设备。
您可以通过执行以下命令来获取与您的设备匹配所需的特定属性(例如磁盘型号和制造商):
udevadm info -a -p /sys/block/sda
并检查块设备的所有 ATTR 对。
另一个好处是能够设置可插拔磁盘(例如,在机柜或热插拔托架中)的参数,并且只要设备参数匹配,该设置将应用于所有新设备。
以下是为 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"
保存文件后,您可以测试您的规则是否与设备匹配以及 udev 将使用 udevadm 执行什么操作:
udevadm test --action=add /sys/block/sda
这会打印 udev 加载的所有规则,哪些匹配,哪些不匹配,以及插入设备时 udev 将做出哪些决定。
希望这可以帮助。
答案2
请注意,预读至少可以通过/sys
( /sys/class/block/sda/queue/read_ahead_kb
)blockdev
和hdparm
( hdparm -a
) 设置。
hdparm
在 Debian 及其衍生产品上,带有一个hdparm.conf
指定在启动时和热插拔时(通过udev
规则)设置的每个设备属性的属性。
所以你可以拥有:
/dev/disk/by-id/my-disk... {
read_ahead_sect = 4096
}
(最好使用 ID,而不是sda
每次启动时都可以更改的 ID)。
答案3
中没有任何对应的内容sysctl
,所以,是的,/etc/rc.local
是一种方式,或类似的方式。请注意,我个人注意到,在 Ubuntu 上,即使在启动后设置一次,这些更改也会进一步漂移,因此,crontab
保留它甚至可能是有意义的。