Тест продуктивності використання памʼяті сховища
Два компоненти сховища 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 | версії | розмір ключа | використання памʼяті |
|---|---|---|---|
| 100K | 1 | 64байт | 22МБ |
| 100K | 5 | 64байт | 39МБ |
| 1М | 1 | 64байт | 218МБ |
| 1М | 5 | 64байт | 432МБ |
| 100K | 1 | 256байт | 41МБ |
| 100K | 5 | 256байт | 65МБ |
| 1М | 1 | 256байт | 409МБ |
| 1М | 5 | 256байт | 506МБ |
На основі результату ми можемо обчислити c1=120байт, c2=30байт. Нам потрібно лише два набори даних для обчислення c1 і c2, оскільки вони є єдиними невідомими змінними у формулі. c1=120байт і c2=30байт є середніми значеннями з 4 наборів c1 і c2, які ми обчислили. Накладні витрати метаданих ключа все ще відносно значні (50%) для малих пар ключ-значення. Однак це значне покращення порівняно зі старим сховищем, яке мало принаймні 1000% накладних витрат.
Загальне використання памʼяті
Загальне використання памʼяті відображає, скільки RSS споживає etcd зі сховищем. Розмір значення повинен мати дуже малий вплив на загальне використання памʼяті etcd, оскільки ми зберігаємо значення на диску і лише утримуємо гарячі значення в памʼяті, керовані кешем сторінок ОС.
| N | версії | розмір ключа | розмір значення | використання памʼяті |
|---|---|---|---|---|
| 100K | 1 | 64байт | 256байт | 40МБ |
| 100K | 5 | 64байт | 256байт | 89МБ |
| 1М | 1 | 64байт | 256байт | 470МБ |
| 1М | 5 | 64байт | 256байт | 880МБ |
| 100K | 1 | 64байт | 1КБ | 102МБ |
| 100K | 5 | 64байт | 1КБ | 164МБ |
| 1М | 1 | 64байт | 1КБ | 587МБ |
| 1М | 5 | 64байт | 1КБ | 836МБ |
На основі результату ми знаємо, що розмір значення не має значного впливу на споживання памʼяті. Є деяке незначне збільшення через більше даних, що утримуються в кеші сторінок ОС.
Відгук
Чи це було корисним?
Раді чути! Будь ласка, повідомте нам, як ми можемо зробити краще.
Дуже шкода це чути. Будь ласка, повідомте нам, як ми можемо зробити краще.