Как стать автором
Обновить

Простой дополнительный контроль состояния данных memcached

Время на прочтение2 мин
Количество просмотров4.9K
image Мониторинг memcached — дело далеко не последней важности. Как на этапе тестирования, так и на этапе сопровождения уже работающего нагруженного ресурса. Средств «из коробки» для этого не так уж и много, а если вы работает с PHP, то зачастую ограничиваетесь средствами memcache (или memcached), а именно

Memcache::getStats()

$memcache = new Memcache;
$memcache->connect('localhost',11211);
print_r($memcache->getStats());


что возвращает типичный набор данных

Array ( [pid] => 25722 [uptime] => 4487286 [time] => 1308323074 [version] => 1.2.2 [pointer_size] => 64 [rusage_user] => 2646.005365 [rusage_system] => 17108.873237 [curr_items] => 37761 [total_items] => 10764857 [bytes] => 140070186 [curr_connections] => 5 [total_connections] => 17360659 [connection_structures] => 31 [cmd_get] => 89154830 [cmd_set] => 10764857 [get_hits] => 83452021 [get_misses] => 5702809 [evictions] => 0 [bytes_read] => 3527860756618 [bytes_written] => 4234517241183 [limit_maxbytes] => 2147483648 [threads] => 1 )

Вроде всё хорошо.
Мы видим, что у нас занято 133,5 Mb из 2 Gb выделенных под memcached и около 37 тыс. ключей.
Hits к misses относиться как 83/5, что тоже не внушает опасений.


Но! То что мы видим, это не есть то, что нам нужно! (Ну или по крайней мере было нужно мне). Ведь среди этих ключей есть и те, которые устарели. И, забегая чуть вперед, скажу, что их даже больше, чем «живых» значений, и обычно раз в 10 (если конечно жаба не задушила вас выделить предельно достаточное кол-во памяти). Ибо сборщик мусора убивает устаревшие (или не устаревшие) ключи по 2-м причинам:
1) Кончилась свободная память. (тут и актуальные могут улететь)
2) Данные были запрошены и оказались expired.

Выход для этого есть, и он прост до безобразия — периодически опрашивать все ключи.
PHP для этого — не лучший вариант. Хотелось чего то «ближе к телу».
Решено. Пишем на bash/sh и ставим на cron. В моем случае достаточно 1 запуска в конце основного «нагруженного» времени (у нас это около 21-30 мск).

В качестве сервера — вполне попсовый Debian Lenny.

Итак, нам нужен libmemcached, его memdump (вывод полного списка ключей) и memccat (запрос на данные по ключю), bash/sh, и пара минут…

#!/bin/sh
cd /usr/local/src/libmemcached-0.49/clients

./memdump --servers=127.0.0.1 >/home/memdump.dat

while read i; do

memccat $i --servers=127.0.0.1 >/dev/null 2>&1

done </home/memdump.dat

#-----------------------------------------
#это всё на крон, по желанию
#
#для небольшого кол-ва ключей на 1 инстанс можно обойтись и без промежуточного файла.
#для большого будет ошибка обработки too long....


Особенно удобно видеть реальное количество «живых» сессий, которые у нас тоже лежат в мемкеше.

Остается добавить: на рабочем сервере раз в день убивает около 850-1000 Mb данных ключей (из 2Гб выделенных) и у меня почти всегда есть реальные данные о состоянии memcached.
Теги:
Хабы:
+20
Комментарии23

Публикации