Статьи

Memcached Распределение памяти

Многие разработчики используют Memcached для своих проектов, но лишь немногие из них точно знают, как работает это решение для кэширования. Давайте погрузимся в мир Memcached, чтобы узнать больше о распределении памяти и о том, как предотвратить фрагментацию памяти для ваших приложений Java и PHP.

Memcached использует выделение памяти slab вместо распределения памяти по элементам. Это позволяет улучшить использование памяти и предотвращает фрагментацию памяти, когда информация истекает из кэша. В этом случае память выделяется в блоках размером 1 МБ. Каждая плита разделена на несколько одинаковых блоков. При попытке сохранить указанное значение в кеш, Memcached проверяет его размер и определяет, какая плита содержит выделение подходящего размера. Если такая плита уже существует, значение записывается в блок внутри плиты. Если нет подходящих существующих блоков, то создается новый сляб, который разделяется на блоки соответствующего размера. Если вы обновляете существующий элемент с данными большего размера, чем существующее выделение блоков для этого ключа, то ключ перераспределяется в подходящую плиту.

Memcached Распределение памяти

В результате вы получаете несколько страниц, размещенных в памяти Memcached. Каждая страница имеет размер 1 МБ и разделена на разное количество фрагментов. Каждый экземпляр имеет несколько распределенных страниц, и новая страница всегда создается, когда необходимо создать новое значение, требующее порцию определенного размера. Плита может содержать несколько страниц, и каждая страница состоит из одинакового количества кусков.

Такой способ выделения памяти гарантирует, что память не будет фрагментирована. Но помните, что наличие относительно небольшого количества элементов в каждом размере чанка может привести к потере большого количества памяти с помощью нескольких чанков на каждой выделенной странице. Эффективность использования такого подхода полностью зависит от распределения объектов, которые вы хотите хранить.

Jelastic Платформа позволяет изменять коэффициент роста слябов в то время как приложение работает. Просто нажмите кнопку Config для Memcached и отредактируйте ваш memcached файл, который находится в каталоге conf.

Давайте выполним небольшой тест!

Например:

OPTIONS="-vv 2>> /var/log/memcached/memcached.log -f 2 -n 32"

Memcached выделение памяти

В этом случае -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 и повысить производительность.

Благодаря этой простой и понятной оптимизации мы можем улучшить использование выделенной памяти.

Это может быть очень полезно, чтобы глубже изучить различные системы. Как видите, они намного сложнее, чем мы можем себе представить. Они состоят из ряда методов, которые могут помочь решить множество проблем. Знание и понимание основ каждой технологии поможет вам в вашем развитии.