Главная > Теория и практика > Внутренности Memcached от создателей твиттера

Внутренности Memcached от создателей твиттера

На memcached обычно смотрят, как на черную коробку. Но что, если нам понадобиться узнать, что происходит внутри, что-бы спланировать правильно оптимизацию и нагрузочную способность приложения.

Сущеуствует очень полезная утилита - peep. Используя ее можно получить интересную картинку:

$ sudo peep --pretty 2479
time | exptime | nbytes | clsid |                 key | exprd | flushd
8658 |  613458 |    272 |     5 |      "c3RhdH:171:5" | false |  false
8658 |       0 |      6 |     1 |  "current_c3RhdH:3" | false |  false
8658 |  613458 |    281 |     5 |     "c3RhdH:171:26" | false |  false
8678 |   95078 |      6 |     1 |  "User:1:auth:m4Uq" | false |  false
...

Peep замораживает (но не останавливает) работающий сервер memcached и делает дамп внутренних данных, затем возвращает сервер к работе. Никакие данные при этом не теряются, т.к. перезапуска сервера не происходит. Инструкция по установке peep

Аггрегируем полезные данные

Самый удобный способ манипулировать данными, которые предоставляет нам peep - это использовать параметр “–ugly” (для формирования результатов, которые можно затем засунуть в СУБД) и СУБД Mysql.

1. Создаем схему:

CREATE TABLE entries (
lru_time int(11) default NULL,
expires_at_time int(11) default NULL,
value_size int(11) default NULL,
suffix_size int(11) default NULL,
it_flag varchar(255) default NULL,
class_id int(11) default NULL,
key_size int(11) default NULL,
key_name varchar(255) default NULL,
is_expired varchar(255) default NULL,
is_flushed varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. Загружаем файл, который отдал нам peep в таблицу:

LOAD DATA LOCAL INFILE ‘/tmp/peep.txt’ INTO TABLE entries FIELDS TERMINATED BY ‘ | ‘ LINES TERMINATED BY ‘\n’;

3. После этого Вы получаете таблицу, для которой можно выполнять различные выбоки (дело только Вашей фантазии).

Некоторые полезные запросы

Свежие и протухшие значения - количество и размер

SELECT is_expired, COUNT(*), SUM(value_size) FROM entries GROUP BY is_expired;

+------------+----------+-----------------+
| is_expired | COUNT(*) | SUM(value_size) |
+------------+----------+-----------------+
|  false     |   688883 |       759401296 |
|  true      |   472755 |      2430092660 |
+------------+----------+-----------------+

Гистограмма распределения размеров данных

SELECT
ROUND(ROUND(LOG10(value_size) * 5, 0) / 5, 1) AS log,
ROUND(AVG(value_size), 0) AS size,
COUNT(*),
RPAD('', COUNT(*) / 6500, '*') AS bar
FROM entries
GROUP BY log
ORDER BY log DESC;

+------+--------+----------+----------------------------------------+
| log  | size   | COUNT(*) | bar                                    |
+------+--------+----------+----------------------------------------+
|  5.6 | 422238 |        3 |                                        |
...
|  1.6 |     39 |     3652 | *                                      |
|  1.4 |     23 |   103434 | ************************************** |
|  1.2 |     14 |     6369 | *                                      |
|  1.0 |     11 |    36588 | ******                                 |
|  0.8 |      6 |    55795 | *********                              |
|  0.6 |      4 |    90332 | **************                         |
|  0.4 |      2 |      239 |                                        |
+------+--------+----------+----------------------------------------+

Гистограмма по возрасту LRU

SELECT
ROUND(ROUND(LOG10(
(SELECT MAX(lru_time) FROM entries)
- lru_time) * 5, 0) / 5, 1) AS log,
ROUND(AVG(
(SELECT MAX(lru_time) FROM entries)
- lru_time), -2) AS lru_age,
COUNT(*),
RPAD('', COUNT(*) / 6500, '*') AS bar
FROM entries
GROUP BY log
ORDER BY log DESC;

+------+-----------+----------+-------------------------------------+
| log  |   lru_age | COUNT(*) | bar                                 |
+------+-----------+----------+-------------------------------------+
|  4.6 |     34800 |    18064 | ***                                 |
|  4.4 |     24200 |    96739 | ***************                     |
|  4.2 |     15700 |   212865 | *********************************   |
|  4.0 |     10200 |   224703 | *********************************** |
|  3.8 |      6500 |   158067 | ************************            |
|  3.6 |      4100 |   108034 | *****************                   |
...
|  0.4 |         0 |      672 |                                     |
|  0.0 |         0 |      319 |                                     |
| NULL |         0 |    13400 | **                                  |
+------+-----------+----------+-------------------------------------+

Используйте с удовольствием

Статья на английском

Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com

Статьи по теме

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.