Разгон винта под Linux

yamushev

Возможно, отцы скажут что это все азы, и кто этого не знает, тот полное ламо. Но лично я это узнал совсем недавно:
http://linuxnews.ru/docs/showdoc.php?id=1494&thread=1494
----------------------------------------------------------------------------------
Многие использующие Linux не подозревают о том, что его можно сделать еще быстрее, по крайней мере, в области работы с жестким диском.

Итак, первое, что требуется вам, это утилита hdparm версии 3.9 (узнать версию можно с помощью hdparm -V). Она доступна только из-под root. Эта утилита управляет параметрами драйвера IDE в Linux.


ПРЕДУПРЕЖДЕНИЕ
Перед всеми экспериментами уйдите в однопользовательский режим (telinit 1) или остановите все лишние сервисы. Дело в том, что в ходе экспериментов можно подвесить систему - думаю, никому не охота потерять данные. Плюс - на некоторых машинах в результате "игр" с DMA (ключи -d и -X) и unmask irq (-u) на дисках может нарушиться целостность файловой структуры, поэтому будьте осторожны.

Давайте посмотрим на диск (здесь я буду проводить эксперименты над своим вторым диском).
<pre>
[multik /root]# hdparm /dev/hdb

/dev/hdb:
multcount = 0 (off)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 2491/255/63, sectors = 40032696, start = 0
</pre>
Как вы видите, все отключено - везде стоят "0" или "off". Давайте посмотрим, что же может выжать Linux из этого диска.
<pre>
[multik /root]# hdparm -t /dev/hdb

/dev/hdb:
Timing buffered disk reads: 64 MB in 17.08 seconds = 3.75 MB/sec
</pre>
Всего 3.75 мегабайт в секунду. Это ли современные скорости? Между прочим, большинство дистрибутивов работают с диском именно так.

Итак, давайте его разгоним хоть чуть-чуть. Следующая команда должна пройти без ошибок на любом более-менее новом железе.
<pre>
[multik /root]# hdparm -m2c3u1 /dev/hdb

/dev/hdb:
setting 32-bit I/O support flag to 3
setting multcount to 2
setting unmaskirq to 1 (on)
multcount = 2 (on)
I/O support = 3 (32-bit w/sync)
unmaskirq = 1 (on)
</pre>
Этой командой мы включили драйвер IDE в 32х битный режим, настроили контроллер на запрет генерации прерываний при любой работе с диском и разрешили передавать более одного слова за такт. Кстати, параметр -u1 часто помогает на машинах, где модем перестает качать или музыка заикается во время интенсивной работы с жестким диском.

Давайте еще раз посмотрим скорость:
<pre>
[multik /root]# hdparm -t /dev/hdb

/dev/hdb:
Timing buffered disk reads: 64 MB in 9.28 seconds = 6.90 MB/sec
</pre>
Вот, уже неплохо, но все равно слабовато. Та техника, которая стоит у меня, способна на большее.

Что нам остается еще сделать? Правильно - включить наконец DMA.
<pre>
[multik /root]# hdparm -d1 /dev/hdb

/dev/hdb:
setting using_dma to 1 (on)
using_dma = 1 (on)
[multik /root]# hdparm -t /dev/hdb

/dev/hdb:
Timing buffered disk reads: 64 MB in 3.06 seconds = 20.92 MB/sec
</pre>
Неплохая прибавка в скорости, не считаете?
Желающие и имеющие соответствующее оборудование, могут поиграться с параметром -X33 или -X66, включающие соответственно UDMA33 и UDMA66. Мое железо такого не тянет, посему я вынужден удовлетвориться такими результатами.

Итак, вы протестировали машину на разных тестах (или просто поработали достаточно долгое время за ней) и убедились, что винты спокойно тянут такое. Теперь достигнутое надо зафиксировать. Самое простое - добавить в конец /etc/rc.d/rc.local строчку, вызывающую hdparm с вашими параметрами. В моем случае это будет /sbin/hdparm -m2c3u1d1 /dev/hdb.

В случае RedHat-подобных дистрибутивов (ASPLinux, Mandrake, SuSE и т.д.) самое логичное - это поправить файл /etc/sysconfig/harddisks - например, параметру -m2 в нем соответствует строчка MULTIPLE_IO=2. Но этот способ не подходит тем, у кого к машине подключены разные приводы - некоторые диски могут не поддерживать режим UDMA и другие прелести современной жизни. В этом случае остается только один выход - заносить все эти параметры в rc.local.

