Оптимизация Memcache

Memcache работает очень быстро, но эффективность расходования памяти в нем можно повысить. Для того, чтобы это сделать, необходимо разобраться в его структуре хранения данных.

SLAB

SLAB — это алгоритм выделения памяти. Он был создан для ее эффективного использования. Вся память делится на отдельные куски — слабы (slab). Каждый слаб содержит более мелкие куски — чанки (chunk). Когда в память нужно что-то сохранить, мы находим пустой слаб, в нем пустой чанк и записываем туда данные. Когда нужно будет сохранить что-то еще, мы переходим к следующему чанку и сохраняем данные в него.

Представьте, что вся память — это дом. Слабы — это квартиры, а чанки — это комнаты. Это эффективно, т.к. нам не нужно постоянно искать по всей памяти какое-то свободное место. Мы просто заполняем комнату, потом переходим к следующей комнате и т.п. И так пока вся память не будет заполнена.

Использование памяти в чанках

Для скорости работы, Memcache выделяет чанки одинакового размера. Если значение сохраняемого объекта меньше, чем размер чанка, в памяти остается "свободное место": memcache чанки

Это свободное пространство и определяет возможность оптимизации Memcache, т.к. размер чанков можно настроить.

Размеры чанков

Для того, чтобы работать с объектами разных размеров Memcache создает несколько разных слабов (квартир в доме), в которых находятся чанки разных размеров (в некоторых побольше, а в некоторых поменьше):

Когда приходит объект покрупнее, Memcache использует чанки из того слаба, в котором они большие. Главное, чтобы размер объекта был меньше, чем размер чанка. Слабы, в которых находятся чанки одинакового размера объединяются в классы (slabclass). Таким образом:

  • Slabclass определяет группу слабов с одинаковым размером чанков.
  • Slab содержит группу чанков.
  • Чанк — это кусочек памяти, в который сохраняются данные.

Если у нас большие чанки и много мелких объектов, мы рискуем использовать память очень неэффективно. Если объекты большие и много мелких чанков, то эти чанки не будут использованы. В обоих случаях мы не используем все место, которое можем.

Настройка размеров чанка

В Memcache настройка размеров чанков и их количества производится с помощью фактора роста. Это соотношение размера большего чанка к меньшему:

Так при факторе роста в 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
...

# будет 10082 чанка размером 104 байта в слабе, 7710 чанков размером 136 байт и т.п.

Параметры Memcache

Для настройки используется два параметра во время запуска сервера Memcached:

  • Фактор роста
  • Минимальный размер чанка (с которого начинается прирост)

Для установки размера минимального чанка используется параметр "-n":

memcached -n 16

# Устанавливаем минимальный размер чанка — 16 байт

Этот параметр следует уменьшить до 16, если у Вас в кэше есть мелкие объекты, например:

  • счетчики
  • флаги
  • короткие строчные значения (имейлы, пароли, хеши и т.п.)

Второй параметр — это фактор роста. Он задается опцией "-f". Уменьшение этой опции до 1.05 позволит создать больше слабклассов, а следовательно более эффективно выделять память под объекты различного размера. Чем больше классов, тем больше выбор из чанков, а значит больше вероятности подобрать чанк нужного размера:

memcached -n 16 -f 1.05

# Снизим фактор роста до 1.05, и таким образом увеличим количество слабклассов

Дополнительная оптимизация памяти

Опция "-L" заставляет Memcache во время старта подготовить всю выделяемую ему память для использования. Это значит, что во время старта Memcache сделает инициализацию слабов и чанков. И не будет этого делать в процессе работы. Это разгрузит сервер во время работы:

memcached -L

# Инициализация памяти на старте, а не в процессе работы

Вытеснения

Когда Memcache доходит до ограничения в памяти, он начинает удалять объекты по принципу LRU. Количество удаленных объектов фиксируются в параметре evictions внутренней статистики:

telnet 127.0.0.1 11211
stats
...
STAT curr_items 23478623
STAT total_items 52634178623
STAT evictions 34534
STAT reclaimed 0
...

Значение evictions должно быть нулевым либо очень небольшим. Большие значения — это сигнал для расширения. В таких случаях нужно проделать оптимизацию размеров чанков и слабов. После этого — устанавливать дополнительно оборудование.

Самое важное

Настройка Memcache может повысить эффективность использования памяти. В некоторых случаях — в несколько раз. Не торопитесь покупать новые сервера. Убедитесь, что текущее железо используется эффективно. Не забывайте проверять вытеснения ключей — это первый показатель нехватки памяти.


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