Тест продуктивності використання памʼяті сховища

Вимірювання продуктивності для сховища etcd (індекс в памʼяті та кеш сторінок)

Два компоненти сховища etcd споживають фізичну памʼять. Процес etcd виділяє індекс в памʼяті для прискорення пошуку ключів. Кеш сторінок процесу, керований операційною системою, зберігає нещодавно доступні дані з диска для швидкого повторного використання.

Індекс в памʼяті містить усі ключі в структурі даних B-дерево, разом з вказівниками на дані на диску (значення). Кожен ключ у B-дереві може містити кілька вказівників, що вказують на різні версії його значень. Теоретичне споживання памʼяті індексом в памʼяті можна приблизно оцінити за формулою:

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

де c1 — це накладні витрати метаданих ключа, а c2 — накладні витрати метаданих версії.

Графік показує детальну структуру B-дерева індексу в памʼяті.



                               Індекс в памʼяті

                               +-------------+
                               | ключ || ... |
  +--------------+             |      ||     |
  |              |             +-------------+
  |              |             | v1   || ... |
  |   диск    <----------------|      ||     | Вузол дерева
  |              |             +-------------+
  |              |             | v2   || ... |
  |           <----------------+      ||     |
  |              |             +-------------+
  +--------------+       +-----+    |   |    |
                         |     |    |   |    |
                         |     +-------------+
                         |
                         |
                         ^
                      +-----+
                      | ... |
                      |     |
                      +-----+
                      | ... | Вузол дерева
                      |     |
                      +-----+
                      | ... |
                      |     |
                      +-----+

Памʼять кешу сторінок керується операційною системою і не розглядається детально в цьому документі.

Тестове середовище

версія etcd

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

  • 7.5 ГБ памʼяті
  • 2x CPU

Використання памʼяті індексом в памʼяті

У цьому тесті ми лише вимірюємо використання памʼяті індексом в памʼяті. Мета — знайти c1 і c2, згадані вище, і зрозуміти жорстку межу споживання памʼяті сховищем.

Ми обчислюємо споживання памʼяті за допомогою Go runtime.ReadMemStats. Ми обчислюємо різницю загальної кількості виділених байтів до створення індексу та після створення індексу. Це не може точно відобразити використання памʼяті самим індексом в памʼяті, але може показати приблизний шаблон споживання.

Nверсіїрозмір ключавикористання памʼяті
100K164байт22МБ
100K564байт39МБ
164байт218МБ
564байт432МБ
100K1256байт41МБ
100K5256байт65МБ
1256байт409МБ
5256байт506МБ

На основі результату ми можемо обчислити c1=120байт, c2=30байт. Нам потрібно лише два набори даних для обчислення c1 і c2, оскільки вони є єдиними невідомими змінними у формулі. c1=120байт і c2=30байт є середніми значеннями з 4 наборів c1 і c2, які ми обчислили. Накладні витрати метаданих ключа все ще відносно значні (50%) для малих пар ключ-значення. Однак це значне покращення порівняно зі старим сховищем, яке мало принаймні 1000% накладних витрат.

Загальне використання памʼяті

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

Nверсіїрозмір ключарозмір значеннявикористання памʼяті
100K164байт256байт40МБ
100K564байт256байт89МБ
164байт256байт470МБ
564байт256байт880МБ
100K164байт1КБ102МБ
100K564байт1КБ164МБ
164байт1КБ587МБ
564байт1КБ836МБ

На основі результату ми знаємо, що розмір значення не має значного впливу на споживання памʼяті. Є деяке незначне збільшення через більше даних, що утримуються в кеші сторінок ОС.