Многие разработчики используют Memcached для своих проектов, но лишь немногие из них точно знают, как работает это решение для кэширования. Давайте погрузимся в мир Memcached, чтобы узнать больше о распределении памяти и о том, как предотвратить фрагментацию памяти для ваших приложений Java и PHP.
Memcached использует выделение памяти slab вместо распределения памяти по элементам. Это позволяет улучшить использование памяти и предотвращает фрагментацию памяти, когда информация истекает из кэша. В этом случае память выделяется в блоках размером 1 МБ. Каждая плита разделена на несколько одинаковых блоков. При попытке сохранить указанное значение в кеш, Memcached проверяет его размер и определяет, какая плита содержит выделение подходящего размера. Если такая плита уже существует, значение записывается в блок внутри плиты. Если нет подходящих существующих блоков, то создается новый сляб, который разделяется на блоки соответствующего размера. Если вы обновляете существующий элемент с данными большего размера, чем существующее выделение блоков для этого ключа, то ключ перераспределяется в подходящую плиту.
В результате вы получаете несколько страниц, размещенных в памяти Memcached. Каждая страница имеет размер 1 МБ и разделена на разное количество фрагментов. Каждый экземпляр имеет несколько распределенных страниц, и новая страница всегда создается, когда необходимо создать новое значение, требующее порцию определенного размера. Плита может содержать несколько страниц, и каждая страница состоит из одинакового количества кусков.
Такой способ выделения памяти гарантирует, что память не будет фрагментирована. Но помните, что наличие относительно небольшого количества элементов в каждом размере чанка может привести к потере большого количества памяти с помощью нескольких чанков на каждой выделенной странице. Эффективность использования такого подхода полностью зависит от распределения объектов, которые вы хотите хранить.
Jelastic Платформа позволяет изменять коэффициент роста слябов в то время как приложение работает. Просто нажмите кнопку Config для Memcached и отредактируйте ваш memcached файл, который находится в каталоге conf.
Давайте выполним небольшой тест!
Например:
OPTIONS="-vv 2>> /var/log/memcached/memcached.log -f 2 -n 32"
В этом случае -f 2 означает, что вы увидите 14 плит и их размер порции удваивается, -n используется для указания минимального пространства, выделенного для ключа, значения и флагов.
Вот результат нашего небольшого теста:
- Детали куска:
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 3 320B 550s 1 113 yes 0 0 0 4 640B 681s 1 277 yes 0 0 0
- Использование памяти:
total used free shared buffers cached Mem: 128 84 43 0 0 70 -/+ buffers/cache: 14 113 Swap: 0 0
Теперь вы можете сравнить его с нашей конфигурацией Memcached по умолчанию:
OPTIONS="-vv 2>> /var/log/memcached/memcached.log"
Результаты:
- Детали куска:
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 5 240B 765s 1 27 yes 0 0 0 6 304B 634s 1 93 yes 0 0 0 7 384B 634s 1 106 yes 0 0 0 8 480B 703s 1 133 yes 0 0 0 9 600B 634s 1 57 yes 0 0 0
- Использование памяти:
total used free shared buffers cached Mem: 128 87 40 0 0 70 -/+ buffers/cache: 17 110 Swap: 0 0 0
Вы также можете использовать -L, чтобы увеличить размер страницы памяти, чтобы уменьшить количество пропусков TLB и повысить производительность.
Благодаря этой простой и понятной оптимизации мы можем улучшить использование выделенной памяти.
Это может быть очень полезно, чтобы глубже изучить различные системы. Как видите, они намного сложнее, чем мы можем себе представить. Они состоят из ряда методов, которые могут помочь решить множество проблем. Знание и понимание основ каждой технологии поможет вам в вашем развитии.