DRAM-кэширование в жестких дисках
Современные жёсткие диски (HDD) остаются важным компонентом инфраструктуры хранения, несмотря на широкое распространение SSD. Производительность и надёжность HDD во многом зависят от встроенных механизмов кэширования. В этой статье мы рассмотрим:
-
- DRAM-кэш как базовый уровень буферизации.
- SCSI-уровень управления кэшем (Mode Page 08h, биты WCE, RCD, FUA и др.).
- Поддержка со стороны операционных систем и приложений.
- Защиту данных при аварийном отключении питания (EPO-safe cache)
- Технологию ArmorCache от Western Digital
Диаграмма 1: Иерархия кэша HDD

1. DRAM-кэш в HDD
На плате контроллера каждого современного HDD установлен буфер памяти DRAM — от десятков до сотен мегабайт. Размер кэша варьируется в зависимости от класса диска:
- Desktop: 64-128 МБ
- Enterprise: 128-512 МБ
Основные функции
Буферизация записи. Записи от хоста сначала попадают в DRAM, что позволяет диску отвечать со скоростью ~50 мкс вместо 5-15 мс механической записи. При случайной записи производительность может увеличиться в разы.
Чтение с опережением (read-ahead). Контроллер предугадывает последовательные обращения и заранее подгружает данные. Размер prefetch обычно настраивается от 64 КБ до нескольких МБ.
Оптимизация очередей. Совместно с NCQ (Native Command Queuing) DRAM помогает контроллеру переупорядочить до 32 команд одновременно, минимизируя движения головок через алгоритмы типа SCAN или C-SCAN.
Метаданные. В кэше хранятся служебные структуры: таблицы переназначения секторов, информация о зонах (для SMR), данные калибровки головок.
Ограничения
Волатильность. При отключении питания содержимое DRAM теряется через ~1-5 мс после падения напряжения.
Риск потери данных. Если диск подтвердил запись (отправил GOOD status), но данные остались только в DRAM, то при внезапном отключении питания они будут утеряны. Это особенно критично для СУБД и файловых систем.
2. Управление кэшированием на уровне SCSI
Протокол SCSI (и его SAT-транслированные версии для SATA) позволяет управлять кэшированием через Mode Page 08h (Caching Page). Страница содержит 20 байт параметров.
Ключевые поля и биты
WCE (Write Cache Enable) — бит 2 в байте 2:
- WCE=1: диск может подтверждать запись после приёма в DRAM (~200-300 IOPS случайной записи)
- WCE=0: подтверждение только после физической записи (~80-150 IOPS случайной записи)
RCD (Read Cache Disable) — бит 0 в байте 2:
- RCD=1: запрещает read-ahead и кэширование чтения
- Редко используется, так как read-кэш безопасен для целостности данных

Mode page 08h
FUA (Force Unit Access):
- Устанавливается в CDB команд WRITE(10/16)/READ(10/16)
- Принуждает выполнить операцию с носителем, игнорируя кэш
- Позволяет выборочно обходить WCE для критичных записей

