Зачем вообще говорить про I/O у LVM snapshot
LVM snapshot часто воспринимают как «магическую кнопку» для моментального бэкапа: сделал lvcreate -s, получил фиксированное состояние, дальше читаешь данные со snapshot и выгружаешь их куда угодно. На практике у этой магии есть цена: снимок почти всегда увеличивает нагрузку на подсистему хранения и способен заметно поднять I/O latency как для самого snapshot, так и для исходного логического тома (origin).
Ниже — причины деградации, типовые ошибки (особенно snapshot overflow) и рабочие приёмы, которые помогают использовать LVM snapshot для backup без неожиданных просадок в проде.
Как работает классический LVM snapshot и где появляется лишний I/O
Классический snapshot (не thin) основан на механизме copy-on-write (COW). Снимок создаётся как отдельный LV, которому выделяется место (например, 10–50 ГБ). В этот LV LVM будет складывать «старые версии» блоков, которые меняются на origin после момента создания snapshot.
Ключевой момент: при первом изменении блока на origin LVM должен выполнить дополнительные операции.
- прочитать исходное содержимое блока (старую версию);
- записать старую версию в COW-область snapshot;
- записать новый блок на origin.
То есть один «обычный» write на origin превращается в дополнительное чтение и дополнительную запись. На уровне диска это выражается в росте очередей и задержек, особенно если workload и так упирается в IOPS/latency (БД, очереди, высоконагруженные веб-проекты).
Кроме COW-данных, snapshot ведёт метаданные (карты соответствий блоков). Их обновление — тоже I/O, и на медленном или перегруженном хранилище оно становится заметным.
Почему чтение со snapshot тоже может тормозить
Если блок на origin не менялся после создания snapshot — чтение со snapshot пойдёт в origin. Если менялся — чтение пойдёт в COW-область snapshot. В итоге чтение snapshot часто становится менее «локальным»: больше случайных обращений, выше количество операций и задержки.

Thin pool и thin snapshot: что меняется
LVM thin provisioning (thin pool) даёт другой профиль поведения. Thin snapshot создаётся быстро и не требует заранее фиксировать большой размер COW-области: место берётся из пула по мере необходимости. Это удобно, но добавляет свои риски и требования к мониторингу.
С точки зрения I/O:
- thin snapshot тоже использует copy-on-write, поэтому дополнительный I/O при записи на origin никуда не исчезает;
- появляется зависимость от состояния метаданных thin pool и их свободного места;
- при нехватке места данных или метаданных pool может перейти в режим, где запись блокируется или файловая система начинает получать ошибки (в зависимости от настроек).
То есть thin snapshot — это не «снимок без цены», а «снимок с другой моделью управления местом». В продакшене thin pool часто хорош, но только при дисциплине: следить за data_percent и metadata_percent, понимать, что будет при заполнении, и иметь план действий.
Snapshot overflow: что это и почему это главный источник аварий
Snapshot overflow — ситуация, когда выделенная под snapshot COW-область заполняется. Для классического snapshot это обычно означает, что снимок становится непригодным (invalid), а бэкап, который с него читает, либо падает, либо получает неконсистентный набор данных.
Для thin pool аналогичная проблема — переполнение пула данных или метаданных. Это опаснее: может пострадать не только snapshot, но и работа origin (вплоть до блокировки записи).
Snapshot — не «хранилище бэкапов», а временный буфер. Чем дольше он живёт и чем больше writes на origin, тем выше риск overflow и тем сильнее давление на I/O.
Как прикинуть размер snapshot для классического LVM
Размер зависит не от размера origin, а от объёма изменений за время жизни snapshot. Практическая оценка:
- оцените типичный объём записей на том (по метрикам диска, БД, логам);
- умножьте на длительность бэкапа (плюс небольшой запас времени);
- добавьте запас 30–100% на пики и «грязные» периоды.
Если snapshot нужен на 10–15 минут, а том стабильно пишет 20–30 МБ/с, COW-область может вырасти на десятки гигабайт. Это нормальная реальность для журналируемых ФС и баз данных.
Как сделать backup консистентным: fsfreeze, xfs_freeze и «окно» заморозки
Snapshot фиксирует блочное состояние, но не гарантирует, что данные приложения «внутри» файловой системы находятся в согласованном состоянии. Для файловых систем консистентность обычно достигается очень короткой заморозкой ФС на запись.
Универсальный инструмент — fsfreeze. Для XFS также используется xfs_freeze (в современных системах часто достаточно fsfreeze, но оба варианта встречаются).
Правильная схема: заморозить ФС на секунды, создать snapshot, сразу разморозить, а чтение для бэкапа делать со snapshot без остановки сервиса.
Пример: ext4 + классический snapshot
mount | grep ' /data '
fsfreeze -f /data
lvcreate -s -n data_snap -L 20G /dev/vg0/data
fsfreeze -u /data
Дальше snapshot монтируется read-only и бэкапится любым привычным способом.
Пример: XFS (xfs_freeze)
xfs_freeze -f /data
lvcreate -s -n data_snap -L 20G /dev/vg0/data
xfs_freeze -u /data
Окно заморозки держите минимальным: любые действия, не нужные для создания snapshot, делайте после -u.
Если делаете бэкапы баз данных, полезно комбинировать snapshot с нативной стратегией восстановления (WAL/binlog/PITR). См. практику по PostgreSQL: PITR и бэкап WAL в PostgreSQL.
Почему I/O latency растёт: типовые причины
1) COW умножает операции при записи
При активной записи на origin появляется дополнительный read+write, и это увеличивает среднюю и хвостовую задержку (p95/p99). На NVMe эффект может быть терпимым, на SATA SSD и сетевых хранилищах — критичным.
2) Snapshot живёт слишком долго
Чем дольше snapshot существует, тем больше изменённых блоков нужно отслеживать и хранить. Это увеличивает вероятность overflow и ухудшает локальность чтений при бэкапе. Snapshot «на часы, на всякий случай» — почти всегда анти-паттерн.
3) Неправильный размер snapshot или thin pool
Слишком маленький snapshot приводит к overflow. Слишком большой не лечит I/O, но съедает место и может усилить конкуренцию за ресурсы. Для thin pool критично помнить: «место» — это и данные, и метаданные.
4) Бэкап читает слишком агрессивно
Чтение со snapshot конкурирует с рабочими I/O. Если бэкап запускать без ограничений, он легко забьёт очередь диска и поднимет latency для прод-трафика — особенно когда бэкап делает последовательное чтение больших объёмов, а прод — случайные записи.
5) Файловая система и workload
И ext4, и XFS подходят для snapshot-сценариев, но нагрузка ощущается по-разному из-за журналирования и распределения блоков. Важнее не «какая ФС лучше», а какой у вас паттерн записи (БД, логи, кеши) и насколько быстро вы успеваете сделать backup и удалить snapshot.
Практика: как минимизировать влияние snapshot на прод
Делайте snapshot на минимальное время
Идеальный цикл: freeze → lvcreate -s → unfreeze → mount snapshot ro → backup → umount → удаление snapshot. Чем меньше живёт snapshot, тем меньше COW-операций накопится и тем ниже риск overflow.
Ограничьте скорость бэкапа
Самый простой способ снизить I/O latency — не пытаться выжать максимум скорости чтения. Ограничение можно делать на уровне инструмента бэкапа или на уровне ОС (приоритизация I/O). Смысл один: прод важнее бэкапа, бэкап должен быть «вежливым» к диску.
Следите за заполнением snapshot во время backup
Для классических snapshot регулярно проверяйте процент использования.
lvs -a -o+seg_monitor,devices,lv_size,data_percent,metadata_percent,lv_attr
Если data_percent быстро растёт — snapshot маловат, origin слишком активно пишется или бэкап слишком долгий. Это повод пересматривать процесс, а не просто «добавить гигабайт».
Для thin pool мониторьте и данные, и метаданные
У thin pool «кончается место» в двух плоскостях. Следите за обоими показателями и не доводите до края.
lvs -a -o+pool_lv,data_percent,metadata_percent,lv_size,lv_attr
Не тащите в snapshot-бэкап «шумные» данные
Если на томе лежат кеши, временные файлы и прочие легко восстанавливаемые данные, их лучше вынести на отдельный LV/диск или исключить из бэкапа на уровне приложения. Любая лишняя запись на origin во время жизни snapshot увеличивает COW и нагрузку на диск.
Если бэкап уезжает на удалённое хранилище, пригодится статья про практику надёжных S3-бэкапов: S3 backups: restic и borg на практике.

Диагностика: как понять, что проблема именно в snapshot
Типичный симптом: после создания snapshot растут задержки диска и время ответа приложения, а после удаления snapshot всё возвращается в норму. Чтобы не гадать, соберите подтверждения.
Что смотреть:
- рост I/O latency и очередей на устройстве по системным метрикам;
- время транзакций БД, частоту и длительность fsync/flush;
- процент заполнения snapshot или thin pool (
data_percent/metadata_percent); - корреляцию по времени: «создали snapshot» → «поплохело».
Хорошая привычка: помечать события «snapshot created/deleted» в системе мониторинга, чтобы разбор инцидентов занимал минуты, а не часы.
Чек-лист «безопасный LVM snapshot для backup»
Перед стартом убедитесь, что в VG достаточно места под snapshot (или что в thin pool достаточно данных и метаданных).
Минимизируйте окно заморозки: используйте
fsfreezeилиxfs_freezeтолько вокругlvcreate -s.Держите snapshot живым как можно меньше времени.
Ограничьте агрессивность чтения во время backup, чтобы не поднять latency прод-сервисов.
Мониторьте
data_percent/metadata_percentи реагируйте заранее, не «по факту overflow».После бэкапа сразу удаляйте snapshot.
Частые вопросы
Snapshot — это бэкап?
Нет. Snapshot — механизм фиксации состояния на уровне блоков, удобный как промежуточный шаг для бэкапа. Сам snapshot обычно лежит на том же хранилище и не защищает от аппаратных проблем, ошибок оператора или логических повреждений.
Что лучше для бэкапа: classic snapshot или thin snapshot?
Если у вас уже есть thin pool и вы готовы его мониторить — thin snapshot удобнее по управлению размером. Если thin pool нет, classic snapshot проще концептуально, но требует аккуратно выбирать размер и жить с фиксированным лимитом. В обоих случаях влияние на I/O остаётся и зависит от паттерна записей.
Почему после snapshot БД начинает «тупить», хотя бэкап ещё не начался?
Потому что COW начинает работать сразу после создания snapshot: любая запись на origin становится дороже. Если БД активно пишет (WAL/redo/binlog/журналы), рост latency может быть мгновенным.
Итоги
LVM snapshot — полезный инструмент для «горячего» backup, но он почти неизбежно добавляет нагрузку на диск: растёт число операций и, как следствие, I/O latency. Критически важны три вещи: короткая жизнь snapshot, правильная заморозка ФС (fsfreeze/xfs_freeze) и контроль заполнения (чтобы не получить snapshot overflow). Если эти правила соблюдены, снимки становятся предсказуемым и безопасным элементом бэкап-цепочки.
Если вы планируете переносить такие процессы на отдельную виртуальную машину и изолировать дисковые нагрузки от веб-части, практичнее делать это на VDS, чтобы управлять дисками, планировщиком и мониторингом под свои задачи.


