Memcached элемент накладных расходов - PullRequest
3 голосов
/ 15 ноября 2011

Кто-нибудь знает, сколько накладных расходов требуется для одного элемента?Когда я вставляю 1-байтный ключ, команда «stats» показывает, что на элемент расходуется 65 байт.

Это ожидаемое и исправленное?

Спасибо, Петр

Ответы [ 2 ]

8 голосов
/ 12 февраля 2012

Да, собственные структуры данных Memcache потребляют более 50 байт на элемент.Это немного зависит от ваших данных и ключа, поэтому предположим, что на 64-битной машине требуется более 60 байт.

Это видно при просмотре кода memcache: https://github.com/memcached/memcached/blob/master/memcached.h

Вот что делаетup элемент:

/**
 * Structure for storing items within memcached.
 */
typedef struct _stritem {
    struct _stritem *next;
    struct _stritem *prev;
    struct _stritem *h_next;    /* hash chain next */
    rel_time_t      time;       /* least recent access */
    rel_time_t      exptime;    /* expire time */
    int             nbytes;     /* size of data */
    unsigned short  refcount;
    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 */
    /* this odd type prevents type-punning issues when we do
     * the little shuffle to save space when not using CAS. */
    union {
        uint64_t cas;
        char end;
    } data[];
    /* if it_flags & ITEM_CAS we have 8 bytes CAS */
    /* then null-terminated key */
    /* then " flags length\r\n" (no terminating null) */
    /* then data with terminating \r\n (no terminating null; it's binary!) */
} item;

Есть 3 указателя, которые на 64-битной машине суммируют до 3 * 8 = 24 байта.Там есть две метки времени, которые должны быть 32-битными, поэтому они составляют в общей сложности 8 байт.следующее значение int должно быть 8 байт, короткое число должно быть 2, а u_int8 должно быть одним байтом, поэтому они составляют до 14.

Это составляет в общей сложности 46 байтов.

ЕслиCAS означает, что есть 64-битное значение CAS, которое добавляет 8 байтов: всего 54 байта

Теперь все становится запутанным: ниже приведены символьные данные, где флаги и длина данных печатаются в виде десятичных дробей (код можетможно найти в https://github.com/memcached/memcached/blob/master/items.c, строка 80).Учитывая, что флаг равен «0», ключ равен одному символу, а данные пусты, это значит:

  • 1 байт + 1 байт 0
  • 1 байт «Пробел», 1Флаг байтов "0", 1 байт "Пробел", 1 байт "0"
  • 2 Байт "\ r \ n" (перевод строки)
  • 2 Байт для данных завершения

Это еще 10 байт, то есть всего 64 байта для наименьшего возможного размера элемента кэша памяти (CAS включен, вы можете отключить его с помощью опции -C).

Если вы получите 65 байт, может быть, ваш клиент установил флаг "10" или такой.

0 голосов
/ 15 ноября 2011

Это зависит от класса элемента и может быть настроено для лучшего соответствия вашему приложению.Лучше всего хранить множество вещей и следить за скоростью кеша.Если производительность приложения снижается, вы можете настроить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...