Что нового

Proxmox Backup Server: высокий I/O delay в ZFS

Почему 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-портами окончательно подтвердила, что проблема следует именно за накопителем, а не за портом или кабелем.

Ниже покажу весь путь диагностики.

1786610739044.png


Исходная конфигурация 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, чтобы сравнить производительность до и после замены.
Об авторе
Guru
Василий, cистемный админ /gnu/linux/windows/macos/mikrotik/troubleshooter, создатель сайта
Интересуюсь всем что делает инфраструктуру быстрой и надёжной
Открыт к общению и проектам, написать мне можно через форму или в личном сообщении

❗ Если есть пожелания по обзору какого-либо вопроса не представленного на сайте - пиши в комментариях

Комментарии

Нет комментариев для отображения.

Информация о статье

Автор
Guru
Время чтения статьи
10 мин чтения
Просмотры
18
Посл. обновление

Ещё в Proxmox Backup

Ещё от Guru

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

Назад
Верх