On Monday, October 3, 2016 at 9:17:00 PM UTC-4, Dormando wrote: > > > > On Mon, 3 Oct 2016, yuantao peng wrote: > > > Hi, -- I am reading memcached source code and got a question on this > function: do_slabs_alloc_chunked, it is called by do_slabs_alloc if the > request size is larger than > > the slabclass size. I am curious why we don't just move to a slabclass > with larger size instead? Also, I am not sure I understand the way it > calculated the number of chunks > > needed: > > That's only used if it's already at the highest slab class. It chains > multiple chunks of the highest possible class together. > > > int csize = p->size - sizeof(item_chunk); > > unsigned int chunks_req = size / csize; > > if (size % csize != 0) > > chunks_req++; > > > > > > later on, we store the first chunk in do_item_alloc as follows: > > > > if (it->it_flags & ITEM_CHUNKED) { > > item_chunk *chunk = (item_chunk *) ITEM_data(it); > > > > chunk->next = (item_chunk *) it->h_next; > > chunk->prev = 0; > > chunk->head = it; > > /* Need to chain back into the head's chunk */ > > chunk->next->prev = chunk; > > chunk->size = chunk->next->size - ((char *)chunk - (char *)it); > > chunk->used = 0; > > assert(chunk->size > 0); > > } > > > > That means the first item has an item_chunk header next to item header, > then the csize calculation is wrong, isn't it? Say if csize equals 2, > we will actually need 3 > > chunks, because the first chunk will have more meta data > (item+item_chunk), am I missing something here? > > Wish I didn't have to do that, it is pretty confusing. I can double check > but the size of the header is added and removed in the appropriate places > and it's gotten quite a lot of testing. > > That particular section you're looking at is settign the initial chunk > size to the potential size of the chunk minus the offset the current chunk > is into the overall item the header is stored into. So that should take > into account the entire rendered metadata. > > It is indeed quite confusing. :) Say if the highest slab class have size 2000 bytes, and sizeof(item) and sizeof(item_chunk) are all 40 bytes, If I call slab_alloc with ntotal=3920 bytes, since csize = p->size - sizeof(item_chunk) , csize would be 2000-40=1960, and chunks_req=3920/1960=2.
the following code in do_item_alloc will set the first chunk size to (2000-40)=1960, chunk->size = chunk->next->size - ((char *)chunk - (char *)it); but the first chunk is set to start at the location ITEM_data(it) as follows, which is after the struct item meta data, shouldn't the chunk size here is actually smaller than 1960 because item_chunk meta data of the first chunk will also consume some space? item_chunk *chunk = (item_chunk *) ITEM_data(it); > > thanks > > yuantao > > > > -- > > > > --- > > You received this message because you are subscribed to the Google > Groups "memcached" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to memcached+...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > > > > -- --- You received this message because you are subscribed to the Google Groups "memcached" group. To unsubscribe from this group and stop receiving emails from it, send an email to memcached+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.