Остается одна проблема - современные машины и ноутбуки поддерживают режим "спячки". При его включении снимается питание со всех устройств, оставляя его только на материнской плате для поддержки состояния машины. Таким образом, когда машина "просыпается", то все параметры винчестеров возвращаются к своему первоначальному состоянию. Часто при этом на консоли и в логе появляются сообщения о невозможности спозиционировать головку на диске (правильно, ведь диску необходимо время, что бы набрать скорость). Правда, надо отдать должное, на некоторых ноутбуках стоит "умный" BIOS, который возвращает им установленные значения. На Linux процессом "спячки" и "пробуждения" управляет демон apmd. Итак, если ваша машина подвержена такому недугу, придется поправить файл /etc/sysconfig/apmd (где располагается этот файл в дистрибутивах, отличных от RedHat-подобных, я не знаю, уточните по man apmd). За установку параметров диска при остановках-включениях машины отвечают эти две строчки.
<pre>
#HDPARM_AT_SUSPEND="-q -X0 -q -c0 -q -d0 -q -u0 -q -S0"
#HDPARM_AT_RESUME="-q -X66 -q -c1 -q -d1 -q -u1 -q -S30"
</pre>
Уберите комментарии (удалите символ # в начале строки) и в кавычках перепишите те параметры, которые вы передаете hdparm при запуске машины. Первая строчка выполнится при "засыпании" машины, вторая - при ее пробуждении. Параметр -q означает лишь то, что hdparm не будет никуда рапортовать о устанавливаемых параметрах.

Таким образом, вторая строчка для моего случая приобретет следующий вид.
<pre>
HDPARM_AT_RESUME="-q -m2 -q -c3 -q -d1 -q -u1"
</pre>
Но будьте осторожны, эти параметры применятся ко всем жестким дискам в системе. Как ограничить apmd - я не нашел.

Кстати, так же можно чуть разогнать и CD-ROM. Правда, не все параметры применимы и к ним (попробуйте для начала убрать -m2).
-----------------------------------------------------------------------------------------
Мои результаты:
до: 3.33 Mb/sec
после: 40.40 Mb/sec
Полезная статейка, ИМХО

CapitanJack

Мои результаты:
до: 3.33 Mb/sec
после: 40.40 Mb/sec

это скорее не торможение а не разгон

Aleksei66

Чего-то я не понял. IO32 - это возможность передавать 32 бита (а не 16) при записи или чтении в порт в PIO режиме, вроде. И mult-что-то - это возможность передавать сразу несколько секторов в PIO режиме и все это не имеет отношения к DMA. Т.е. почему бы сразу было не включить DMA?

yamushev

Хз, я не рюхал почему так а не иначе. Просто удовольствовался результатами

CapitanJack

какими резалтами нафиг? чего нормально что ли 3 мега в секунду?

yamushev

Что я тебе могу сказать? Да, были такие показатели. Да, стали такие.

CapitanJack

ну 40 мегов это нормально. но не круто и разгона нету никакого. а вот почему у него там 3 мега было - пусть разбирается.

yamushev

Кто пусть разбирается?
Просто конфигурационные файлы, поставляемые с дистрибами линуха, специально заточены не под максимальную производительность, а под максимальную совместимость. Я имел в виду то, что нормальному человеку (читай - не отцу линуха) вряд ли придет в голову, что его винт работает не на максимальной скорости. Поэтому наткнувшись на эти грабли хочу предупредить о них и других

serega435

Нда.... странное что-то
я вот точно ничего такого не делал
но:
[scooby igor]# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 10011/255/63, sectors = 160836480, start = 0
[scooby igor]# hdparm -t /dev/hda
/dev/hda:
Timing buffered disk reads: 134 MB in 3.03 seconds = 44.22 MB/sec
[scooby igor]#
а ссылки на эту статью видел неоднократно, но у меня всегда hdparm выдавал то, что надо

eduard615

Это зависит от ядра, контроллера и собстно винта. Если ядро рюхает, оно выставляет правильный режим, нет -- то стандартный.
у меня на 4.20 приходилось с хдпармом играться, а на 4.22 все само рюхается

serega435

на ядрах 2.4.19 - 2.4.22-ac2 такого замечено не было
может я что-то не так делаю
а если по теме, то это вовсе не разгон винта, это просто переход его на нормальную работу

yamushev

Все, я рюхнул почему так вышло. Просто после некоторой возни с портежами что-то случилось с загрузочными скриптами и hdparm вообще перестал запускаться при загрузке.

rc-update add hdparm default

помогло.
Да, тема, как выяснилось, неправильно обозвана, но исправить уже не могу - поздно
Оставить комментарий
Имя или ник:
Комментарий: