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

admin

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

SLAB

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

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

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

Для скорости работы, 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 может повысить эффективность использования памяти. В некоторых случаях – в несколько раз. Не торопитесь покупать новые сервера. Убедитесь, что текущее железо используется эффективно. Не забывайте проверять вытеснения ключей – это первый показатель нехватки памяти.

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024