Memcache работает очень быстро, но эффективность расходования памяти в нем можно повысить. Для того, чтобы это сделать, необходимо разобраться в его структуре хранения данных.
SLAB – это алгоритм выделения памяти. Он был создан для ее эффективного использования. Вся память делится на отдельные куски – слабы (slab). Каждый слаб содержит более мелкие куски – чанки (chunk). Когда в память нужно что-то сохранить, мы находим пустой слаб, в нем пустой чанк и записываем туда данные. Когда нужно будет сохранить что-то еще, мы переходим к следующему чанку и сохраняем данные в него.
Представьте, что вся память – это дом. Слабы – это квартиры, а чанки – это комнаты. Это эффективно, т.к. нам не нужно постоянно искать по всей памяти какое-то свободное место. Мы просто заполняем комнату, потом переходим к следующей комнате и т.п. И так пока вся память не будет заполнена.
Для скорости работы, Memcache выделяет чанки одинакового размера. Если значение сохраняемого объекта меньше, чем размер чанка, в памяти остается “свободное место”:
Это свободное пространство и определяет возможность оптимизации Memcache, т.к. размер чанков можно настроить.
Для того, чтобы работать с объектами разных размеров Memcache создает несколько разных слабов (квартир в доме), в которых находятся чанки разных размеров (в некоторых побольше, а в некоторых поменьше):
Когда приходит объект покрупнее, Memcache использует чанки из того слаба, в котором они большие. Главное, чтобы размер объекта был меньше, чем размер чанка. Слабы, в которых находятся чанки одинакового размера объединяются в классы (slabclass). Таким образом:
Если у нас большие чанки и много мелких объектов, мы рискуем использовать память очень неэффективно. Если объекты большие и много мелких чанков, то эти чанки не будут использованы. В обоих случаях мы не используем все место, которое можем.
В 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 байт и т.п.
Для настройки используется два параметра во время запуска сервера 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), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…