Серверная (www.it-simple.ru)

Если жёсткий диск стал внезапно тормозить. Самопроизвольное включение режима PIO и как с ним бороться


Начну издалека.

Винчестер подключается к материнской плате кабелем. Этот кабель, по сути, соединяет электронику винчестера с контроллером дисков на материнской плате. Тип кабеля (IDE, SATA, ...) не имеет значения. Да, у каждого типа кабеля есть свои физические ограничения по передаче данных, но это указывает лишь на то, под какой поток данных затачивалось "железо" на его концах.

Дисковый контроллер умеет работать с дисками в нескольких разных режимах. Электроника винчестера, в свою очередь, тоже поддерживает разные режимы работы с дисковым контроллером. Наборы режимов диска/контроллера могут несовпадать и, чаще всего, именно так и бывает.

По умолчанию, операционной системой выбирается наиболее скоростной режим работы из тех, что одновременно поддерживает и контроллер, и диск.

Режимы передачи данных: PIO и DMA/UDMA

Для многих понятнее игровые аналогии, поэтому воспользуюсь одной из них.

Все знают, что 3D бывает программное (Software Rendering) и аппаратное (Direct3D, OpenGL).

В программном 3D каждый кадр высчитывается процессором, а видеокарта отвечает только за вывод полученной картинки на экран. Трёхмерные просчёты используют дикое количество математики, что сильно нагружает процессор, выдавая при этом достаточно посредственный результат. Почему так происходит? Дело в том, что Центральный Процессор (ЦП) — он универсальный, то есть, приспособлен под вычисления абсолютно разного рода. Трёхмерные вычисления представляют собой лишь узкий класс задач, которые способен выполнять ЦП. И получается, что универсальный ЦП работает с графикой неоптимально.

В случае аппаратного 3D процессор накидывает в видеокарту примитивы (текстуры, модели и т.д.) и даёт команды на их обработку, а построение сцены и красивые эффекты делает уже сама карта — с помощью своего, графического спецпроцессора (GPU, ГП), заточенного как раз под такие задачи. Вычисления на нём идут заметно быстрее, при этом центральный процессор не нагружается.

Так вот, PIO — это типа программного 3D: вся работа с диском осуществляется через ЦП. Очень медленно и ресурсоёмко.
А DMA — аппаратная обработка данных, использующая всевозможные "ускорители". Лишь бы они поддерживались контроллером и самим диском.

Windows

Винда работает с дисками в режиме DMA. Ну, как правило.

При определённых условиях (например, если произошло несколько специфических ошибок чтения-записи) винда переключает режим работы с диском в PIO. Сразу, намертво и без возможности реабилитации.

После этого заставить систему работать с диском в режиме DMA стандартными способами нельзя.
Про нестандартные — чуть ниже.

Симптомы того, что винда переключила работу с винчестером в режим PIO

В современных реалиях, когда жёсткие диски являются самыми медленными устройствами компьютера, "узким местом", тормозящим работу программ — даже двукратное падение их скорости может стать катастрофическим.

Убеждаемся, что винда переключила работу с винчестером в режим PIO

Открываем «Диспетчер устройств» в «Консоли управления» компьютером.
ПКМ на «Мой компьютер» (на рабочем столе или в панели «Пуск», не имеет значения) → «Управление».

Раскрываем в дереве ветку контроллера диска («IDE ATA/ATAPI контроллеры») и находим канал, к которому подключен наш винт.
Давим ПКМ → «Свойства» (или просто делаем двойной клик левой кнопкой мыши)

Если «Режим передачи» установлен в «DMA, если доступно», а по факту винчестер работает в режиме PIO (см. картинку ниже), то всё плохо, и это наш случай.

Возвращаем режим DMA/UDMA

Для исправления ошибки достаточно удалить инвалидное устройство и установить его заново. Сделать это можно из того же «Диспетчера устройств».

Или лезем в реестр.

В реестре («Пуск» → «Выполнить» → regedit) надо зайти в ветку по адресу:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}

Подветки:

0000 — настройки самого контроллера.
0001 — настройки первичного канала (Primary IDE Chanell).
0002 — настройки вторичного канала (Secondary IDE Chanell).

Ключи:

