Программа hdparm позволяет изменить некоторые важные параметры дисковой подсистемы. Обычно при помощи изменения значений некоторых параметров удается повысить производительность системы. Настоятельно рекомендуется использовать hdparm для включения режима UDMA в случае, когда система его поддерживает, но он почему-то выключен.
Для начала запустите просто hdparm /dev/hda, чтобы увидеть статус основных режимов:
$ sudo hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 3 (32-bit w/sync)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 160086528, start = 0
Здесь у меня всё хорошо и настроено. На свежеустановленной системе всё обычно не так. Теперь посмотрим примерную производительность. Сделайте hdparm -Tt /dev/hda. 1-е число покажет скорость чтения из дискового кэша ОС (она не зависит от диска, но зависит от скорости оперативной памяти, процессора и т.д. и одинакова для всех дисков, установленных в системе). У меня она равна 340 Мб/с на довольно слабой по нынешним меркам системе. 2-е - скорость последовательного чтения с диска в его буфер. Эта скорость сильно зависит от режима доступа к диску и скорости самого диска. Если скорость меньше 10-15 Мб/с - очень плохо, на современных винчестерах такого быть не должно. Скорость порядка единиц Мб/с на современном диске определенно говорит о ненастроенности системы (скорее всего, в этом случае выключен UDMA). У меня 27 Мб/с на 20-гиговом Maxtor с 5400 об/мин и около 45 Мб/с на 80-гиговом тоже Maxtor, но с 7200 об/мин (режимы доступа - UDMA100). Замечу, что в версии 5.4 в hdparm поменялся алогритм вычисления скорости, поэтому результаты старых и новых версий сильно отличаются.
Еще у hdparm есть интересные ключи -I и -i (далее я буду приводить лишь ключи, которые в синтаксисе команды пишутся сразу после слова hdparm), выводящие получаемую от диска информацию о нем. Здесь можно посмотреть, в частности, поддерживаемые и используемые режимы работы и наличие дополнительных возможностей (напр., поддержку SMART).
Теперь будем настраивать. Во-1-х, командой hdparm -c3 /dev/hda включим 32-битный режим доступа. Включим "interrupt-unmask flag" ключом -u1. Выставим на максимум число секторов, обрабатываемых за 1 запрос (ключ -m<�число>, где <�число> может быть 32 и ниже, в зависимости от диска - если -m32 не сработает, попробуйте -m16). Также можно увеличить число последовательных секторов, считываемых "на всякий случай" при операциях чтения. Это делается ключом -a<�число>. Число подбирается индивидуально - чем оно больше, тем, до некоторого предела, будут производительнее операции последовательного чтения (в частности, вышеупомянутый тест с ключом -t) и, как правило, менее производительны операции чтения небольших объемов данных, расположенных не подряд. У меня стоит -a256, выбранное исключительно по той причине, что с этой настройкой в тесте получается максимальная скорость (конечно же, этот тест слабо отражает производительность на реальных задачах).
Разрешение проблем с режимом UDMA
Если в выводе hdparm -I вместо
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
звездочка стоит возле какого-нибудь mdma2 или, того хуже, pio4 - что-то не так. Во-1-х, попробуйте ключ -d1, он в нормальной ситуации должен включать dma (правда, в _нормальной_ ситуации он как раз не требуется - всё включается и так). Также напомню, что используемый режим должен поддерживаться одновременно диском и IDE-контроллером, поэтому у меня на 80-ке:
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 udma6
т.к. мой i815 не умеет UDMA133, хотя винт умеет. Ну и естественно, udma3 и выше возможны лишь с 80-жильным кабелем.
Если принудительное включение dma ключом -d1 не удалось, проблема лежит глубже. Выполните команду dmesg | less и поищите в загрузочных сообщениях ядра место, где говорится про инициализацию дисковых контроллеров:
ICH2: IDE controller at PCI slot 0000:00:1f.1
ICH2: chipset revision 17
ICH2: not 100% native mode: will probe irqs later
ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:DMA, hdd:DMA
Если вместо имени чипа (у меня это ICH2 - южный мост i815EP) стоит какой-нибудь Unknown - требуется обновить ядро. Например, 2.4.20 не знает о nForce2, и ничего выше mdma2 и 7 Мб/с там не получить. Если имеются еще какие-нибудь сообщения об ошибках, связанных с IDE-контроллером - надо разбираться подробнее в каждом конкретном случае.
Иногда при использовании режима, не самого быстрого из поддерживаемых, можно вручную включить более быстрый. Для этого служит ключ -X. Его можно использовать в виде -X udma5 или -X<�число>, где число в случае udma-режимов равно 64 + номер режима (69 для udma5 aka ATA100).
hdparm и CD-приводы
Большинство приведенных выше ключей работают и для CD-приводов (кроме -m, да и тесты на них особого смысла проводить нет). Плюс есть один очень полезный ключ -E, выставляющий скорость чтения (-E20, например).
И напоследок. Чтобы все установленные параметры выставлялись при каждом запуске системы, запишите в /etc/rc.d/rc.local строчку(и) для вызова hdparm с нужными параметрами, при этом ключи можно объединять, например:
hdparm -d1c3m16a256X69 /dev/hda
И не забудьте сравнить производительность (хотя бы при помощи встроенного теста) производительность до и после настройки.