Зачем нужен 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.

Перед стартом: когда 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.
Подготовка: 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 часто не оставляют «второго шанса».

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 с кэшем, и отдельно
writethroughvswriteback(на стенде).
Риски и надёжность: power loss, отказ SSD и «грязные» данные
Главная тема, которую нельзя замалчивать: power loss. В режиме writeback подтверждённые записи могут жить только на SSD-кэше до момента сброса на HDD. Если питание пропадает, а SSD не успел корректно завершить операции, возможны потери данных и повреждение ФС/БД.
Что делать практично:
- Если нет уверенности в питании — используйте
writethrough. - Если нужен
writeback— обеспечьте UPS и настройте корректное завершение работы ОС. - Держите актуальные бэкапы и регулярно проверяйте восстановление.
- Мониторьте здоровье SSD и износ, чтобы не поймать деградацию кэша внезапно.
Если сервер стоит в облаке, проверьте, как у провайдера устроены питание и аварийные отключения. Когда нужен предсказуемый контроль над дисковой подсистемой и конфигурацией, логично смотреть в сторону VDS с выделенными дисками или NVMe.
Частые ошибки и быстрые проверки
Кэш есть, но ускорения нет
- Слишком маленький 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. Это как раз тот случай, когда «быстро и аккуратно» совместимы — если соблюдать дисциплину и помнить о рисках.


