FREESCO на Украине Официальный сайт FREESCO

FREESCO router

(программный маршрутизатор на основе Линукс)
Главная/Main -> Документация/Documentation -> Статьи/Articles -> Тюнинг HDD (дисковой подсистемы)

Тюнинг HDD (дисковой подсистемы)

Зачем?

Фриске, в первоначальном варианте это все ни к чему, потому как она вообще в жестком диске не нуждается.
Но мы то юзаем ее продвинуто, уже установили squid для скорости или контроля, samba для драйверов, антивирусных баз или фильмов.
Да и в случае FTP сервера уже возникает необходимость в ускорении работы дисков, тем более что винчестеры то небось не древние, по 120 мегабайт :)

Вот здесь Вы и можете применить эти знания.
Для своего основного роутера с такой конфигурацией P233MHz/64Mb и жестким диском Fujitsu 3.2Gb я добился увеличения скорости чтения в полтора раза, без включения DMA.

На машине PIII-500MHz/64Mb на которой стоит ZipSlack39 и компилятся все пакеты для Фриски стоят два винта Seagate 3.2Gb и Quantum 3.2Gb для них увеличение получилось в 1.3 и почти в два раза соответственно.

Это все на стандартном ядре и ядре рекомендованном с поддержкой PPTP.
При использовании ядер включающих поддержку DMA режимов прирост намного значительнее, в 2-5 раз. И главным образом обусловлен именно включением DMA. Ну а дополнительный тюнинг еще немного увеличивает производительность.

Пример

Seagate 3.2Gb на PIII-500.

Утилита используемая для этих целей это hdparm. Ее нет в поставке фриски, потому как она там ни к чему, но вы можете ее загрузить как указано и сохранить в /pkg/bin: cd /pkg/bin snarf ftp://ftp.linux.kiev.ua/pub/Linux/freesco/home/0.3.x/utils/hdparm chmod +x hdparm pkg -rescan Особо любопытные набирают hdparm -h или вообще без параметров, и самоcтоятельно изучают ключи запуска :)
Или читают man hdparm(8)
А нас интересует пока главный параметр которым мы можем узнать текущую скорость чтения данных: hdparm -t /dev/hda Если он ответит /dev/hda: could not allocate sharedmem buf: Function not implemented Эт конечно плохо, но не смертельно :) Первое, Вы можете поставить новое ядро с поддержкой этих функций. Я не вникал особенно но по моему это именно VIPC. Для v3.4 у меня стоит ядро pptp. Ядра можно взять на страничке загрузок. Если менять ядро нет нужды или возможности, то прийдется руководствоваться субъективными впечатлениями от копирования больших файлов или еще каким способом проверять быстродействие... У меня выдало такую скорость [root@Freesco] hdparm -t /dev/hda /dev/hda: Timing buffered disk reads: 64 MB in 19.71 seconds = 3.25 MB/sec

Теперь нас интересует вывод с ключами 'i' и 'v', кое в чем эти информация дублируется, но нам полезен будет вывод обоих ключей. Можно по отдельности, но я сразу оба ввожу: hdparm -iv /dev/hda [root@Freesco] hdparm -iv /dev/hda /dev/hda: 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 = 787/128/63, sectors = 6346368, start = 0 Model=ST33210A, FwRev=3.02, SerialNo=7AB0WHFS Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=6296/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=256kB, MaxMultSect=16, MultSect=off CurCHS=6296/16/63, CurSects=6346368, LBA=yes, LBAsects=6346368 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 Нам интересен параметр MaxMultSect. Это максимальное значение для винчестера которое может быть присвоено MultSect. Текущее значение в данный момент 'выключен', также он показан в первой строке 'multcount = 0 (off)'. В некторых режимах он существенно влияет на производительность.

Теперь выставим режим pio4 32-разрядный доступ и максимальный multcount [root@Freesco] hdparm -X12c3m16t /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 setting xfermode to 12 (PIO flow control mode4) multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 16.84 seconds = 3.80 MB/sec Уже лучше.
Выставим multcount=8: [root@Freesco] hdparm -X12c3m8t /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 8 setting xfermode to 12 (PIO flow control mode4) multcount = 8 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 14.86 seconds = 4.31 MB/sec Вот это уже значительно лучше :)
при m=4: Timing buffered disk reads: 64 MB in 15.78 seconds = 4.06 MB/sec то есть оптимальный режим получился при multcount=8

Теперь включим DMA, вернее заменим ядро на поддерживающее его.
Я взял ядро kernel-032.p2triton.bin, для первых пентиумов это будет kernel-032.pci-ide.bin или kernel-032.triton.bin, без упоминания p2. В принципе именно опция поддерживающая чипсеты triton, включает также и поддержку DMA.
Включение и выключение DMA производит опция '-d1' или 'd0' соответственно. Но если вы взяли новое ядро, то она по возможности включиться автоматически, никаких дополнительных включений не нужно делать. Используемая мной опция 'X' переключает сами режимы доступа и вычисляется по такому принципу:
для режимов pio к номеру режима надо прибавить 8. поэтому X12 которую я указывал соответствует pio mode 4.
Для режимов UltraDMA-33 прибавить необходимо уже 32, самый частоупотребляемый параметр, это X34 включает режим dma2.
Для режимов UltraDMA-66 прибавить необходимо уже 64.

