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

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

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

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

Метрики производительности 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версииразмер ключаиспользование памяти
100K164bytes22MB
100K564bytes39MB
1M164bytes218MB
1M564bytes432MB
100K1256bytes41MB
100K5256bytes65MB
1M1256bytes409MB
1M5256bytes506MB

По результатам можно вычислить c1=120bytes и c2=30bytes. Для этого достаточно двух наборов данных, поскольку c1 и c2 — единственные неизвестные переменные в формуле. Значения c1=120bytes и c2=30bytes являются средними по 4 вычисленным наборам c1 и c2. Для небольших пар «ключ — значение» накладные расходы метаданных ключа всё ещё заметны (50%). Тем не менее это значительно лучше старого хранилища, где накладные расходы составляли не менее 1000%.

Общее использование памяти

Общее использование памяти показывает, сколько RSS потребляет etcd вместе с хранилищем. Размер значения почти не должен влиять на общее потребление памяти etcd, поскольку значения хранятся на диске, а в памяти остаются только горячие значения под управлением страничного кеша ОС.

Nверсииразмер ключаразмер значенияиспользование памяти
100K164bytes256bytes40MB
100K564bytes256bytes89MB
1M164bytes256bytes470MB
1M564bytes256bytes880MB
100K164bytes1KB102MB
100K564bytes1KB164MB
1M164bytes1KB587MB
1M564bytes1KB836MB

Результаты показывают, что размер значения не оказывает существенного влияния на потребление памяти. Небольшой рост связан с увеличением объёма данных в страничном кеше ОС.

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 памяти.

клиентыпотоков на клиентанаблюдений на потоквсего наблюденийиспользование памяти
1k111k50MB
2k112k90MB
5k115k200MB
1k10110k217MB
2k10120k417MB
5k10150k980MB
1k50150k1001MB
2k501100k1960MB
5k501250k4700MB
1k5010500k1171MB
2k50101M2371MB
5k50102.5M5710MB
1k501005M2380MB
2k5010010M4672MB
5k5010025MOOM

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 .

Производительность

чтение одного ключа

размер ключа в байтахколичество клиентовчтение QPS90-й процентиль задержки (мс)
256127160.4
25664166236.1
2562561662221.7

Производительность почти такая же, как и у сервера с пустым обработчиком.

чтение одного ключа после записи

размер ключа в байтахколичество клиентовчтение QPS90-й процентиль задержки (мс)
256122690.5
25664135828.6
2562561326247.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 к данным на лидере
12850000643372x
1281000001265954x
12820000024146661x
10245000048125326x
102410000096234424x
1024200000192436122x

Порог объёма данных

  • Когда etcd достигает порогового объёма данных, это может легко вызвать выборы лидера и потерю части предложений.
  • В большинстве случаев кластер etcd должен работать стабильно, пока не достигнут порог. Если из-за нехватки ресурсов работа нарушается, уменьшите объём данных.
байт в значенииограничение количества ключейрекомендуемый порог объёма данных (MB)потребление RSS (MB)
128400K482400
1024300K2926500

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

Производительность

чтение одного ключа

размер ключа в байтахколичество клиентовцелевой сервер etcdQPS чтениязадержка 90-го процентиля (ms)
641только лидер2804 (-5%)0.4 (+0%)
6464только лидер17816 (+0%)5.7 (-6%)
64256только лидер18667 (-6%)20.4 (+2%)
2561только лидер2181 (-15%)0.5 (+25%)
25664только лидер17435 (-7%)6.0 (+9%)
256256только лидер18180 (-8%)21.3 (+3%)
6464все серверы46965 (-4%)2.1 (+0%)
64256все серверы55286 (-6%)7.4 (+6%)
25664все серверы46603 (-6%)2.1 (+5%)
256256все серверы55291 (-6%)7.3 (+4%)

запись одного ключа

размер ключа в байтахколичество клиентовцелевой сервер etcdQPS записизадержка 90-го процентиля (ms)
641только лидер76 (+22%)19.4 (-15%)
6464только лидер2461 (+45%)31.8 (-32%)
64256только лидер4275 (+1%)69.6 (-10%)
2561только лидер64 (+20%)16.7 (-30%)
25664только лидер2385 (+30%)31.5 (-19%)
256256только лидер4353 (-3%)74.0 (+9%)
6464все серверы2005 (+81%)49.8 (-55%)
64256все серверы4868 (+35%)81.5 (-40%)
25664все серверы1925 (+72%)47.7 (-59%)
256256все серверы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)стандартное отклонение задержки
641только лидер23032000.490.06
6464только лидер150486857.600.46
64256только лидер1450843429.761.05
2561только лидер21622140.520.06
25664только лидер147897927.690.48
256256только лидер1442451229.921.42
6464все серверы4575220482.470.14
64256все серверы46592127310.140.59
25664все серверы4533218472.480.12
256256все серверы46485134010.180.74

Производительность записи одного ключа

размер ключа в байтахколичество клиентовцелевой сервер etcdсредний QPS записистандартное отклонение QPS записисредняя задержка 90-го процентиля (ms)стандартное отклонение задержки
641только лидер55424.5113.26
6464только лидер213912535.233.40
64256только лидер458158170.5310.22
2561только лидер56422.374.33
25664только лидер205215136.834.20
256256только лидер444256071.5910.03
6464все серверы16258558.515.14
64256все серверы446129889.4736.48
25664все серверы15999460.116.43
256256все серверы431519388.987.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. Подробные инструкции приведены в руководстве по разработке тестов производительности .

Производительность

чтение одного ключа

размер ключа в байтахколичество клиентовцелевой сервер etcdQPS чтениязадержка 90-го процентиля (ms)
641только лидер15340.7
6464только лидер101259.1
64256только лидер1389227.1
2561только лидер15300.8
25664только лидер1010610.1
256256только лидер1466727.0
6464все серверы242003.9
64256все серверы3330011.8
25664все серверы248003.9
256256все серверы3300011.5

запись одного ключа

размер ключа в байтахколичество клиентовцелевой сервер etcdQPS записизадержка 90-го процентиля (ms)
641только лидер6021.4
6464только лидер174246.8
64256только лидер398290.5
2561только лидер5820.3
25664только лидер177047.8
256256только лидер4157105.3
6464все серверы1028123.4
64256все серверы3260123.8
25664все серверы1033121.5
256256все серверы3061119.3