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

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

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023