Производительность
Понимание производительности
etcd обеспечивает стабильную и устойчиво высокую производительность. Её определяют два фактора: задержка и пропускная способность. Задержка — время выполнения одной операции. Пропускная способность — общее число операций, завершённых за определённый период. Обычно средняя задержка растёт вместе с общей пропускной способностью, когда etcd принимает параллельные клиентские запросы. В типичной облачной среде, например на стандартной машине n-4 в Google Compute Engine (GCE) или сопоставимой машине AWS, кластер etcd из трёх участников при небольшой нагрузке завершает запрос менее чем за одну миллисекунду, а при высокой выполняет более 30,000 запросов в секунду.
Для репликации запросов между участниками и достижения соглашения etcd использует алгоритм консенсуса Raft. Производительность консенсуса, особенно задержку фиксации, ограничивают два физических фактора: задержка сетевого и дискового ввода-вывода. Минимальное время выполнения запроса etcd равно времени кругового обхода сети (RTT) между участниками плюс время, необходимое fdatasync для фиксации данных в постоянном хранилище. RTT внутри центра обработки данных может достигать нескольких сотен микросекунд. Типичный RTT в пределах США составляет около 50ms, а между континентами может доходить до 400ms. Типичная задержка fdatasync для вращающегося диска — около 10ms, а для SSD часто меньше 1ms. Чтобы увеличить пропускную способность, etcd объединяет несколько запросов в пакет и передаёт его Raft. Такая политика позволяет сохранять высокую пропускную способность под большой нагрузкой.
На общую производительность etcd влияют и другие подсистемы. Каждый сериализованный запрос etcd проходит через механизм хранения MVCC на основе boltdb, что обычно занимает десятки микросекунд. Периодически etcd создаёт инкрементный снимок недавно применённых запросов и объединяет его с предыдущим снимком на диске. Это может вызвать скачок задержки. На SSD проблема обычно незаметна, но на HDD наблюдаемая задержка может удвоиться. Выполняющаяся компактизация также влияет на производительность etcd. Обычно её влияние незначительно, поскольку компактизация распределена во времени и не конкурирует с обычными запросами за ресурсы. Система RPC gRPC предоставляет etcd чётко определённый расширяемый API, но добавляет задержку, особенно при локальном чтении.
Тесты производительности
Производительность etcd можно измерить инструментом командной строки benchmark , входящим в состав etcd.
В качестве базового примера рассмотрим кластер etcd из трёх участников со следующей аппаратной конфигурацией:
- Google Cloud Compute Engine
- 3 машины: 8 vCPU + 16GB памяти + 50GB SSD
- 1 клиентская машина: 16 vCPU + 30GB памяти + 50GB SSD
- Ubuntu 17.04
- etcd 3.2.0, go 1.8.3
С такой конфигурацией etcd показывает примерно следующую производительность записи:
| Число ключей | Размер ключа в байтах | Размер значения в байтах | Число соединений | Число клиентов | Целевой сервер etcd | Средний QPS записи | Средняя задержка запроса | Средний RSS сервера |
|---|---|---|---|---|---|---|---|---|
| 10,000 | 8 | 256 | 1 | 1 | только лидер | 583 | 1.6ms | 48 MB |
| 100,000 | 8 | 256 | 100 | 1000 | только лидер | 44,341 | 22ms | 124MB |
| 100,000 | 8 | 256 | 100 | 1000 | все участники | 50,104 | 20ms | 126MB |
Примеры команд:
Линеаризуемые запросы чтения проходят через кворум участников кластера, чтобы на основе консенсуса получить самые свежие данные. Сериализуемые запросы дешевле линеаризуемых, поскольку обслуживаются одним участником etcd, а не кворумом, но могут вернуть устаревшие данные. Производительность чтения etcd:
| Число запросов | Размер ключа в байтах | Размер значения в байтах | Число соединений | Число клиентов | Согласованность | Средний QPS чтения | Средняя задержка запроса |
|---|---|---|---|---|---|---|---|
| 10,000 | 8 | 256 | 1 | 1 | Линеаризуемая | 1,353 | 0.7ms |
| 10,000 | 8 | 256 | 1 | 1 | Сериализуемая | 2,909 | 0.3ms |
| 100,000 | 8 | 256 | 100 | 1000 | Линеаризуемая | 141,578 | 5.5ms |
| 100,000 | 8 | 256 | 100 | 1000 | Сериализуемая | 185,758 | 2.2ms |
Примеры команд:
При первой настройке кластера etcd в новом окружении рекомендуется выполнить тест производительности и убедиться, что кластер достигает требуемых показателей: задержка и пропускная способность чувствительны даже к небольшим различиям среды.