классы slab и распределение памяти в memcached

#caching #memory #memcached #libmemcache #slab

#кэширование #память #memcached #libmemcache #slab

Вопрос:

Недавно я начал просматривать исходный код memcached и наткнулся на эту структуру. Насколько я понимаю, существует примерно 64 блока, и каждый блок представляет собой уникальный размер блока. Если мы возьмем первый класс slab (скажем, размер 80), то страницы, которые принадлежат этому slab, будут иметь память, разбитую на 80 байт.

 typedef struct {
  unsigned int size;      // sizes of items
  unsigned int perslab;   // how many items per slab

  void *slots;            // list of item ptrs
  unsigned int sl_curr;   // total free items in list

  unsigned int slabs;     // how many slabs were allocated for this class

  void **slab_list;       // array of slab pointers
  unsigned int list_size; // size of prev array

  size_t requested;       // The number of requested bytes

} slabclass_t;
  

Я не понимаю эту строку,

 unsigned int slabs;     // how many slabs were allocated for this class
  

Что он имеет в виду, говоря о том, сколько slab было выделено для класса slab? Каждый класс slab должен быть уникальным, верно? почему в одном классе slab будет несколько slab? Я что-то упускаю?

Ответ №1:

Выделенный slab класса slabclass_t — это, по сути, фрагмент памяти, в котором размещается perslab количество элементов определенного размера size . Если используются все элементы в этом slab, Memcached выделяет еще один фрагмент памяти и добавляет его к slab_list . Эти фрагменты памяти также называются pages или slab_pages .

Итак, если вы запустите новый сервер Memcached и сохраните один элемент для класса slab (скажем, size = 80), то для этого класса slab slabs=1 . Как только вы сохраните perslab 1 элементы в этом классе, у вас будут slabs=2 и slab_list будут содержать 2 элемента.

В принципе, у вас есть slab_list и slabs его длина, тогда как list_size это его емкость.

Большую часть этого я заимствовал из slabs.c, так что поправьте меня, если я что-то не так понял.

Комментарии:

1. Привет, спасибо за объяснение. Я все еще не понимаю, в чем разница между страницами и slabs? Вы упомянули, что выделенный slab — это, по сути, фрагмент памяти, в котором размещается perslab количество элементов определенного размера size . Относится ли «элемент» здесь к чанку, поскольку я понимал чанк как базовые строительные блоки, которые хранят элементы в кэше? И когда вы ссылаетесь на slab, это то же самое, что slab_page или страница?

2. Извините за путаницу. Когда я писал «фрагмент памяти», я просто имел в виду часть / регион / slice памяти. Вы правы, chunks это блоки, в которых хранятся элементы. Таким образом, a slab имеет perslab блоки, каждый из которых содержит один элемент.

3. Да, как я упоминал выше, slabs также называются pages or slab_pages .