Перейти к содержимому

Тестирование и оптимизация дисковой подсистемы для 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 ​

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

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

Заметка

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

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

bash
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

bash
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)

bash
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 — прогрев перед измерением.

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

bash
lat (usec): min=450, max=150000, avg=8520, stdev=2300, ...

Или в милисекундах:

bash
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:

bash
/dev/sdX1  /var/lib/etcd  ext4  defaults,noatime,data=ordered,barrier=1  0  2

для xfs:

bash
/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 — безопасность важнее скорости

Команда Боцман