Те же самые ключи, начинающиеся со Slave, а не Master действуют для подчинённого устройства в канале:

Если в диалоговом окне «Тип устройства» был выбран вручную, соответствующие настройки хранятся в ключах с префиксом User:

Значение любого ключа [...]DeviceTimingModeAllowed должно быть равно 0xffffffff. Это означает, что выбранное устройство может работать в любом режиме передачи данных, без ограничений.

Если значение ключа равно 0x00000001f (HEX 1f), то устройство может работать только в режиме PIO.

Меняем значение нужного [...]DeviceTimingModeAllowed на "ffffffff" и перезагружаемся.

Дополнительно

Коды режимов работы:

0х0000001f — PIO
0x00000410 — Multi-Word DMA Mode 2 и PIO 4.
0x00002010 — UDMA Mode 2 (ATA33).
0x00008010 — UDMA Mode 4 (ATA66). Для включения можно использовать маску "0x0000ffff"
0x00010010 — UDMA Mode 5 (ATA100). Для включения можно использовать маску "0x000fffff"


Версии ATA/ATAPI (...4,5,6...) - это версии ATA/ATAPI спецификации утверждаемые комитетом X3T13. А PIO (Programmed Input-Output) и DMA/UDMA - это режимы передачи данных. Одно с другим никак не связано. Режимы PIO подразумевают обязательное задействование CPU при передаче данных - при чтении данных с носителя, CPU их читает из порта контроллера (команда IN процессора), при записи - CPU пишет в порт (команда OUT). При DMA (UDMA) режимах CPU только инициализирует пересылку (а предварительно еще и контроллер DMA) - всю остальную работу выполняют контроллер DMA (Direct Memory Access) и контроллер IDE (в режиме Bus Master). Понятно что последний вариант выгоднее - меньше загрузка процессора - поэтому PIO режимы после 1995 года никто больше не развивал, и в утвержденных ATA/ATAPI спецификациях (мне все равно, кто чего предлагал на заседаниях X3T13) PIO-5 никогда не было. А UltraDMA 44 - это UltraDMA 3 - этот режим существует, просто им почти никто не пользуется (так как его поддержка есть везде, где есть UDMA 4 - 66). Кстати ATA/ATAPI-6 еще не утвержден, этот документ существует в предварительной версии, так называемый working draft, и возможно еще будет меняться (но вряд-ли туда добавят PIO-5). Последний из утвержденных - версии 5. И UDMA66 появилось при ATA-4, а UDMA100 - при ATA-5... В спецификациях есть рекомендации по применению режимов передачи данных, а вовсе не обязательные требования их поддержки... Есть винты соответствующие ATA-5, но поддерживающие только UDMA66 (например Quantum Fireball+ LM). А еще есть CD-ROM'ы с поддержкой UDMA33 и с соответствием ATAPI-4 и 5... Начиная с версии 4, спецификации ATA и ATAPI объединили в один документ.

http://forum.ixbt.com/topic.cgi?id=11:13794 (http://forum.ixbt.com/topic.cgi?id=11:13794)


Это происходит если XP обнаруживает что устройство не стабильно работает в выбранном для него режиме. Определяется это по количеству ошибок чтения, получаемых с привода. Обычно это означает что привод находится в плохом состоянии, и про правде ему надо бы на покой. Но выбрасывать вроде бы работающий привод жалко, поэтому такие устройства можно встретить в машинах наших читателей. Хотя, благодаря механизмам контроля ошибок, многие такие приводы могут работать долго, счастливо и беспроблемно, не смотря на мнение XP о них. Единственное, что портит кровь их владельцам, это постоянные тормоза системы, из за PIO режима. У меня нет полной уверенности, как работает и чем управляется система контроля ошибок в XP, поэтому я не могу гарантировать что этот совет сработает во всех случаях. Но попробовать можно.
Для отключения режима отслеживания ошибок можно попробовать выставить в 0 ключ ErrorControl расположенный по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs\

http://old.windowsfaq.ru/ubb/Forum4/HTML/005268.html (http://old.windowsfaq.ru/ubb/Forum4/HTML/005268.html)

Для винчестеров данная рекомендация не работает, не помогает от вылетов в PIO.