Hi, Is CAS always used? If yes, we have to always add 56 bytes to the KEY and VALUE ? you don't count FLAGS characters??
I've found that Flags's size (number of characters) impact the storage. Example: - Key : 2 characters = 2 bytes - Value : 28 characters = 28 bytes - FLAGS : 1 characters = 1 bytes => 31 bytes seems to take the same storage as - Key : 1 characters = 1 bytes - Value : 28 characters = 28 bytes - FLAGS : 2 characters = 2 bytes => 31 bytes ... wich is the limit to be stored in Slab1 ok for the /r/n ... should take 4 bytes no? So, if we count 56 bytes for CAS : 56(cas)+31(key+value+flags)+4(/r/n)= 91 Not good... :( where I'm wrong ?? Le samedi 14 novembre 2015 23:55:12 UTC+1, Dormando a écrit : > > The mysql docs don't speak for the main tree... that's their own thing. > > the "sizes" binary that comes with the source tree tells you how many > bytes an item will use (though I intend to add this output to the 'stats' > output somewhere). With CAS this is 56 bytes. > > 56 + 2 + 30 == 88. Class 1 by default (in 1.4.24) is 96 bytes, but the > item still ends up in class 2. > > Why is this? (unfortunately?) because memcached pre-renders part of the > text protocol into the item header: > > *nsuffix = (uint8_t) snprintf(suffix, 40, " %d %d\r\n", flags, nbytes - > 2); > return sizeof(item) + nkey + *nsuffix + nbytes; > > so the flags + length are getting flattened + \r\n added to the end. > Together that's just enough to push it over the edge. It'd also be nice to > add a highly optimized numerics printf so I could twiddle options to save > a few bytes of memory in objects, but don't get your hopes up for that > happening soon :) > > On Sat, 14 Nov 2015, Nicolas Martinez wrote: > > > Add: Memcached version : 1.4.4 (RedHat) > > > > Le samedi 14 novembre 2015 14:49:37 UTC+1, Nicolas Martinez a écrit : > > Hi, few days i'm reading Memcached documentation and blogs... and > i don't understand how objects are stored. > > > > My test > > > > 3 slabs : > > > > * 96.0 Bytes > > * 120.0 Bytes > > * 240.0 Bytes > > Everywhere, it's told : > > * if data is < 96 Bytes, it will be stored in Slabs1 (96B) > > * if data > 96B and < 120B, it will be stored in Slabs2 (120B) > > * if data > 120B, it will be stored in Slabs3 (240B) > > * etc. > > BUT, for example, when i'm creating an 30B object, it's stored in > Slab2 (120B), and NOT in Slab1 (96B). > > > > External sources: > > For example, the default size for the smallest block is 88 bytes > (40 bytes of value, and the default 48 bytes for the key and flag data). If > the size of the first item you store into the cache is less than 40 bytes, > then a slab with a block size of 88 bytes is created and the value stored. > > => > https://dev.mysql.com/doc/mysql-ha-scalability/en/ha-memcached-using-memory.html > > > > > > > WRONG > > > > A slab class is a collection of pages divided into same sized > chunks. Each slab class is referenced to by its chunk size. So we’ll have > Slab class 80kb, Slab class 100kb and so on. When an object needs to be > stored, its size determines where it gets stored. So if the object is > larger than 80kb but less than 100kb, it gets stored into Slab > > class 100kb. > > => > http://returnfoo.com/2012/02/memcached-memory-allocation-and-optimization-2/ > > > > > > WRONG > > > > How i create an object: > > > > data=$(pwgen 30 -c 1) > > echo -e 'set 30 0 3600 30\r\n'$data'\r'| nc ${memcached_server} > 11211 > > > > > > So, when 30B object is creating : > > * key name : 30 = 2 bytes > > * value: 30 characters = 30 bytes > > * tags : 0 = 1 bytes > > => All = 33 bytes > > If i add the default 48b as explained on Mysql website : 33 + 48 = 81B > ... so < Slab1 (91B)... but always stored in Slab2 (120B) > > > > So, the size used to store object in the good Slab is not: > > * object value size > > * sum of KEY, VALUE and TAGS in bytes > > KEY size : 1 character = 1 B > > VALUE size : 1 character = 1 B > > TAGS size : 1 character = 1 B > > > > ... as read everywhere > > > > So, It seems that: (SUM of KEY+VALUE+TAGS ) > > * For slab1 96.0 Bytes, data stored if <= 31 B (SUM of 2+28+1 ) > > * For slab2 120.0 Bytes, data stored if <= 55 B (SUM of 2+52+1 ) > > * For slab3 152.0 Bytes, data stored if <= 87 B (SUM of 2+84+1 ) > > * For slab4 192.0 Bytes, data stored if <= 126 B (SUM of 3+122+1 ) > > * For slab5 240.0 Bytes, data stored if <= 174 B (SUM of 3+170+1 ) > > * etc. > > > > My configuration : > > * Chunk Size : 48 > > * Chunk Growth Factore: 1,25 > > * Max Bytes: 64.0 MBytes > > > > So, someone could explain me how the data is stored in the right > Slabs??? > > How calculate it??? > > > > Thank you > > > > > > -- > > > > --- > > 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 [email protected] <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 [email protected]. For more options, visit https://groups.google.com/d/optout.
