Перейти к содержанию

Тестирование и оптимизация дисковой подсистемы для ETCD

ETCD в Боцман

ETCD — это высоконадёжное распределённое хранилище "ключ-значение", разработанное для хранения конфигурации, состояния и метаданных в распределённых системах. Оно использует алгоритм консенсуса Raft для обеспечения сильной согласованности данных между узлами кластера, что делает ETCD особенно устойчивым к сбоям и гарантирующим целостность информации даже при выходе из строя отдельных узлов.

ETCD хранит состояние всего кластера в Kubernetes: от конфигурации подов и сервисов до сетевых политик и секретов. Благодаря поддержке операций с низкой задержкой, механизма watch (отслеживания изменений в реальном времени) и API с поддержкой TLS, ETCD является критически важным компонентом, от стабильности которого зависит работоспособность всей платформы.

Заметка

По умолчанию, в платформе “Боцман” ETCD расположен на узлах управления.

Для использования внешнего ETCD воспользуйтесь руководством.

Внимание!

Для корректной работы ETCD крайне важно обеспечить низкую задержку записи (latency), стабильную и высокую производительность. Поэтому, перед использованием внешнего ETCD рекомендуется протестировать используемую дисковую подсистему.

Утилиты для тестирования дисковой подсистемы

Для проведения тестирования необходимо создать нагрузки, близкие к поведению ETCD:

  • синхронные операции;
  • последовательные и случайные записи с fsync.

Мы рекомендуем использовать Fio (Flexible I/O Tester) - утилита, позволяющая имитировать поведение ETCD и измерить задержку (latency), IOPS, пропускную способность.

Установка Fio

Выполните команду установки:

apt install fio 

Выполните команду установки:

dnf install fio 

Тестирование дисковой подсистемы

Способы тестирования

Заметка

Запускать тесты следует на том же диске, где будет работать ETCD.

Тест № 1 - случайные записи 4 КБ с fsync

fio \
  --name=etcd-write-latency \
  --filename=/path/to/testfile \
  --size=1G \
  --bs=4k \
  --direct=1 \
  --sync=1 \
  --rw=randwrite \
  --ioengine=sync \
  --iodepth=1 \
  --runtime=60 \
  --time_based \
  --ramp_time=10 \
  --group_reporting

Тест № 2 - последовательные записи с fsync

fio \
  --name=etcd-seq-write \
  --filename=/path/to/testfile \
  --size=1G \
  --bs=4k \
  --direct=1 \
  --sync=1 \
  --rw=write \
  --ioengine=sync \
  --iodepth=1 \
  --runtime=60 \
  --time_based \
  --ramp_time=10 \
  --group_reporting

Тест № 3 - использование libaio с очередью (для NVMe/SSD)

fio \
  --name=etcd-aio \
  --filename=/path/to/testfile \
  --size=1G \
  --bs=4k \
  --direct=1 \
  --rw=randwrite \
  --ioengine=libaio \
  --iodepth=1 \
  --sync=1 \
  --runtime=60 \
  --time_based \
  --ramp_time=10 \
  --group_reporting

Общие параметры:

  • bs=4k — размер блока (типичный для etcd);
  • direct=1 — обход кэша ОС, тест реального диска;
  • sync=1 — каждая запись сопровождается fsync (как etcd);
  • ioengine=sync — использовать синхронный I/O;
  • iodepth=1 — одна операция в очереди (имитирует последовательные fsync);
  • ramp_time=10 — прогрев перед измерением.

Пример вывода тестирования:

lat (usec): min=450, max=150000, avg=8520, stdev=2300, ...
Или в милисекундах:
lat (msec): min=1, max=150, avg=8.5, stdev=2.3, ... 
Расшифровка вывода:

  • min — минимальная задержка операции ввода-вывода;
  • max — максимальная задержка операции ввода-вывода;
  • avg — средняя задержка операции ввода-вывода;
  • stdev — стандартное отклонение.

Fio разделяет задержку на:

  • slat (submission latency) - время от выдачи I/O до передачи драйверу;
  • clat (completion latency) — время выполнения операции на диске (включая очередь);

lat = slat + clat - общая задержка.

Параметр Описание Важность для ETCD
lat avg Общая задержка I/O Важно
clat avg Задержка завершения (на диске) Критически важно
slat avg Задержка отправки запроса Менее важно
max/avg Пики и среднее значение Контроль пикового значения

Заметка

