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

Это многостраничная версия текущего раздела для печати. .

Вернуться к обычному виду страницы.

Тестирование производительности

Метрики производительности etcd

Тестирование производительности

Бенчмарки etcd будут регулярно публиковаться и отслеживаться для каждого выпуска ниже:

Тесты производительности использования памяти

Он фиксирует ожидаемое использование памяти в различных сценариях.

1 - Тестирование использования памяти хранилищем

Показатели производительности хранилища etcd (индекс в памяти и страничный кеш)

Физическую память потребляют два компонента хранилища etcd. Для ускорения поиска ключей процесс etcd выделяет индекс в памяти. Управляемый операционной системой страничный кеш процесса хранит недавно прочитанные с диска данные для быстрого повторного использования.

Индекс в памяти хранит все ключи в структуре данных B-tree вместе с указателями на данные на диске — значения. Каждый ключ в B-tree может содержать несколько указателей на разные версии значения. Поэтому теоретическое потребление памяти индексом можно приблизительно оценить формулой:

N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)

где c1 — накладные расходы метаданных ключа, а c2 — накладные расходы метаданных версии.

На схеме показана подробная структура B-tree индекса в памяти.



                                In mem index

                               +------------+
                               | key || ... |
  +--------------+             |     ||     |
  |              |             +------------+
  |              |             | v1  || ... |
  |   disk    <----------------|     ||     | Tree Node
  |              |             +------------+
  |              |             | v2  || ... |
  |           <----------------+     ||     |
  |              |             +------------+
  +--------------+       +-----+    |   |   |
                         |     |    |   |   |
                         |     +------------+
                         |
                         |
                         ^
                      ------+
                      | ... |
                      |     |
                      +-----+
                      | ... | Tree Node
                      |     |
                      +-----+
                      | ... |
                      |     |
                      ------+

Память страничного кеша управляется операционной системой и подробно в этом документе не рассматривается.

Среда тестирования

Версия 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 — поддерживать очень большое число наблюдателей, выполняющих огромное количество наблюдений. 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).

                                          +-------+
                                          | watch |
                              +---------> | foo   |
                              |           +-------+
                       +------+-----+
                       |   stream   |
      +--------------> |            |
      |                +------+-----+     +-------+
      |                       |           | watch |
      |                       +---------> | bar   |
+-----+------+                            +-------+
|            |         +------------+
|   conn     +-------> |   stream   |
|            |         |            |
+-----+------+         +------------+
      |
      |
      |
      |                +------------+
      +--------------> |   stream   |
                       |            |
                       +------------+

Теоретическое потребление памяти наблюдением можно оценить по формуле: 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

Показатели производительности для 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

Показатели производительности памяти etcd v2.2.0-rc

Физическая машина

Тип машины GCE n1-standard-2

  • 1x выделенный локальный SSD, подключённый в /var/lib/etcd
  • 1x выделенный медленный диск для ОС
  • 7.5 GB памяти
  • 2x CPU

etcd

etcd Version: 2.2.0-rc.0+git
Git SHA: 103cb5c
Go Version: go1.5
Go OS/Arch: linux/amd64

Тестирование

Запускается кластер 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

Показатели производительности 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, каждый работает на отдельной машине.

Точные версии:

etcd Version: 2.2.0-alpha.1+git
Git SHA: 59a5a7e
Go Version: go1.4.2
Go OS/Arch: linux/amd64

Кроме того, базовая производительность измеряется на кластере из 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

Показатели производительности etcd v2.2.0

Физические машины

Тип машины GCE n1-highcpu-2

  • 1x выделенный локальный SSD, используемый как каталог данных etcd
  • 1x выделенный медленный диск для ОС
  • 1.8 GB памяти
  • 2x CPU

Кластер etcd

3 участника etcd 2.2.0, каждый работает на отдельной машине.

Точные версии:

etcd Version: 2.2.0
Git SHA: e4561dd
Go Version: go1.5
Go OS/Arch: linux/amd64

Тестирование

Запустите ещё одну машину вне кластера 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

Показатели производительности 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