Почему Proxmox Backup Server тормозил при создании бэкапов: диагностика ZFS, переход с IDE на AHCI и поиск медленного SSD
В этой статье я разберу реальный случай с бюджетным хранилищем бэкапов на Proxmox Backup Server, когда во время создания резервных копий сервер практически упирался в дисковую подсистему.
Симптомы изначально были довольно неприятными: при запуске backup с Proxmox VE на PBS показатель I/O delay мог приближаться к 100%, процесс резервного копирования сильно замедлялся, а сама система начинала реагировать заметно хуже.
При этом загрузка процессора на стороне PVE была небольшой, сеть тоже не выглядела узким местом. Всё указывало именно на хранилище PBS.
В итоге выяснилось, что проблема состояла сразу из нескольких частей:
- SATA-контроллер материнской платы работал в режиме IDE вместо AHCI;
- после переключения AHCI изменились имена Linux-устройств, из-за чего ZFS-пул импортировался DEGRADED;
- один из SSD — SPCC Solid State Disk — оказался значительно медленнее остальных накопителей;
- TRIM улучшил ситуацию, но не устранил проблему SPCC полностью;
- перестановка SSD между SATA-портами окончательно подтвердила, что проблема следует именно за накопителем, а не за портом или кабелем.
Ниже покажу весь путь диагностики.
Исходная конфигурация PBS
Proxmox Backup Server использовал ZFS-пул
home, состоящий из двух mirror vdev:
Код:
home
├── mirror-0
│ ├── Samsung SSD 870 EVO 1TB
│ └── Crucial BX500 1TB
│
└── mirror-1
├── Crucial MX500 1TB
└── SPCC Solid State Disk ~1TB
То есть это не RAID10 в классическом аппаратном понимании, а striped mirrors в ZFS: два зеркала, объединённых в один пул.
Datastore Proxmox Backup Server:
Код:
datastore: opt3
comment
gc-schedule 04:05
notification-mode legacy-sendmail
path /mnt/datastore/home
Сам ZFS-пул был заполнен примерно на 60–65%.
Системный диск PBS — отдельный SSD Smartbuy 240 GB.
Первый симптом: почти 100% I/O delay
Во время резервного копирования в интерфейсе PBS я видел очень высокий I/O delay — временами около 99%.
Сначала нужно было понять, кто именно тормозит: процессор, ZFS в целом или один из физических накопителей.
Для этого я использовал:
Код:
iostat -xz 1
и параллельно:
Код:
zpool iostat -v home 1
iostat показывает задержки непосредственно на уровне Linux block devices, а zpool iostat позволяет посмотреть распределение операций между vdev и отдельными устройствами ZFS.Первоначальные показатели были очень плохими.
На некоторых SSD задержка записи
w_await доходила до сотен миллисекунд:
Код:
w_await ~100–300 ms
%util ~100%
При этом реальная скорость записи могла составлять всего несколько мегабайт в секунду.
Для SSD это явно ненормальная ситуация.
Проверяю режим SATA-контроллера
Следующим шагом я посмотрел, какой драйвер и режим использует SATA-контроллер:
Код:
lspci -nnk | grep -A3 -i 'sata\|ide'
И здесь обнаружилась очень важная деталь.
Контроллер Intel ICH8 работал в режиме IDE:
Код:
00:1f.2 IDE interface Intel ICH8 4 port SATA Controller [IDE mode]
Kernel driver: ata_piix
00:1f.5 IDE interface Intel ICH8R 2 port SATA Controller [IDE mode]
Kernel driver: ata_piix
То есть современные SSD фактически обслуживались через старый IDE/PATA-совместимый режим.
Особенно интересно было то, что два наиболее медленных на тот момент диска находились на одном IDE-канале.
Это стало очень серьёзным подозрением.
Переключаю BIOS с IDE на AHCI
В BIOS я переключил SATA Controller Mode:
Код:
IDE -> AHCI
После загрузки Linux контроллер стал выглядеть уже нормально:
Код:
00:1f.2 SATA controller:
Intel 82801HR/HO/HH (ICH8R/DO/DH)
6 port SATA Controller [AHCI mode]
Kernel driver in use: ahci
Также у устройств появилась нормальная очередь NCQ глубиной 32.
После этой операции скорость резервного копирования выросла сразу в несколько раз.
Это был самый большой прирост производительности за всю диагностику.
После AHCI ZFS стал DEGRADED
Но переключение SATA-контроллера привело к другому эффекту.
Linux изменил порядок обнаружения дисков.
До изменения режима диски имели одни имена:
Код:
/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
После переключения на AHCI порядок поменялся.
В результате ZFS сначала импортировал пул в состоянии DEGRADED:
Код:
pool: home
state: DEGRADED
mirror-0
/dev/sda1 ONLINE
6534832789163013647 UNAVAIL
was /dev/sdc1
Физически накопитель никуда не исчезал.
Просто бывший
/dev/sdc после изменения режима SATA стал другим устройством.Определяю потерянный диск через ZFS label
Я посмотрел ZFS label на диске:
Код:
zdb -l /dev/sdb1
Получил:
Код:
name: 'home'
pool_guid: 16121803238917456497
guid: 6534832789163013647
devid:
ata-CT1000BX500SSD1_2324E6E1BA89-part1
То есть ZFS однозначно показывал, что недостающий участник зеркала — Crucial BX500.
Проверка
/dev/disk/by-id это подтвердила.Перевожу ZFS на стабильные идентификаторы by-id
Использовать
/dev/sda, /dev/sdb и подобные имена для постоянной привязки дисков не очень удобно, потому что они могут поменяться после изменения контроллера, BIOS или порядка обнаружения устройств.Поэтому я решил экспортировать пул и заново импортировать его через
/dev/disk/by-id.Сначала перевёл datastore PBS в offline maintenance:
Код:
proxmox-backup-manager datastore update opt3 --maintenance-mode offline
Проверил, кто использует mountpoint:
Код:
fuser -vm /mnt/datastore/home
После этого:
Код:
zpool export home
Посмотрел доступные пулы:
Код:
zpool import -d /dev/disk/by-id
И импортировал:
Код:
zpool import -d /dev/disk/by-id home
После этого:
Код:
zpool status -P home
уже показывал диски через постоянные WWN:
Код:
mirror-0
/dev/disk/by-id/wwn-0x5002538f53102949-part1
/dev/disk/by-id/wwn-0x500a0751e6e1ba89-part1
mirror-1
/dev/disk/by-id/wwn-0x500a0751e6d89463-part1
/dev/disk/by-id/wwn-0x5000000000002ddc-part1
После этого maintenance mode можно было убрать:
Код:
proxmox-backup-manager datastore update opt3 --delete maintenance-mode
Пул снова стал:
Код:
state: ONLINE
Проверяю целостность ZFS с помощью scrub
На BX500 ранее появился один исправленный ZFS checksum error.
Это ещё не означало неисправность самого SSD: ошибка была исправлена зеркалом, а данные приложений не пострадали.
Я сбросил старые счётчики:
Код:
zpool clear home
и запустил полный scrub:
Код:
zpool scrub home
За процессом следил так:
Код:
watch -n 5 zpool status home
Scrub завершился примерно за два часа:
Код:
scan: scrub repaired 0B in 02:11:29 with 0 errors
READ WRITE CKSUM
0 0 0
errors: No known data errors
То есть ZFS полностью прочитал пул и не обнаружил повреждённых данных.
После этого оснований считать BX500 неисправным уже не было.
Повторный тест после AHCI
После перехода на AHCI картина изменилась кардинально.
Samsung, BX500 и MX500 стали показывать задержку записи приблизительно:
Код:
w_await ~0.5–1 ms
Но один накопитель продолжал заметно выделяться — SPCC Solid State Disk.
В некоторых интервалах:
Код:
SPCC:
w_await ~18–21 ms
%util ~95–100%
speed ~10–15 MB/s
На фоне остальных SSD это выглядело очень плохо.
Проверяю TRIM
На пуле было:
Код:
autotrim=off
Поэтому я решил выполнить полный ручной TRIM свободного пространства:
Код:
zpool trim -r 10M home
Проверить прогресс можно командой:
Код:
zpool status -t home
В моём случае TRIM занял несколько часов.
После завершения:
Код:
Samsung 100% trimmed
BX500 100% trimmed
MX500 100% trimmed
SPCC 100% trimmed
Ошибок ZFS при этом не было:
Код:
errors: No known data errors
Что изменилось после TRIM
На коротком тесте результат выглядел очень хорошо.
У SPCC задержка местами снизилась примерно с:
Код:
18–21 ms
до:
Код:
1.5–5 ms
А ZFS в отдельных burst-интервалах уже записывал более:
Код:
100 MB/s
На первый взгляд могло показаться, что проблема решена.
Но короткого теста оказалось недостаточно.
Делаю длинный iostat
Я запустил более продолжительное наблюдение во время реального backup:
Код:
iostat -xz 1 300
И здесь SPCC снова проявил себя.
Во время реальной продолжительной нагрузки его задержки регулярно находились в районе:
Код:
w_await 10–50 ms
а в отдельных интервалах доходили примерно до:
Код:
127 ms
185 ms
230 ms
При этом скорость иногда составляла всего:
Код:
1–3 MB/s
а
%util уже находился около 100%.Для сравнения Samsung 870 EVO и Crucial MX500 в тех же условиях обычно работали примерно с:
Код:
w_await ~0.5–1 ms
BX500 иногда проседал до нескольких миллисекунд, но его показатели всё равно были несопоставимо лучше SPCC.
То есть после длительного теста стало понятно: TRIM действительно дал некоторый эффект, но физическую проблему производительности SPCC он не устранил.
Проверяю SMART SPCC
Следующим шагом:
Код:
smartctl -x /dev/sde
На тот момент SPCC находился именно как
/dev/sde.SMART выглядел довольно чисто:
Код:
SMART overall-health self-assessment test result: PASSED
Reallocated_Sector_Ct 0
Reported_Uncorrect 0
Current_Pending_Sector 0
Reallocated_Event_Count 0
UDMA_CRC_Error_Count 0
SMART Extended Error Log:
No Errors Logged
Температура:
Код:
40 C
Наработка:
Код:
Power_On_Hours = 9680
Важный момент — SATA CRC errors отсутствовали:
Код:
UDMA_CRC_Error_Count = 0
В SATA Phy Event Counters также не было:
Код:
ICRC errors = 0
R_ERR = 0
CRC errors = 0
То есть явных признаков плохого SATA-кабеля не было.
Проверяю dmesg
Я дополнительно посмотрел ошибки SATA:
Код:
dmesg -T | egrep -i 'sde|ata|error|failed|reset|link'
SPCC нормально поднялся на SATA 3 Gbit/s:
Код:
ata7: SATA link up 3.0 Gbps
ata7.00: SPCC Solid State Disk
NCQ depth 32
При этом в журнале не было характерных сообщений:
Код:
hard resetting link
failed command
exception Emask
I/O error sde
CRC error
Обнаруженные
I/O error относились к fd0, то есть floppy device, и к SSD отношения не имели.Почему только 3 Gbit/s, если SSD поддерживает SATA 6 Gbit/s
SMART показывал:
Код:
SATA Version is: SATA 3.2, 6.0 Gb/s
current: 3.0 Gb/s
Это нормально для используемого контроллера Intel ICH8.
Он ограничивает линк SATA скоростью 3 Gbit/s.
Но в моём случае это вообще не являлось причиной проблемы.
Даже SATA 3 Gbit/s позволяет передавать сотни мегабайт в секунду, а SPCC начинал упираться в 100% util уже на нескольких мегабайтах в секунду.
То есть ограничение было внутри самого SSD, а не в пропускной способности SATA.
Финальная проверка: переставляю SSD между SATA-портами
Чтобы окончательно исключить SATA-порт, я физически переставил накопители между разъёмами материнской платы.
После перезагрузки Linux присвоил им такие имена:
Код:
sda Samsung SSD 870 EVO 1TB
sdb CT1000MX500SSD1
sdc SSD Smartbuy 240GB
sdd SPCC Solid State Disk
sde CT1000BX500SSD1
То есть SPCC, который раньше был
sde, после перестановки стал:
Код:
/dev/sdd
А BX500 занял его прежнее место и стал:
Код:
/dev/sde
Это оказался самый важный эксперимент.
Проблема переехала вместе с SPCC
Я снова запустил backup и:
Код:
iostat -xz 1
Теперь уже
sdd, то есть SPCC, показывал:
Код:
w_await = 25.80 ms
aqu-sz = 2.53
%util = 126.3%
В ту же секунду BX500, который теперь находился на бывшем месте SPCC как
sde, показывал:
Код:
w_await = 0.11 ms
%util = 0.6%
В другом интервале:
Код:
Samsung:
w_await = 0.94 ms
MX500:
w_await = 0.78 ms
SPCC:
w_await = 5.84 ms
BX500:
w_await = 1.03 ms
То есть медленный накопитель физически переехал на другой SATA-порт — и проблема переехала вместе с ним.
ZFS подтверждает это по WWN
Особенно полезно то, что ZFS идентифицирует диски не по меняющимся именам
sda/sdb/sdd, а по WWN.Для SPCC:
Код:
wwn-0x5000000000002ddc
После перестановки портов в
zpool iostat именно этот WWN снова отставал.Например, в один из интервалов:
Код:
MX500:
~17.4 MB/s
SPCC:
~1.08 MB/s
Это уже практически исключает влияние конкретного SATA-порта.
Итоговая привязка накопителей
После финальной перестановки:
Код:
sda = Samsung SSD 870 EVO 1TB
S6P5NL0W110532A
sdb = Crucial MX500 1TB
2320E6D89463
sdc = Smartbuy 240GB
системный диск PBS
sdd = SPCC Solid State Disk
30081054979
WWN 0x5000000000002ddc
sde = Crucial BX500 1TB
2324E6E1BA89
Что оказалось причиной
В моём случае было две основные проблемы.
Первая и самая серьёзная — SATA-контроллер Intel работал в IDE mode.
После переключения на AHCI производительность дисковой подсистемы выросла в несколько раз.
Вторая проблема проявилась уже после исправления режима контроллера: один из четырёх SSD, SPCC Solid State Disk, оказался значительно медленнее остальных под продолжительной записью.
При этом:
Код:
SMART = PASSED
CRC errors = 0
ZFS scrub = 0 errors
SATA reset = отсутствуют
кабель = явных ошибок нет
порт = исключён перестановкой дисков
То есть SSD не обязательно "мёртвый" в классическом понимании.
Он читает данные, SMART считается исправным и ошибок носителя нет.
Но его внутренняя производительность под длительной записью крайне нестабильна.
Вероятнее всего, узкое место находится внутри самого накопителя:
Код:
NAND / SSD controller / FTL / garbage collection
Для backup-хранилища такой SSD становится bottleneck всего mirror vdev.
Почему один медленный SSD влияет на ZFS mirror
При записи в mirror данные должны попасть на оба накопителя зеркала.
Если один диск стабильно выполняет операции за:
Код:
~1 ms
а второй периодически за:
Код:
20–200 ms
быстрый SSD не может полностью компенсировать медленный.
В результате появляются очереди, растёт I/O wait, а производительность всего vdev начинает зависеть от более медленного участника зеркала.
У меня это хорошо коррелировало с загрузкой CPU:
когда SPCC уходил к 100% util и большой
w_await, системный %iowait поднимался примерно до:
Код:
20–25%
Что в итоге я решил делать
SPCC стал первым кандидатом на замену.
Для PBS и ZFS я бы предпочёл более предсказуемый TLC SSD с нормальным контроллером и хорошей устойчивой производительностью.
Из имеющихся у меня накопителей Samsung 870 EVO и Crucial MX500 показали себя значительно лучше.
BX500 также оказался заметно стабильнее SPCC, несмотря на то что сам относится к бюджетной линейке.
В идеале для серьёзного backup-хранилища я бы рассматривал enterprise/datacenter SSD с power-loss protection, но даже качественный consumer TLC SSD в данном случае будет огромным шагом вперёд по сравнению с проблемным SPCC.
Команды, которые оказались наиболее полезными
Проверка задержек физических дисков:
Код:
iostat -xz 1
Длительный тест:
Код:
iostat -xz 1 300
Статистика ZFS:
Код:
zpool iostat -v home 1
Статус пула:
Код:
zpool status -P home
Проверка SATA-контроллера:
Код:
lspci -nnk | grep -A3 -i 'sata\|ide'
Информация о дисках:
Код:
lsblk -d -o NAME,MODEL,SERIAL
Полный SMART:
Код:
smartctl -x /dev/sdX
Ошибки SATA:
Код:
dmesg -T | egrep -i 'sd[a-z]|ata|error|failed|reset|link'
Проверка ZFS label:
Код:
zdb -l /dev/sdX1
Scrub:
Код:
zpool scrub home
watch -n 5 zpool status home
Ручной TRIM:
Код:
zpool trim -r 10M home
zpool status -t home
Несколько важных замечаний по оптимизации PBS + ZFS
В процессе диагностики я сознательно не стал применять несколько популярных "ускорителей".
Не отключал sync:
Код:
zfs set sync=disabled ...
Да, это способно увеличить показатели записи, но ценой гарантий сохранности синхронно записанных данных при аварийном отключении питания или сбое.
Для backup-сервера такой компромисс мне не нравится.
Не отключал atime на datastore PBS.
Proxmox Backup Server использует время доступа к chunk-файлам при Garbage Collection, поэтому бездумно делать:
Код:
zfs set atime=off ...
для PBS datastore не стоит.
Не использовал zpool upgrade ради производительности.
Сообщение:
Код:
Some supported and requested features are not enabled on the pool
само по себе не означает, что пул медленный.
zpool upgrade включает новые feature flags и может повлиять на совместимость пула со старыми версиями ZFS, но не является способом лечения высокой latency SSD.Не стал сразу ставить SLOG.
SLOG помогает только определённому классу синхронных записей и не исправит SSD, который сам выполняет обычную запись с задержкой 50–200 ms.
Сначала всегда стоит найти физическое узкое место.
Что я вынес из этой диагностики
Главный вывод — не стоит начинать оптимизацию ZFS с десятков sysctl, параметров ARC и опасных переключателей вроде
sync=disabled.Сначала нужно проверить самый нижний уровень:
Код:
контроллер
↓
режим AHCI
↓
SATA link
↓
физические SSD
↓
latency каждого диска
↓
vdev
↓
ZFS
↓
PBS
В моём случае один взгляд на среднюю скорость не дал бы правильного ответа.
Именно
w_await, aqu-sz, %util и сопоставление их с конкретными WWN позволили увидеть реальную проблему.Особенно полезным оказался простой физический эксперимент: поменять два SSD местами.
Если проблема остаётся на порту — нужно искать контроллер, кабель или разъём.
Если проблема переезжает вместе с накопителем — виновник практически найден.
В моём случае произошло именно второе.
Результат
После перехода:
Код:
IDE -> AHCI
производительность PBS выросла в несколько раз.
После полного ZFS scrub я убедился, что данные пула целы.
TRIM временно улучшил показатели отдельных SSD и показал, что состояние свободных NAND-блоков тоже влияло на производительность, однако длительный тест обнаружил оставшуюся проблему.
Финальная перестановка SATA-портов подтвердила:
Код:
SPCC Solid State Disk
Serial: 30081054979
WWN: 0x5000000000002ddc
является главным дисковым bottleneck моего ZFS-пула.
Следующий шаг — заменить этот SSD и после resilver повторить тот же длительный тест
iostat, чтобы сравнить производительность до и после замены.