Для ETCD важны clat и lat, особенно при iodepth=1, где lat ≈ clat.

clat avg — реальное время ожидания на диске (самый релеватный показатель для ETCD)

Успешный результат тестирования

  • Средняя задержка < 10 мс;
  • Максимальная задержка < 100 мс;
  • Стабильная производительность, нет скачков в пике.

Внимание!

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

Интересующие метрики и целевые значения

Метрика Целевое значение Комментарий
Средняя задержка записи (latency) <10 мс ETCD чувствителен к задержкам, при задержке больше 10мс возможны таймауты
Максимальная задержка (max latency) <100 мс Пиковые значения не олжны превышать 100 мс
IOPS (4K randwrite + fsync) > 1000 IOPS Минимум для стабильной работы ETCD
Стабильность задержки (низкий jitter) Нет скачков Важно для предсказуемости
Пропускная способность Не критично ETCD не требует высокой пропускной способности

Рекомендации и настройки для улучшения производительности дисковой подсистемы

Официальные рекомендации от Kubernetes и ETCD для дисковой подсистемы

  • Использование выделенных SSD/NVMe дисков;
  • Не размещать ETCD на системном диске;
  • Избегать использование сетевых дисков (NFS, EBS с высокой латентностью)

Дополнительные рекомендации

Общие настройки

  • Отключите кэширование записи на диске (write cache), если нет ИБП/батареи;
  • Используйте ext4 или xfs с опцией data=ordered;
  • Настройте noatime в mount options;
  • Используйте выделенный диск для ETCD (не делить с ОС, журналами);
  • Отключите крон на диске с ETCD (тяжёлые резервные копии и т.п);
  • Проверьте iostat -x 1 — параметры await, util% не должны быть высокими;
  • Используйте ionice для фоновых задач, чтобы не мешать ETCD.

Настройки fstab

Чтобы улучшить производительность и снизить задержки для раздела, используемого ETCD (или другой чувствительной к I/O системы), можно оптимизировать параметры монтирования в файле /etc/fstab.

Рекомендуемые параметры mount, которые помогут снизить задержки и повысить предсказуемость работы диска:

для ext4:

/dev/sdX1  /var/lib/etcd  ext4  defaults,noatime,data=ordered,barrier=1  0  2
для xfs:
/dev/sdX1  /var/lib/etcd  xfs   defaults,noatime,logbufs=8,logbsize=256k  0  2

Таблица параметров и рекомендаций:

Параметр Назначение Рекомендация
noatime Отключает обновление времени последнего достуа к файлу (atime) => Снижает количество записи на диск Обязательно
nodiratime Аналогично noatime, но только для директорий Обычно, включено с noatime
relatime Улучшенный atime: обновляется только если mtime или ctime изменились. Менее эффективен, чем noatime Альтернатива, если noatime не подходит
data=ordered` (для ext4) Гарантирует, что данные записываются до метаданных Рекомендуется. Хороший баланс между производительностью и безопасностью
data=writeback Быстрее, но менее безопасно (риск повреждения данных при сбое) Не рекомендуется для ETCD
barrier=1 Включает write barriers — гарантирует порядок записи при сбое Критичен для ETCD. Оставить включеным, если нет ИБП/Батареи на контроллере
barrier=0 Отключает barriers Может привести к повреждению WAL. Не использовать без резерврного питания
nobarrier Аналогично barrier=0 Избегать
errors=remount-ro При ошибках ФС переключается в read-only Рекомендуется. Полезно для обнаружения проблем

Для XFS:

Параметр Назначение
logbufs=8 Увеличивает количество буферов журнала
logbsize=256 Увеличивает размер блока журнала
nobootwait Не ждать диск при загрузке (если диск не критичен для старта)

Эти параметры позволяют:

  • Сократить количество неиформативных записей (noatime);
  • Улучшить предсказуемость задержек;
  • Обеспечить целостность WAL при сбоях (barrier=1);
  • Уменьшить нагрузку на диск.

Не рекомендуется:

❌ async — возможна потеря данных;
❌ relatime,wtime=... — сложные политики кэширования;
❌ barrier=0 или nobarrier — риск повреждения WAL при сбое;
❌ journal_async_commit — может снизить задержку, но увеличивает риск при сбое;
❌ commit=100 (или больше) — увеличивает размер окна потери данных.

Внимание

Etcd делает fsync после каждой записи в WAL — безопасность важнее скорости