Но к сожалению, на всех моих тестовых платформах только с одним HDD, Quantum 10Gb, использование параметра 'X' вместе с включенным DMA не привело к мертвому зависанию системы, хотя и не дало никакого выиграша в скорости :(. Поэтому будьте очень осторожны. С выключенным же DMA, никаких подвисаний ни разу замечено не было. [root@Freesco] hdparm -ivt /dev/hda /dev/hda: multcount = 0 (off) I/O support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 1 (on) keepsettings = 0 (off) nowerr = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 787/128/63, sectors = 6346368, start = 0 Model=ST33210A, FwRev=3.02, SerialNo=7AB0WHFS Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=6296/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=256kB, MaxMultSect=16, MultSect=off CurCHS=6296/16/63, CurSects=6346368, LBA=yes, LBAsects=6346368 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 Timing buffered disk reads: 64 MB in 13.51 seconds = 4.74 MB/sec Ну вот а теперь немного тюнинга: [root@Freesco] hdparm -c3m16t /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 9.27 seconds = 6.90 MB/sec Из более новых винчестеров я провел тестирование только для двух, Quantum 10 Gb и WesternDigital 20Gb. Включение DMA играет решающую роль, и подымает скорость в разы. Остальные параметры влияли на производительность мало как в режиме DMA, так и без него :(.
Хотя я надеюсь у вас получиться лучше :)

Как?

Я как правило вставляю код запуска hdparm в секцию boot) файла rc_user, хотя выполнить его можна в любом, удобном для вас месте. boot) # Setup devices. hdparm -c3m16 /dev/hda ;;

Еще один способ состоит в использовании пакета edrive (автор gnork).
Кроме того удобства что он предоставляет по подключению HDD и разделов к системе, у него в конфигурационном файле есть раздел для hdparm, который вы можете настроить по вкусу.
Вообще этот пакет весьма полезен, для работы с HDD.

Еще несколько тестов:

Я приведу результаты для еще нескольких винчестеров.

Для моего рабочего P233 /Fujitsu 3.2Gb.

Default kernel: [root@Freesco] hdparm -vt /dev/hda /dev/hda: 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 = 785/128/63, sectors = 6335280, start = 0 Timing buffered disk reads: 64 MB in 19.62 seconds = 3.26 MB/sec
Потом: [root@Freesco] hdparm -X12c3m16t /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 setting xfermode to 12 (PIO flow control mode4) multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 12.87 seconds = 4.97 MB/sec кстати при multcount=8 результат был: Timing buffered disk reads: 64 MB in 16.33 seconds = 3.92 MB/sec То есть експериментировать нужно с каждым винчестером отдельно.
При ядре triton которее умеет dma результаты таковы: [root@Freesco] hdparm -ivt /dev/hda /dev/hda: multcount = 0 (off) I/O support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 1 (on) keepsettings = 0 (off) nowerr = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 785/128/63, sectors = 6335280, start = 0 Model=FUJITSU MPC3032AT, FwRev=6018, SerialNo=00012112 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } RawCHS=6704/15/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=0kB, MaxMultSect=16, MultSect=off CurCHS=6704/15/63, CurSects=6335280, LBA=yes, LBAsects=6335280 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 Timing buffered disk reads: 64 MB in 11.98 seconds = 5.34 MB/sec Ну и немного тюнинга: [root@Freesco] hdparm -c3m16t /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 9.79 seconds = 6.54 MB/sec

Вот еще один Quntum 3.2Gb на PIII-500.

На нем скомпилировались практически все мои проекты для FreeSCO до сегодняшнего дня.
Без DMA, default kernel: [root@Freesco] hdparm -ivt /dev/hdc /dev/hdc: 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 = 782/128/63, sectors = 6306048, start = 0 Model=QUANTUM FIREBALL EX3.2A, FwRev=A0A.0400, SerialNo=673825930559 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } RawCHS=6256/16/63, TrkSize=32256, SectSize=21298, ECCbytes=4 BuffType=DualPortCache, BuffSize=418kB, MaxMultSect=16, MultSect=off CurCHS=6256/16/63, CurSects=6306048, LBA=yes, LBAsects=6306048 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 Timing buffered disk reads: 64 MB in 16.01 seconds = 4.00 MB/sec И после: [root@Freesco] hdparm -X12c3m16t /dev/hdc /dev/hdc: setting 32-bit I/O support flag to 3 setting multcount to 16 setting xfermode to 12 (PIO flow control mode4) multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 8.42 seconds = 7.60 MB/sec Включаем DMA (ядро kernel-032.p2-pci-ide.bin): [root@Freesco] hdparm -ivt /dev/hdc /dev/hdc: multcount = 0 (off) I/O support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 1 (on) keepsettings = 0 (off) nowerr = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 782/128/63, sectors = 6306048, start = 0 Model=QUANTUM FIREBALL EX3.2A, FwRev=A0A.0400, SerialNo=673825930559 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } RawCHS=6256/16/63, TrkSize=32256, SectSize=21298, ECCbytes=4 BuffType=DualPortCache, BuffSize=418kB, MaxMultSect=16, MultSect=off CurCHS=6256/16/63, CurSects=6306048, LBA=yes, LBAsects=6306048 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 Timing buffered disk reads: 64 MB in 6.67 seconds = 9.60 MB/sec тюнингуем: [root@Freesco] hdparm -c3m18t /dev/hdc /dev/hdc: setting 32-bit I/O support flag to 3 setting multcount to 16 multcount = 16 (on) I/O support = 3 (32-bit w/sync) Timing buffered disk reads: 64 MB in 5.17 seconds = 12.38 MB/sec Ну мне Quantum всегда нравились :)

Вывод:

Тут вывод один. Ставьте новое ядро и по желанию разганяйте винчестер. В особенности если у вас мало памяти и вы используете swap. Ну а для дисковых сервисов типа FTP, samba, squid, даже для http прирост производительности можна будет заметить.

Успехов.