VincentLaw 28.01.2012 15:15 8783856641327753089913620

Купил на сменю 250гиговому харду 750 от WD. Дошли руки разобраться, почему домашная файловая помойка тормозит, когда общается с новым винтом: периодический бэкап вызывает DoS всех файловых сервисов. Бился над включением AHCI+NCQ, а рано по утру заглянул в SMART к своему диску и обнаружил вот такое:

$ sudo smartctl -a /dev/sda | grep Load_Cycle_Count
193 Load_Cycle_Count 0x0032 158 158 000 Old_age Always — 127583

Раньше думал, что это счётчик интервалов активности винта. Зевая, полез в википедию:

Count of load/unload cycles into head landing zone position.
The typical lifetime rating for laptop (2.5-in) hard drives is 300,000 to 600,000 load cycles. Some laptop drives are programmed to unload the heads whenever there has not been any activity for about five seconds. Many Linux installations write to the file system a few times a minute in the background. As a result, there may be 100 or more load cycles per hour, and the load cycle rating may be exceeded in less than a year.

Чего?! У меня 127 тысяч раз произошла парковка головок? Зевота прекратилась.

Кто виноват?

Быстрый гуглёж нашёл, что товарищи из WD в серию WD Caviar Green включили супермегаопцию Intelli-Park, которая паркует головки после 8 секунд неактивности. Linux, понятно, откладывает запись буферов на диск на куда большее время:

$ cat /proc/sys/vm/dirty_writeback_centisecs
1000

… и получается откровенно гадкая ситуация:

t+0 сек. Приложение пишет на диск, ядро кладёт всё в буфер.
t+8 сек. Винт: ой, активности нет, головки в landing zone
t+10 сек. Ядро: так, пора писать.
t+10+ сек. Винт: головки на исходную! Пишем.
t+18 сек. Винт: всё, расслабились, головки в landing zone
t+20 сек. Ядро: так, опять пора писать.
t+20+ сек. Винт: что, уже поспали? Головки в готовность, пишем.


Т.е. одна потенциально хорошая фича «засыпать во время неактивности» в сумме с другой хорошей фичей «откладывать запись и писать всем куском» даёт чёрт знает что: винт думает, что пора спать, в то время как реально в системе происходят активные операции. Луч ненависти тому, кто придумал выставить таймаут в 8 секунд.

UPD2: Запись на WD'шном саппорте: «Сами дураки, отключайте syslog».

Что делать?

Просто так всё это не исправить. По этому поводу повторный луч ненависти инженерам комании WD, луч ненависти маркетологам WD.

Слухи утверждают, что существует полу-секретная утилита от WD, которая меняет дефолтовый интервал на какой угодно. Называется это чудо WDIDLE3.EXE, работает оно исключительно под DOS, и по разным сведениям, не работает для некоторых WD'шных винтов.
Раздобыть WDIDLE3.EXE. Не привожу точный адрес, т.к. по-хорошему этот тул нужно просить у WD'шного саппорта. Найденные на просторах интернета версии можно использовать на свой страх и риск. Не оказывайте «медвежью услугу» другим, давая прямые ссылки или заливая на файловые хостинги.
Взять ISO SystemRescueCd и его слегка похачить. Нам нужно положить WDIDLE внутрь FreeDOS'вского образа, и для этого придётся сделать следующий реверанс.
Слить Balder-версию FreeDOS'а, ибо FreeDOS в SysRescCd поломан.
Положить внутрь balder10.imz нужный WDIDLE3 (распаковать gunzip'ом, смонтировать, скопировать, размонтировать, запаковать gzip'ом обратно)
Заменить в SysRescCD bootdis/freedos.img на полученный образ
Нарезать SysRescCD или положить его на LiveUSB
Загрузиться с него в FreeDos и там выполнить WDIDLE
На этом месте я повторно пускаю луч ненависти в WD, потому что выключение IDLE вообще привело к тому, что винт начал парковаться чуть ли не каждую секунду. Наблюдал старт системы в течение 5 минут, потом плюнул и поставил IDLE-таймаут в 600 секунд.

После этих операций Load_Cycle_Count расти перестал.

UPD: Кроме того, пропали проблемы с производительностью во время записи: бекапы теперь проходят незаметно, а bonnie++ на 16 потоках не блокирует систему намертво.

http://melinux.ru/blog/157.html (C)

Recommended by: @kusayuzayushko
1. SirAnthony 28.01.2012 15:25 home

Почему просто не уменьшить таймаут?

2. VincentLaw 28.01.2012 18:20

таймаут чего?

3. SirAnthonyVincentLaw /2 28.01.2012 18:27 home

echo 500 > /proc/sys/vm/dirty_writeback_centisecs

4. VincentLawSirAnthony /3 28.01.2012 18:37 720157631327769829397268

но тогда как я понимаю в ряде случаев писалось бы маленькими кусками всё на винт

5. VincentLawVincentLaw /4 28.01.2012 18:39 720157631327769829397268

да и всё равно очень короткое время бездействия задано для парковки головок как бы система ни была настроена

6. SirAnthonyVincentLaw /4 28.01.2012 18:45 home

Ну а в чем проблема? Если ничего не происходит, все равно те же маленькие куски.

7. VincentLawSirAnthony /6 28.01.2012 18:46 720157631327769829397268

ладно оставим запись пока в покое, зачем столь маленький интервал задали с парковкой головок? это просчёт я тоже так считаю

8. SirAnthonyVincentLaw /7 28.01.2012 18:48 home

Это производитель, тут ничего не поделаешь.

9. VincentLawSirAnthony /8 28.01.2012 18:59 720157631327769829397268

ну вот, тут описан метод исправления ситуации :3

10. SirAnthonyVincentLaw /9 28.01.2012 19:10 home

Это костыли а не исправление.

Do you really want to delete ?