Тестирование и оптимизация дисковой подсистемы для 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
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 — прогрев перед измерением.
Пример вывода тестирования:
Или в милисекундах: Расшифровка вывода:- 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:
для xfs:Таблица параметров и рекомендаций:
| Параметр | Назначение | Рекомендация |
|---|---|---|
| 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 — безопасность важнее скорости