Выберите продукт

LVM cache (dm-cache) в Linux: ускоряем HDD с помощью SSD/NVMe без миграции данных

LVM cache (dm-cache) позволяет подключить SSD/NVMe как кэш к медленному HDD-томy и ускорить I/O без переноса данных. Разберём cache pool/origin, writeback и writethrough, policy smq, настройку через lvconvert, мониторинг lvs и тесты fio.
LVM cache (dm-cache) в Linux: ускоряем HDD с помощью SSD/NVMe без миграции данных

Зачем нужен LVM cache и что именно он ускоряет

LVM cache (он же dm-cache) — это слой в device-mapper, который позволяет использовать быстрый SSD/NVMe как кэш для более медленного логического тома на HDD (или просто более медленного пула). Для админа это часто самый быстрый способ «вдохнуть жизнь» в дисковую подсистему: не перестраивая разметку, не перенося данные и не трогая приложение.

Суть простая: горячие блоки данных держим на быстрых носителях, холодные остаются на базовом томе. В типовых веб-нагрузках это даёт прирост на случайных чтениях и на части сценариев случайной записи (в зависимости от режима кэша), снижает латентность и разгружает HDD от постоянного «дребезга».

Важно понимать ограничения: кэш не заменяет SSD «по-настоящему». Если рабочий набор данных больше объёма кэша, а запись идёт плотным потоком, выигрыш может быть скромным. Но для смешанной нагрузки (лог-файлы, метаданные, небольшие БД, кэши приложений, множество мелких файлов) dm-cache часто попадает в цель.

Ключевые понятия: cache pool, origin, cachemode, cachepolicy

Из чего состоит LVM cache

В терминах LVM вы обычно увидите:

  • origin LV — исходный логический том с «настоящими» данными (обычно на HDD).
  • cache pool — пул кэша на SSD/NVMe, который состоит из двух частей: data LV (данные кэша) и metadata LV (метаданные кэша).
  • cached LV — результат «склейки» origin + cache pool; для ОС это тот же LV, но с ускорением.

cachemode: writethrough vs writeback

Параметр cachemode определяет поведение записи:

  • writethrough — запись подтверждается только после записи на основной том (HDD). Кэш может обновляться, но отказ SSD не должен приводить к потере подтверждённых данных. Это более безопасный режим.
  • writeback — запись подтверждается после попадания в кэш на SSD/NVMe, а на HDD «сбрасывается» позже. Это даёт заметный выигрыш на случайных записях, но повышает риски при внезапном отключении питания и при проблемах с кэш-устройством.

Если у сервера нет гарантированной защиты питания (UPS, батарейный кэш, стабильная инфраструктура) или нагрузка критична к целостности, начинайте с writethrough. Режим writeback имеет смысл, когда вы осознанно принимаете риск и обеспечили питание/резервирование.

cachepolicy: smq и зачем он нужен

Политика кэширования (cachepolicy) определяет, какие блоки считать «горячими» и держать на SSD. В современном LVM чаще всего используют smq (stochastic multiqueue) — это дефолтный и наиболее практичный вариант для смешанной нагрузки. Встречается также mq, но в большинстве случаев проще ориентироваться на smq.

Политика важна, но не превращайте её в культ: в реальных системах больше решают объём кэша, режим записи и то, насколько рабочий набор данных помещается в SSD.

Схема LVM cache: origin LV на HDD и cache pool на SSD/NVMe

Перед стартом: когда dm-cache уместен и какие есть альтернативы

Подходит ли вам LVM cache

Хорошие кандидаты:

  • Один большой HDD-том, который «душит» латентностью, но перенос на SSD сейчас невозможен.
  • Файловые сервисы/CI/сборки, где много мелких файлов и повторяющихся чтений.
  • Веб-проекты с большим количеством статики и кода на HDD (часто ускоряет TTFB за счёт чтений).

С осторожностью:

  • «Горячая» БД с тяжёлой записью: writeback может помочь, но риски выше, а SSD может стать узким местом по ресурсу/выносливости.
  • Нагрузка, которая последовательно пишет/читает терабайты — кэш будет постоянно вытесняться.

