Это многостраничная версия текущего раздела для печати. .
Тестирование производительности
- 1: Тестирование использования памяти хранилищем
- 2: Тестирование использования памяти наблюдателями
- 3: Тестирование производительности etcd v3
- 4: Тестирование памяти etcd v2.2.0-rc
- 5: Тестирование производительности etcd v2.2.0-rc
- 6: Тестирование производительности etcd v2.2.0
- 7: Тестирование производительности etcd v2.1.0
Тестирование производительности
Бенчмарки etcd будут регулярно публиковаться и отслеживаться для каждого выпуска ниже:
Тесты производительности использования памяти
Он фиксирует ожидаемое использование памяти в различных сценариях.
1 - Тестирование использования памяти хранилищем
Физическую память потребляют два компонента хранилища etcd. Для ускорения поиска ключей процесс etcd выделяет индекс в памяти. Управляемый операционной системой страничный кеш процесса хранит недавно прочитанные с диска данные для быстрого повторного использования.
Индекс в памяти хранит все ключи в структуре данных B-tree вместе с указателями на данные на диске — значения. Каждый ключ в B-tree может содержать несколько указателей на разные версии значения. Поэтому теоретическое потребление памяти индексом можно приблизительно оценить формулой:
N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)
где c1 — накладные расходы метаданных ключа, а c2 — накладные расходы метаданных версии.
На схеме показана подробная структура B-tree индекса в памяти.
Память страничного кеша управляется операционной системой и подробно в этом документе не рассматривается.
Среда тестирования
Версия etcd
Тип машины GCE n1-standard-2
- 7.5 GB памяти
- 2x CPU
Использование памяти индексом в памяти
В этом тесте измеряется только потребление памяти индексом. Цель — найти упомянутые выше c1 и c2 и понять жёсткий предел потребления памяти хранилищем.
Потребление вычисляется с помощью Go runtime.ReadMemStats как разница общего числа выделенных байтов до и после создания индекса. Это не идеально отражает память самого индекса, но показывает приблизительный характер потребления.
| N | версии | размер ключа | использование памяти |
|---|---|---|---|
| 100K | 1 | 64bytes | 22MB |
| 100K | 5 | 64bytes | 39MB |
| 1M | 1 | 64bytes | 218MB |
| 1M | 5 | 64bytes | 432MB |
| 100K | 1 | 256bytes | 41MB |
| 100K | 5 | 256bytes | 65MB |
| 1M | 1 | 256bytes | 409MB |
| 1M | 5 | 256bytes | 506MB |
По результатам можно вычислить c1=120bytes и c2=30bytes. Для этого достаточно двух наборов данных, поскольку c1 и c2 — единственные неизвестные переменные в формуле. Значения c1=120bytes и c2=30bytes являются средними по 4 вычисленным наборам c1 и c2. Для небольших пар «ключ — значение» накладные расходы метаданных ключа всё ещё заметны (50%). Тем не менее это значительно лучше старого хранилища, где накладные расходы составляли не менее 1000%.
Общее использование памяти
Общее использование памяти показывает, сколько RSS потребляет etcd вместе с хранилищем. Размер значения почти не должен влиять на общее потребление памяти etcd, поскольку значения хранятся на диске, а в памяти остаются только горячие значения под управлением страничного кеша ОС.
| N | версии | размер ключа | размер значения | использование памяти |
|---|---|---|---|---|
| 100K | 1 | 64bytes | 256bytes | 40MB |
| 100K | 5 | 64bytes | 256bytes | 89MB |
| 1M | 1 | 64bytes | 256bytes | 470MB |
| 1M | 5 | 64bytes | 256bytes | 880MB |
| 100K | 1 | 64bytes | 1KB | 102MB |
| 100K | 5 | 64bytes | 1KB | 164MB |
| 1M | 1 | 64bytes | 1KB | 587MB |
| 1M | 5 | 64bytes | 1KB | 836MB |
Результаты показывают, что размер значения не оказывает существенного влияния на потребление памяти. Небольшой рост связан с увеличением объёма данных в страничном кеше ОС.
2 - Тестирование использования памяти наблюдателями
Возможности наблюдения активно развиваются, поэтому потребление памяти может меняться. Мы не ожидаем, что оно значительно превысит приведённые ниже значения.
Одна из основных целей etcd — поддерживать очень большое число наблюдателей, выполняющих огромное количество наблюдений. etcd стремится поддерживать O(10k) клиентов, O(100K) потоков наблюдения (O(10) потоков на клиента) и O(10M) наблюдений в сумме (O(100) наблюдений на поток). На каждое отдельное наблюдение приходится наибольшая часть общего потребления памяти etcd, поэтому именно оно находится в центре текущей и будущей оптимизации.
Физическую память потребляют три связанных компонента наблюдения etcd: каждый grpc.Conn, каждый поток наблюдения и каждый экземпляр операции наблюдения. grpc.Conn поддерживает фактическое TCP-соединение и другое состояние соединения gRPC. Каждый grpc.Conn потребляет O(10kb) памяти и может обслуживать несколько потоков наблюдения.
Каждый поток наблюдения является независимым HTTP2-соединением и потребляет ещё O(10kb) памяти. Несколько наблюдений могут совместно использовать один поток.
Наблюдение — это фактическая структура, отслеживающая изменения в хранилище ключей и значений. Каждое наблюдение должно потреблять менее O(1kb).
Теоретическое потребление памяти наблюдением можно оценить по формуле:
memory = c1 * number_of_conn + c2 * avg_number_of_stream_per_conn + c3 * avg_number_of_watch_stream
Среда тестирования
Версия etcd
Тип машины GCE n1-standard-2
- 7.5 GB памяти
- 2x CPU
Общее использование памяти
Общее использование памяти показывает, сколько RSS потребляет etcd с клиентскими наблюдателями. Результат может различаться на 10%, но всё равно полезен, поскольку цель — определить приблизительное потребление памяти и характер выделений.
По результатам тестирования можно приблизительно вычислить: c1 = 17kb, c2 = 18kb и c3 = 350bytes. Таким образом, каждое дополнительное клиентское соединение потребляет 17kb памяти, каждый дополнительный поток — 18kb, а каждое дополнительное наблюдение — лишь 350bytes. В обычных условиях один сервер etcd способен поддерживать миллионы наблюдений, располагая несколькими GB памяти.
| клиенты | потоков на клиента | наблюдений на поток | всего наблюдений | использование памяти |
|---|---|---|---|---|
| 1k | 1 | 1 | 1k | 50MB |
| 2k | 1 | 1 | 2k | 90MB |
| 5k | 1 | 1 | 5k | 200MB |
| 1k | 10 | 1 | 10k | 217MB |
| 2k | 10 | 1 | 20k | 417MB |
| 5k | 10 | 1 | 50k | 980MB |
| 1k | 50 | 1 | 50k | 1001MB |
| 2k | 50 | 1 | 100k | 1960MB |
| 5k | 50 | 1 | 250k | 4700MB |
| 1k | 50 | 10 | 500k | 1171MB |
| 2k | 50 | 10 | 1M | 2371MB |
| 5k | 50 | 10 | 2.5M | 5710MB |
| 1k | 50 | 100 | 5M | 2380MB |
| 2k | 50 | 100 | 10M | 4672MB |
| 5k | 50 | 100 | 25M | OOM |
3 - Тестирование производительности etcd v3
Физические машины
GCE тип машинного оборудования n1-highcpu-2
- 1x выделенный локальный диск SSD, подключённый под /var/lib/etcd
- 1x выделенный медленный диск для ОС
- 1.8 GB памяти
- 2x процессора
- версия etcd 2.2.0
etcd Кластер
1 участник etcd, работающий в режиме демонстрации v3
Тестирование
Используйте инструмент тестирования производительности etcd v3 .
Производительность
чтение одного ключа
| размер ключа в байтах | количество клиентов | чтение QPS | 90-й процентиль задержки (мс) |
|---|---|---|---|
| 256 | 1 | 2716 | 0.4 |
| 256 | 64 | 16623 | 6.1 |
| 256 | 256 | 16622 | 21.7 |
Производительность почти такая же, как и у сервера с пустым обработчиком.
чтение одного ключа после записи
| размер ключа в байтах | количество клиентов | чтение QPS | 90-й процентиль задержки (мс) |
|---|---|---|---|
| 256 | 1 | 2269 | 0.5 |
| 256 | 64 | 13582 | 8.6 |
| 256 | 256 | 13262 | 47.5 |
Производительность при пустом обработчике сервера не страдает от одного оператора put. Следовательно, понижение производительности должно быть вызвано пакетом хранения.
4 - Тестирование памяти etcd v2.2.0-rc
Физическая машина
Тип машины GCE n1-standard-2
- 1x выделенный локальный SSD, подключённый в /var/lib/etcd
- 1x выделенный медленный диск для ОС
- 7.5 GB памяти
- 2x CPU
etcd
Тестирование
Запускается кластер etcd из 3 участников, каждый из которых использует 2 ядра.
Длина имени ключа всегда составляет 64 bytes — это разумная средняя длина ключа.
Максимальное использование памяти
- etcd может использовать максимальный объём памяти, если один из последователей недоступен, а лидер продолжает отправлять снимки.
max RSS— максимальный объём используемой памяти, зафиксированный в 3 запусках.
| байт в значении | количество ключей | объём данных (MB) | max RSS (MB) | отношение max RSS к данным на лидере |
|---|---|---|---|---|
| 128 | 50000 | 6 | 433 | 72x |
| 128 | 100000 | 12 | 659 | 54x |
| 128 | 200000 | 24 | 1466 | 61x |
| 1024 | 50000 | 48 | 1253 | 26x |
| 1024 | 100000 | 96 | 2344 | 24x |
| 1024 | 200000 | 192 | 4361 | 22x |
Порог объёма данных
- Когда etcd достигает порогового объёма данных, это может легко вызвать выборы лидера и потерю части предложений.
- В большинстве случаев кластер etcd должен работать стабильно, пока не достигнут порог. Если из-за нехватки ресурсов работа нарушается, уменьшите объём данных.
| байт в значении | ограничение количества ключей | рекомендуемый порог объёма данных (MB) | потребление RSS (MB) |
|---|---|---|---|
| 128 | 400K | 48 | 2400 |
| 1024 | 300K | 292 | 6500 |
5 - Тестирование производительности etcd v2.2.0-rc
Физическая машина
Тип машины GCE n1-highcpu-2
- 1x выделенный локальный SSD, подключённый в /var/lib/etcd
- 1x выделенный медленный диск для ОС
- 1.8 GB памяти
- 2x CPU
Кластер etcd
3 участника etcd 2.2.0-rc, каждый работает на отдельной машине.
Точные версии:
Кроме того, базовая производительность измеряется на кластере из 3 участников etcd 2.1.0 стадии alpha. Текущий коммит etcd — c7146bd5 , тот же, что использован в тестировании etcd 2.1 .
Тестирование
Запустите ещё одну машину и с помощью инструмента HTTP-тестирования hey отправляйте запросы каждому участнику etcd. Подробные инструкции приведены в руководстве по разработке тестов производительности .
Производительность
чтение одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | QPS чтения | задержка 90-го процентиля (ms) |
|---|---|---|---|---|
| 64 | 1 | только лидер | 2804 (-5%) | 0.4 (+0%) |
| 64 | 64 | только лидер | 17816 (+0%) | 5.7 (-6%) |
| 64 | 256 | только лидер | 18667 (-6%) | 20.4 (+2%) |
| 256 | 1 | только лидер | 2181 (-15%) | 0.5 (+25%) |
| 256 | 64 | только лидер | 17435 (-7%) | 6.0 (+9%) |
| 256 | 256 | только лидер | 18180 (-8%) | 21.3 (+3%) |
| 64 | 64 | все серверы | 46965 (-4%) | 2.1 (+0%) |
| 64 | 256 | все серверы | 55286 (-6%) | 7.4 (+6%) |
| 256 | 64 | все серверы | 46603 (-6%) | 2.1 (+5%) |
| 256 | 256 | все серверы | 55291 (-6%) | 7.3 (+4%) |
запись одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | QPS записи | задержка 90-го процентиля (ms) |
|---|---|---|---|---|
| 64 | 1 | только лидер | 76 (+22%) | 19.4 (-15%) |
| 64 | 64 | только лидер | 2461 (+45%) | 31.8 (-32%) |
| 64 | 256 | только лидер | 4275 (+1%) | 69.6 (-10%) |
| 256 | 1 | только лидер | 64 (+20%) | 16.7 (-30%) |
| 256 | 64 | только лидер | 2385 (+30%) | 31.5 (-19%) |
| 256 | 256 | только лидер | 4353 (-3%) | 74.0 (+9%) |
| 64 | 64 | все серверы | 2005 (+81%) | 49.8 (-55%) |
| 64 | 256 | все серверы | 4868 (+35%) | 81.5 (-40%) |
| 256 | 64 | все серверы | 1925 (+72%) | 47.7 (-59%) |
| 256 | 256 | все серверы | 4975 (+36%) | 70.3 (-36%) |
объяснение изменений производительности
QPS чтения в большинстве сценариев снизился на 5~8%. Причина в том, что etcd записывает метрики хранилища для каждой операции. Эти метрики важны для мониторинга и отладки, поэтому такое снижение приемлемо.
QPS записи на лидер увеличился на 20~30%. Основной цикл Raft и цикл применения записей были разделены, что устранило взаимные блокировки.
QPS записи на все серверы увеличился на 30~80%, поскольку последователи раньше получают последний зафиксированный индекс и быстрее фиксируют предложения.
6 - Тестирование производительности etcd v2.2.0
Физические машины
Тип машины GCE n1-highcpu-2
- 1x выделенный локальный SSD, используемый как каталог данных etcd
- 1x выделенный медленный диск для ОС
- 1.8 GB памяти
- 2x CPU
Кластер etcd
3 участника etcd 2.2.0, каждый работает на отдельной машине.
Точные версии:
Тестирование
Запустите ещё одну машину вне кластера etcd и примените инструмент HTTP-тестирования hey
с патчем повторного использования соединений для отправки запросов каждому участнику кластера etcd. Патч и шаги для воспроизведения процедуры приведены в инструкции по тестированию
.
Производительность вычислена по результатам 100 раундов тестирования.
Производительность
Производительность чтения одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | средний QPS чтения | стандартное отклонение QPS чтения | средняя задержка 90-го процентиля (ms) | стандартное отклонение задержки |
|---|---|---|---|---|---|---|
| 64 | 1 | только лидер | 2303 | 200 | 0.49 | 0.06 |
| 64 | 64 | только лидер | 15048 | 685 | 7.60 | 0.46 |
| 64 | 256 | только лидер | 14508 | 434 | 29.76 | 1.05 |
| 256 | 1 | только лидер | 2162 | 214 | 0.52 | 0.06 |
| 256 | 64 | только лидер | 14789 | 792 | 7.69 | 0.48 |
| 256 | 256 | только лидер | 14424 | 512 | 29.92 | 1.42 |
| 64 | 64 | все серверы | 45752 | 2048 | 2.47 | 0.14 |
| 64 | 256 | все серверы | 46592 | 1273 | 10.14 | 0.59 |
| 256 | 64 | все серверы | 45332 | 1847 | 2.48 | 0.12 |
| 256 | 256 | все серверы | 46485 | 1340 | 10.18 | 0.74 |
Производительность записи одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | средний QPS записи | стандартное отклонение QPS записи | средняя задержка 90-го процентиля (ms) | стандартное отклонение задержки |
|---|---|---|---|---|---|---|
| 64 | 1 | только лидер | 55 | 4 | 24.51 | 13.26 |
| 64 | 64 | только лидер | 2139 | 125 | 35.23 | 3.40 |
| 64 | 256 | только лидер | 4581 | 581 | 70.53 | 10.22 |
| 256 | 1 | только лидер | 56 | 4 | 22.37 | 4.33 |
| 256 | 64 | только лидер | 2052 | 151 | 36.83 | 4.20 |
| 256 | 256 | только лидер | 4442 | 560 | 71.59 | 10.03 |
| 64 | 64 | все серверы | 1625 | 85 | 58.51 | 5.14 |
| 64 | 256 | все серверы | 4461 | 298 | 89.47 | 36.48 |
| 256 | 64 | все серверы | 1599 | 94 | 60.11 | 6.43 |
| 256 | 256 | все серверы | 4315 | 193 | 88.98 | 7.01 |
Изменения производительности
Поскольку etcd теперь записывает метрики для каждого вызова API, в большинстве сценариев QPS чтения немного снизился. Это минимальное влияние на производительность признано разумной платой за широкий набор данных для мониторинга и отладки.
QPS записи на лидерах кластера немного увеличился. Основной цикл и циклы применения записей были разделены в логике Raft etcd, что устранило несколько блокировок между ними.
QPS записи на всех участниках значительно увеличился, поскольку последователи теперь раньше получают последний зафиксированный индекс и быстрее фиксируют предложения.
7 - Тестирование производительности etcd v2.1.0
Физические машины
Тип машины GCE n1-highcpu-2
- 1x выделенный локальный SSD, подключённый в /var/lib/etcd
- 1x выделенный медленный диск для ОС
- 1.8 GB памяти
- 2x CPU
- etcd версии 2.1.0 alpha
Кластер etcd
3 участника etcd, каждый работает на отдельной машине
Тестирование
Запустите ещё одну машину и с помощью инструмента HTTP-тестирования hey отправляйте запросы каждому участнику etcd. Подробные инструкции приведены в руководстве по разработке тестов производительности .
Производительность
чтение одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | QPS чтения | задержка 90-го процентиля (ms) |
|---|---|---|---|---|
| 64 | 1 | только лидер | 1534 | 0.7 |
| 64 | 64 | только лидер | 10125 | 9.1 |
| 64 | 256 | только лидер | 13892 | 27.1 |
| 256 | 1 | только лидер | 1530 | 0.8 |
| 256 | 64 | только лидер | 10106 | 10.1 |
| 256 | 256 | только лидер | 14667 | 27.0 |
| 64 | 64 | все серверы | 24200 | 3.9 |
| 64 | 256 | все серверы | 33300 | 11.8 |
| 256 | 64 | все серверы | 24800 | 3.9 |
| 256 | 256 | все серверы | 33000 | 11.5 |
запись одного ключа
| размер ключа в байтах | количество клиентов | целевой сервер etcd | QPS записи | задержка 90-го процентиля (ms) |
|---|---|---|---|---|
| 64 | 1 | только лидер | 60 | 21.4 |
| 64 | 64 | только лидер | 1742 | 46.8 |
| 64 | 256 | только лидер | 3982 | 90.5 |
| 256 | 1 | только лидер | 58 | 20.3 |
| 256 | 64 | только лидер | 1770 | 47.8 |
| 256 | 256 | только лидер | 4157 | 105.3 |
| 64 | 64 | все серверы | 1028 | 123.4 |
| 64 | 256 | все серверы | 3260 | 123.8 |
| 256 | 64 | все серверы | 1033 | 121.5 |
| 256 | 256 | все серверы | 3061 | 119.3 |