Memcached - настройка под малые объекты

Чаще всего Memcache используется для хранения малых объектов (в больших количествах). По умолчанию, memcache не оптимально настроен именно на такое его использование. Поэтому, поговорим о том, как можно его подстроить для получения большей эффективности работы.
Работа с памятью
Для начала, рассмотрим в двух словах, какие принципы использует memcache для работы с памятью:
Memcache использует механизм SLAB для выделения памяти. Этот механизм основан на том, что доступная память делится на определенные сектора, называемые slabs, одинакового размера. Каждый slab содержит несколько чанков (chunk) - также одинакового размера. Когда memcache пытается получить память для нового объекта, он просто обращается к следующему пустому чанку. Поскольку все они имеют одинаковый размер, выделение памяти для нового объекта происходит максимально быстро - простой поиск следующего элемента списка - О(1).
Сектора памяти (slabs) объединяются в классы (slabclass) исходя из размеров чанков. Принцип выделения классов основан на факторе роста - отношение размеров большего чанка к меньшему. Так при факторе роста в 1.25 будет такое распределение классов:
slab class 1: chunk size 104 perslab 10082 slab class 2: chunk size 136 perslab 7710 slab class 3: chunk size 176 perslab 5957 slab class 4: chunk size 224 perslab 4681 ...
Параметры для настройки
Как Вы заметили, все чанки имеют одинаковый размер в пределах класса, что может стать причиной неэффективного расходования памяти при большом количестве малых объектов. Размер минимального чанка по умолчанию равен 104 байта.
Для установки размера минимального чанка используется параметр “-n”. Этот параметр следует уменьшать хотя бы до 16 (можно и меньше - все зависит размера объектов в кеше и их количестве). Осторожно! Не нужно использовать этот совет как правило для настройки любого сервера. Если малых объектов (менее 48 байт) в Вашей системе сравнительно мало (например, 1% от всех объектов), то Вам нужно скорее всего даже увеличивать этот показатель.
Второй параметр, который регулирует эффективность работы с памятью это фактор роста. Он задается опцией “-f”. Уменьшение этой опции до 1.05 позволит создать больше слабклассов, а следовательно более эффективно выделять память под объекты различного размера (в этом случае будет выбор из большего набора чанков).
И все это будет выглядеть где-то так:
/etc/init.d/memcached -n 16 -f 1.05
Предварительная инициализация памяти
Обратите внимание на опцию “-L”, которая заставляет memcache во время старта подготовить всю выделяемую ему память для использования. Другими словами во время старта memcache запустит инициализацию секторов slabs. Это позволит избежать значительного числа вывозов метода malloc() уже при работе, который может работать весьма медленно из за проблем фрагментации памяти.
Хочу еще раз обратить внимание, что описанные в этой статье настройки позволяют увеличить эффективность работы memcache с памятью (т.е. более эффективно ее распределять). Приведенные примеры - это только примеры, реальные числа нужно определять на основе анализа работающей системы, но сам принцип заключается в определении размеров объектов в памяти. Анализ объектов в мемкеше рассматривался в статье Внутренности Memcached от создателей твиттера.


Спасибо большое. Проблема производительности Memcachedb для меня сейчас очень актуальна. Благодаря Вам удалось решить вопрос.
Только проблема была с большими данными.