bcache vs lvmcache: кратко по делу

Частый вопрос: bcache vs lvmcache. Практическая разница такая:

  • LVM cache — нативно живёт в экосистеме LVM: удобно тем, у кого уже LVM, снапшоты/тонкие тома/расширения. Управление через lvconvert, мониторинг через lvs.
  • bcache — отдельный слой блочного устройства, часто хорошо работает как кэш для raw-диска/раздела, но интеграция с LVM у каждого своя. Миграция/эксплуатация могут быть менее «родными» для LVM-ориентированных систем.

Если у вас всё уже на LVM — обычно проще и логичнее начать с dm-cache.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Подготовка: SSD/NVMe, TRIM и базовые проверки

Проверьте, что SSD/NVMe «живой» и подходит по ресурсу

Кэш будет активно писать (особенно в writeback), поэтому важны ресурс и стабильность SSD. Минимум проверьте SMART и оцените TBW/выносливость. Если это потребительский SSD без PLP (power loss protection), используйте writethrough или обеспечьте UPS.

TRIM/discard: включать ли

На SSD/NVMe обычно полезно периодически делать TRIM через fstrim. Для LVM-кэша и device-mapper есть нюансы, зависящие от версии ядра и стека, но практическое правило простое: не включайте агрессивный online-discard «на всё подряд», если не уверены в влиянии на производительность. Чаще безопаснее настроить периодический fstrim по расписанию.

Если том используется под веб-стек и вы параллельно настраиваете кэширование на уровне прокси, пригодятся практики из статьи про кэширование и map в Nginx для статики: иногда выигрыш от правильного HTTP-кэша сравним с эффектом от ускорения диска.

Пошаговая настройка LVM cache: от PV до lvconvert

Ниже — типовой сценарий: у вас есть VG с HDD, и вы добавляете SSD/NVMe как отдельный PV под cache pool. Команды примерные: адаптируйте имена устройств, VG и LV.

1) Добавляем SSD как PV и расширяем VG (если нужно)

pvcreate /dev/nvme0n1
vgextend vg0 /dev/nvme0n1

Если SSD вы хотите держать в отдельной VG — можно, но чаще удобнее держать в той же VG, где origin LV (тогда проще команды и меньше шансов ошибиться).

2) Создаём cache pool на SSD/NVMe

Кэш-пул обычно делают как LVM cache pool с отдельными data и metadata. Пример: 200G под данные кэша и 2G под метаданные (точные размеры зависят от объёма кэша и версии LVM; метаданные обычно на порядки меньше data).

lvcreate -L 200G -n lv_cache_data vg0 /dev/nvme0n1
lvcreate -L 2G -n lv_cache_meta vg0 /dev/nvme0n1
lvconvert --type cache-pool --poolmetadata vg0/lv_cache_meta vg0/lv_cache_data

После --type cache-pool LVM превратит data LV в cache pool, привязав к нему metadata.

3) Подключаем cache pool к origin LV

Допустим, ваш исходный том: vg0/lv_data (на HDD). Подключим кэш:

lvconvert --type cache --cachepool vg0/lv_cache_data --cachemode writethrough --cachepolicy smq vg0/lv_data

Проверьте, что вы кэшируете именно нужный LV: после конвертации точка монтирования и UUID ФС обычно остаются прежними, но цена ошибки в имени тома высокая.

4) Проверяем, что всё поднялось

В реальной жизни помогает именно расширенный вывод lvs -a -o:

lvs -a -o +devices,segtype,cachemode,cachepolicy,cache_settings,metadata_percent,data_percent vg0

Смотрите, что segtype стал cache для целевого LV, а также контролируйте data_percent и metadata_percent у cache pool.

Эксплуатация: мониторинг, обслуживание, отключение кэша

Как понять, что кэш «попадает»

Самый прямой путь — наблюдать динамику data_percent (заполненность кэша), метрики I/O и латентность на устройстве HDD. Косвенные признаки успеха: снижение iowait, уменьшение очередей на HDD, рост IOPS на чтении/случайной записи.

Ещё один практичный метод — снять профиль нагрузки до/после: 10–15 минут типовой работы сервиса, затем сравнить iostat/pidstat и время ответов приложения.

Как безопасно сменить cachemode

Иногда начинают с writethrough, а потом переходят на writeback. Делайте это в окно работ и с пониманием рисков питания.

lvchange --cachemode writeback vg0/lv_data

Проверьте результат:

lvs -a -o +segtype,cachemode,cachepolicy vg0/lv_data

Как отключить кэш (если нужно)

Плюс dm-cache в том, что это «навесной» слой. Если нужно вернуться к обычному LV, кэш можно отсоединить. Конкретные команды зависят от версии LVM и типа кэша, но общий порядок такой: убедиться, что «грязные» данные сброшены (в writeback), затем выполнить split/detach операции.

Перед отключением кэша сделайте бэкап и проверьте план отката на стенде: ошибки в командах LVM часто не оставляют «второго шанса».

Проверка LVM cache командой lvs: видны cachemode, cachepolicy и проценты заполнения

dm-cache и файловые системы: ext4 и XFS

С точки зрения LVM cache файловая система внутри тома (например, ext4 или XFS) обычно не требует специальных настроек. Кэш работает на блочном уровне ниже ФС. Тем не менее:

  • ext4 часто проще в типовом восстановлении штатными утилитами и привычнее во многих VPS/VDS-сценариях.
  • XFS обычно хорош на больших объёмах и параллелизме, но требовательнее к корректному завершению работы и аккуратному обращению с диском.

Ключевой момент не в ext4/XFS, а в том, какой cachemode вы выбрали и насколько защищено питание. При writeback риск при power loss выше независимо от ФС, потому что подтверждённые записи могли не успеть попасть на origin.

Особый случай: thin pool и dm-cache

Thin pool в LVM — мощная штука (тонкие тома, снапшоты), но сочетание с кэшированием требует аккуратности. Возможны разные схемы: кэшировать отдельный thin LV, кэшировать сам пул или строить архитектуру иначе. Практическое правило для продакшена:

  • Если вы не уверены в деталях конкретной версии LVM/ядра и сценарии восстановления, не усложняйте: либо кэшируйте «обычный» LV, либо выносите горячие данные на быстрый storage напрямую.
  • При использовании thin обязательно мониторьте заполнение пула и метаданных, чтобы не получить внезапный стоп по ENOSPC.

Если вам нужен кэш именно для thin, сначала проверьте совместимость и процедуру восстановления на стенде.

Тестирование производительности: fio до и после

Чтобы не гадать, используйте fio. Тестируйте на отдельном тестовом томе или в период, когда вы не рискуете продакшен-данными. Ниже — минимальный набор профилей, который помогает понять картину случайного чтения/записи.

Случайное чтение (типовой бенч для «прогрева» кэша)

fio --name=randread --filename=/mnt/testfile --size=8G --bs=4k --iodepth=32 --rw=randread --direct=1 --numjobs=1 --time_based --runtime=120 --group_reporting

Случайная запись (чувствительна к cachemode)

fio --name=randwrite --filename=/mnt/testfile --size=8G --bs=4k --iodepth=32 --rw=randwrite --direct=1 --numjobs=1 --time_based --runtime=120 --group_reporting

Смешанная нагрузка (похожа на реальные сервисы)

fio --name=randrw --filename=/mnt/testfile --size=8G --bs=4k --iodepth=32 --rw=randrw --rwmixread=70 --direct=1 --numjobs=1 --time_based --runtime=180 --group_reporting

Как интерпретировать:

  • Смотрите не только IOPS/MB/s, но и latency (avg и percentiles). Именно латентность часто определяет «ощущение скорости» у БД/веба.
  • Сравнивайте origin «голый» vs с кэшем, и отдельно writethrough vs writeback (на стенде).

