Внутренности Memcache

Многие не знают этого, но начиная с версии 1.2.8 Memcached может примерно на 15% более эффективно использовать память, чем более старые версии. Если у вас есть  сервер с 600 Мб Memcached, то после обновления вы "получите"  +100MB оперативной памяти. Почему это происходит?

Общее

Slab – это механизм управления памятью, предназначенный для более эффективного распределения памяти и устранения значительной фрагментации. Основой этого алгоритма является сохранение выделенной памяти, содержащей объект определенного типа, и повторное использование этой памяти при следующем выделении для объекта того же типа.

Как это работает

Когда вы просите Memcached cохранить значения, он ищет "slab", связанный с этим значением. Slab имеет значения в пределах определенного диапазона размеров. Slab-ы состоят из 1 Мб страниц, которые разбиты на куски одинаковых размеров . Допустим,  размер значения 1001 байт;  Memcached будет искать slab который содержит значения между 1000 и 2000 байт. Затем он находит страницы с пустым блоком и вставляет значение в этот блок. Обратите внимание, что блок зафиксирован в размере — он ​​должен быть 2000 байт для хранения наибольшего значение для данного slab-а.

Теперь стала более понятной "объектная модель" распределения памяти в Memcached: slab имеет много страниц, которые имеют много chunk-ов. Каждый блок (chunk) имеет фиксированный размер, основанный на максимальном размере slab-a так, например, slab размером 2000 байт сохранит значения между 1001 и 2000 байт. Старые версии Memcached использовали slab размером на основе степени двойки. Создавались slab-ы размером 1KB, 2KB, 4KB, ..., вплоть до 1 Мб. Если ваш сервер Memcached был полон значений 1001 байта, то эффективность использования памяти составляло 50% (1001/2000) в худшем случае. Если у вас есть равномерное распределение значения размеров, то вы получите 75% эффективности использования памяти (1500/2000). Ваш 600MB Memcached сервер будет иметь только 450MB фактических данных!

memcached-memory-allocation

На этом изображении мы видим один slab с двумя страницами. Каждая страница имеет несколько кусков(chunk), зеленые куски пусты, некоторые имеют оранжевый цвет. Желтые области — это потери. Давайте поговорим о них.

Одним из улучшений которые сделала компания Facebook для Memcached  был переход на меньший экспоненциальный рост slab-ов. Таким образом, есть не так много "отходов" в сохранении значений в chunk-и. Вместо того, чтобы  распределения slab-ов составляло 2 ^ n, последнии версии Memcached используют гораздо меньший экспоненциальный рост (1,25 ^ n), так что вы увидите slab-ы  размером 1 Кб, 1.25KB, 1.56KB, и т.д. ... Это означает, что вместо 25% потерь в среднем, должно быть где то 10%.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень