#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
это блоки, в которых хранятся элементы. Таким образом, aslab
имеетperslab
блоки, каждый из которых содержит один элемент.3. Да, как я упоминал выше,
slabs
также называютсяpages
orslab_pages
.