Риски и надёжность: power loss, отказ SSD и «грязные» данные

Главная тема, которую нельзя замалчивать: power loss. В режиме writeback подтверждённые записи могут жить только на SSD-кэше до момента сброса на HDD. Если питание пропадает, а SSD не успел корректно завершить операции, возможны потери данных и повреждение ФС/БД.

Что делать практично:

  • Если нет уверенности в питании — используйте writethrough.
  • Если нужен writeback — обеспечьте UPS и настройте корректное завершение работы ОС.
  • Держите актуальные бэкапы и регулярно проверяйте восстановление.
  • Мониторьте здоровье SSD и износ, чтобы не поймать деградацию кэша внезапно.

Если сервер стоит в облаке, проверьте, как у провайдера устроены питание и аварийные отключения. Когда нужен предсказуемый контроль над дисковой подсистемой и конфигурацией, логично смотреть в сторону VDS с выделенными дисками или NVMe.

FastFox SSL
Надежные SSL-сертификаты
Мы предлагаем широкий спектр SSL-сертификатов от GlobalSign по самым низким ценам. Поможем с покупкой и установкой SSL бесплатно!

Частые ошибки и быстрые проверки

Кэш есть, но ускорения нет

  • Слишком маленький SSD-кэш относительно рабочего набора данных.
  • Нагрузка последовательная и «проливает» данные мимо кэша без повторных обращений.
  • SSD сам по себе медленный или в плохом состоянии (перегрев, троттлинг, износ).

Быстрая проверка: lvs -a -o +data_percent,metadata_percent,cachemode,cachepolicy, затем сравните латентность на дисках через iostat. Если у вас на фронте Nginx, полезно также проверить, не упираетесь ли вы в уровень HTTP-кэша и раздачу контента: см. разбор про кэширование и Range-запросы.

Метаданные кэша забиваются

Если растёт metadata_percent — это тревожный сигнал. Метаданные должны иметь запас. На практике проще выделить metadata с запасом (и использовать качественный SSD), чем героически «лечить» последствия.

Итоги: какую схему выбрать в проде

Если нужно ускорить HDD с помощью SSD/NVMe с минимальными изменениями, LVM cache / dm-cache — один из самых практичных инструментов. Для большинства продакшен-сценариев я бы начинал так:

  • cachepolicy smq — по умолчанию.
  • cachemode writethrough — как безопасный старт.
  • После наблюдений и стендовых тестов fio — при необходимости думать о writeback, но только при нормальной истории с питанием и бэкапами.

Главное преимущество dm-cache — вы можете включить его быстро, померить эффект и так же быстро откатить, не перекраивая весь storage. Это как раз тот случай, когда «быстро и аккуратно» совместимы — если соблюдать дисциплину и помнить о рисках.

Поделиться статьей

Вам будет интересно

systemd-resolved: NXDOMAIN, negative caching, TTL и DNSSEC (SERVFAIL) — диагностика и лечение OpenAI Статья написана AI (GPT 5)

systemd-resolved: NXDOMAIN, negative caching, TTL и DNSSEC (SERVFAIL) — диагностика и лечение

Частая проблема на Linux/VDS: внезапные NXDOMAIN в systemd-resolved, «залипание» из-за negative caching и stale cache, влияние SOA ...
FRR Linux: BGP multihoming, communities и защита от route leak — практический шаблон OpenAI Статья написана AI (GPT 5)

FRR Linux: BGP multihoming, communities и защита от route leak — практический шаблон

Собираем практичную конфигурацию FRR для eBGP multihoming с двумя аплинками: строгий экспорт только своих префиксов, импорт defaul ...
MongoDB на VDS: WiredTiger cache, journaling и quorum в replica set OpenAI Статья написана AI (GPT 5)

MongoDB на VDS: WiredTiger cache, journaling и quorum в replica set

Практика MongoDB в production на VDS: как выбрать WiredTiger cacheSizeGB с запасом для ОС, что даёт journaling и где он упирается ...