Memcached Item Overhead

memcached kaynak koduna göre bir item için minimum 64 byte overhead var. Yani memcached her bir key-value çifti için ekstradan 64 byte daha harcıyor.

Kodda ki _stritem yapısına bakınca; herbiri 8 byte olan 3 adet pointer gözüküyor,

struct _stritem *next;
struct _stritem *prev;
struct _stritem *h_next;    /* hash chain next */

3 * 8 byte = 24 byte

Bitiş zamanı ve son erişim zamanını tutan iki adet timestamp var,

rel_time_t      time;       /* least recent access */
rel_time_t      exptime;

2 * 4 byte = 8 byte

Data'nın size bilgisi,

int             nbytes;     /* size of data */

1 * 8 byte = 8 byte

Ne kadar erişim olduğunu tutan short,

unsigned short  refcount;

1 * 2 byte = 2 byte

Sonraki flagler, bunların uzunlukları, slab class id, key uzunluğu gibi ekstra bilgiler,

uint8_t         nsuffix;    /* length of flags-and-length string */
uint8_t         it_flags;   /* ITEM_* above */
uint8_t         slabs_clsid;/* which slab class we're in */
uint8_t         nkey;       /* key length, w/terminating null and padding */

4 * 1 byte = 4 byte

-C seçeneği ile başlatmadıysanız CAS yani Compare-and-Swap seçeneği açık olacaktır.

CAS değeri için,

union {
    uint64_t cas;
    char end;
} data[];

1 * 8 byte = 8 byte

Sonrası da (https://github.com/memcached/memcached/blob/master/items.c) burada ki koda göre,

/**
* Generates the variable-sized part of the header for an object.
*
* key     - The key
* nkey    - The length of the key
* flags   - key flags
* nbytes  - Number of bytes to hold value and addition CRLF terminator
* suffix  - Buffer for the "VALUE" line suffix (flags, size).
* nsuffix - The length of the suffix is stored here.
*
* Returns the total size of the header.
*/
static size_t item_make_header(const uint8_t nkey, const int flags, const int nbytes,
                   char *suffix, uint8_t *nsuffix) {
    /* suffix is defined at 40 chars elsewhere.. */
    *nsuffix = (uint8_t) snprintf(suffix, 40, " %d %d\r\n", flags, nbytes - 2);
    return sizeof(item) + nkey + *nsuffix + nbytes;
}

" %d %d\r\n" = 6 byte + key (2 byte) ve termination datası (2 byte) ile birlikte toplamda 10 byte daha ekleniyor.

Sonuç olarak CAS enabled sistemde toplam 64 byte herbir key için overhead var. Yani minimum bir key-value çiftinin size olarak değeri 65 byte oluyor.