Write(10)
SYNCHRONIZE CACHE (10/16):
- Опкод 0x35/0x91
- Принудительно сбрасывает весь write-кэш на диск
- Время выполнения: от единиц до десятков миллисекунд
Диаграмма 2: Сравнение путей записи
Стандартная запись (WCE=1):
Хост ──► DRAM ──► [ACK] ──► Пластины (позже) 50мкс мгновенно в фоне
Запись FUA:
Хост ──► DRAM ──► Пластины ──► [ACK] 50мкс 5-15мс завершение
Событие EPO в ArmorCache:
Потеря ──► Аварийное ──► iNAND ──► Восстановление питания обнаружение сохр. (след. загрузка) ◄─ 100мс ─► 2мс → Пластины
Проверка и настройка в Linux
# Просмотр текущих настроек кэша
sg_modes -p 8 /dev/sdX sdparm —page=ca —all /dev/sdX
# Отключение write cache (безопасно, медленно)
sdparm —set=WCE=0 /dev/sdX echo «write cache: off» | tee /sys/block/sdX/queue/write_cache
# Принудительный сброс кэша
sg_sync /dev/sdX sync && echo 3 > /proc/sys/vm/drop_caches
3. Поддержка со стороны ОС и приложений
Linux
Системные флаги:
- O_SYNC/O_DSYNC: каждая запись выполняется с обязательным FUA (минуя кэш)
- O_DIRECT: обходит кэш ОС, но не гарантирует FUA к диску
- fdatasync()/fsync(): переводятся в SYNCHRONIZE CACHE команды
Файловые системы:
- ext4: использует barriers (FLUSH + FUA) для журналирования
- XFS: активно применяет FUA для метаданных
- Btrfs: FUA для COW-операций и чекпойнтов
ZFS
ZFS активно использует FUA для ZIL (ZFS Intent Log) записей, чтобы минимизировать задержки от лишних SYNCHRONIZE CACHE. При высокой нагрузке это может давать 2-3x улучшение latency по сравнению с FLUSH-based подходом.
Windows
FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING заставляют драйвер выставлять FUA, если диск его поддерживает. В enterprise сценариях SQL Server и Exchange активно используют эти флаги.
4. Защита при аварийном отключении питания: EPO-safe cache
При включённом кэше данные операций записи могут находиться DRAM. Даже enterprise диски теряют питание DRAM за 1-5 мс, что недостаточно для записи на пластины. Для сохранности данных, в режиме с выключенным кэшем диски используют минимальный объем DRAM для ускорения работы (до 2МБ). Этот мини-кэш может быть сохранен даже в случае аварийного отключения питания (EPO — emergency power-off). Для сохранения используется энергия шпинделя с пластинами, который в случае аварии выполняет роль генератора.
- Детектор падения напряжения (~4.0V для 5V rail)
- Экстренная парковка головок (1-2 мс)
- Аварийный сброс кэша в небольшой NOR flash (~2 МБ)
- При следующем включении — восстановление и дозапись
Ограничения традиционного подхода
50-100мс, на которые хватает энергии останавливающегося шпинделя, хватает на сброс в аварийное хранилище только небольшого объема данных.
5. ArmorCache (Western Digital OptiNAND)
В новых HDD (20+ TB) Western Digital кардинально переосмыслила подход в технологии ArmorCache (часть OptiNAND-архитектуры):
64 ГБ NAND flash интегрируется прямо на плату диска. Это не гибридный подход (как в SSHD), а специализированное хранилище для метаданных и аварийного кэша.
Более быстрая память, по сравнению с традиционным NOR, позволяет сбросить в неволатильную памяти в случае аварии 100+ МБ за время остановки шпинделя. Таким образом, даже в режиме с отключенным кэшем, диск работает с приличным буфером за запись, не подвергая риску данные. Это кардинально увеличивает производительность в WCD режиме, особенно на больших размерах IO.

Улучшенная EPO-защита
- Traditional HDD: 2 МБ emergency storage
- ArmorCache: 100+ МБ emergency storage
- Полная защита write cache даже при WCE=1
Режимы работы
Write Cache Enable (WCE=1) + ArmorCache:
- Высокая производительность (~250+ IOPS random write)
- Полная защита от потери данных при EPO
- Фактически устраняет trade-off между производительностью и безопасностью
Write Cache Disable (WCE=0) + ArmorCache:
- Скорость приближается к WCE=1 за счёт буферизации в iNAND
- Двойная гарантия целостности данных
- Подходит для самых критичных применений
Заключение
Для системных инженеров критично понимать взаимодействие всех уровней кэша. Неправильная конфигурация кэша может привести как к потере производительности (излишне консервативные настройки), так и к потере данных (агрессивное кэширование без учёта EPO-сценариев).
Практические рекомендации
- OLTP базы: WCE=0 или ArmorCache-enabled диски, возможно защищенный батарейкой кэш на запись на аппаратном RAID-контроллере
- Аналитика/DWH: WCE=1 с регулярными SYNC
- Бэкапы: WCE=1 приемлемо
- Критичные системы: всегда тестировать EPO-сценарии
Автор: Олег Ларин
Добавить комментарий
Комментариев пока нет