Внутренности 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 | ** | +------+-----------+----------+-------------------------------------+
Используйте с удовольствием


Комментарии