Как вы узнаете, делает ли memcached что-нибудь?
Я тестирую использование memcached для кэширования представлений django. Как я могу сказать, действительно ли memcached кэширует что-либо из командной строки Linux?
13 ответов
запустите memcache не как демон, а как обычный, поэтому просто запустите memcached -vv
за многословность. Вы увидите, когда get и наборы приходят на сервер memcache.
вы можете использовать telnet и команду stats, например:
# telnet localhost [memcacheport]
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 2239
STAT uptime 10228704
STAT time 1236714928
STAT version 1.2.3
STAT pointer_size 32
STAT rusage_user 2781.185813
STAT rusage_system 2187.764726
STAT curr_items 598669
STAT total_items 31363235
STAT bytes 37540884
STAT curr_connections 131
STAT total_connections 8666
STAT connection_structures 267
STAT cmd_get 27
STAT cmd_set 30694598
STAT get_hits 16
STAT get_misses 11
STAT evictions 0
STAT bytes_read 2346004016
STAT bytes_written 388732988
STAT limit_maxbytes 268435456
STAT threads 4
END
Я знаю, что этот вопрос старый, но вот еще один полезный подход для тестирования memcached с django:
как упоминал @Jacob, вы можете запустить memcached в очень подробном режиме (не как демон):
memcached -vv
чтобы проверить конфигурацию кэша django, вы можете использовать низкоуровневый api кэша.
-
во-первых, запустите интерпретатор python и загрузите настройки проекта django:
python manage.py shell
-
из оболочки вы можете использовать низкоуровневый api кэша для тестирования сервера memcache:
from django.core.cache import cache cache.set('test', 'test value')
если ваша конфигурация кэша верна, вы должны увидеть вывод в memcache, подобный этому:
<32 set :1:test 0 300 10
>32 STORED
простой способ проверить работу memcache состоял в том, чтобы проникнуть в прокомментированную метку времени на каждой странице. Если метка времени оставалась неизменной при нескольких запросах на страницу, то страница кэшировалась memcache.
в настройках Django я также настраиваю механизм кэша для использования кэша файлов в файловой системе( очень медленно), но после нажатия на страницы я мог видеть, что в пути к файлу были размещены фактические файлы кэша, поэтому я мог подтвердить, что кэширование было активным в Джанго.
Я использовал оба этих шага, чтобы решить проблему кэширования. Я на самом деле не кэширование правильно в Django. Более новый метод активации кэширования-это использование ' django.промежуточное программное обеспечение.кэш.Промежуточное ПО CacheMiddleware (не промежуточное ПО с двумя частями промежуточного ПО, которые должны быть первыми/последними настройками промежуточного ПО.)
для ответа extend Node вы можете использовать socat UNIX-CONNECT:/var/run/memcached.sock STDIN
для отладки сокета unix.
пример:
$ socat UNIX-CONNECT:/var/run/memcached.sock STDIN
stats
STAT pid 931
STAT uptime 10
STAT time 1378574384
STAT version 1.4.13
STAT libevent 2.0.19-stable
STAT pointer_size 32
STAT rusage_user 0.000000
STAT rusage_system 0.015625
STAT curr_connections 1
STAT total_connections 2
STAT connection_structures 2
Memcached может фактически писать в файл журнала самостоятельно, без необходимости прибегать к перезапуску вручную. The /etc/init.d/memcached
init script может вызывать memcached с параметрами, указанными в /etc/memcached.conf
. Среди этих параметров-детализация и путь к файлу журнала.
короче, вам просто нужно добавить (или раскомментировать) эти две строчки /etc/memcached.conf
:
-vv
logfile /path/to/log
...и перезапустите демона с помощью service memcached restart
или /etc/init.d/memcached restart
и затем вы можете контролировать этот журнал традиционным способом, как tail -f /path/to/log
, например.
вы можете протестировать memcached или любой сервер с помощью скрипта
lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?
если он возвращает 0, то сервер фактически работает или если 1 его не так, если вы хотите знать, что сервер фактически работает на каком-то порту, используйте следующий скрипт
lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;
if [ $? -eq 0]; then
echo "Your memcache server is running"
else
echo "No its not running"
fi
в Bash вы можете проверить статистику memcache с помощью этой команды:
exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3
очистить кэш, используйте :
echo flush_all >/dev/tcp/localhost/11211
и проверьте, увеличилась ли статистика.
чтобы сбросить все кэшированные объекты, используйте (часть memcached
/libmemcached
пакета):
memdump --servers=localhost:11211
если вы используете PHP, чтобы узнать, поддерживается ли он, проверьте по: php -i | grep memcached
.
трассировка
чтобы проверить, что memcached процесс точно обработки, вы можете использовать сетевые снифферы или отладчики (например,strace
в Linux или dtrace
/dtruss
в Unix / OS X) для этого. Проверьте несколько примеров ниже.
Strace
sudo strace -e read,write -fp $(pgrep memcached)
для лучшего форматирования вывода проверьте:как разобрать strace в shell на обычный текст?
Dtruss
Dtruss-это оболочка dtrace, которая доступна в системах Unix. Запустить его as:
sudo dtruss -t read -fp $(pgrep memcached)
Tcpdump
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
можете ли вы использовать curl, чтобы получить страницу несколько сотен раз и время результатов? Вы также можете посмотреть на запуск процесса на сервере, который имитирует тяжелую загрузку процессора/диска при этом.
Я написал expect
скрипт is-memcached-running
это проверяет, работает ли memcached на комбинации хост / порт (запустите как is-memcached-running localhost 11211
):
#! /usr/bin/env expect
set timeout 1
set ip [lindex $argv 0]
set port [lindex $argv 1]
spawn telnet $ip $port
expect "Escape character is '^]'."
send stats\r
expect "END"
send quit\r
expect eof
если вы запустите свою систему из Makefile
правило, вы можете сделать свой запуск зависящим от цели make, которая утверждает, что она запущена (или помогает вам получить это состояние). Это многословно, когда проверка не позволяет нам легко отлаживать неудачные запуски ci, устанавливает memcached, когда он отсутствует, и кратко и до точки в противном случае:
#! /bin/bash
if [[ "$(type -P memcached)" ]]; then
echo 'memcached installed; checking if it is running'
memcached_debug=`mktemp memcache-check.XXXXX`
if is-memcached-running localhost 11211 >$memcached_debug 2>&1; then
echo 'Yep; memcached online'
else
cat $memcached_debug
echo
echo '****** Error: memcached is not running! ******'
if [[ "$OSTYPE" =~ ^darwin ]]; then
echo
echo 'Instructions to auto-spawn on login (or just start now) are shown'
echo 'at the end of a "brew install memcached" run (try now, if you did'
echo 'not do so already) or, if you did, after a "brew info memcached".'
echo
fi
exit 1
fi
rm -f $memcached_debug
else
echo memcached was not found on your system.
if [[ "$OSTYPE" =~ ^darwin ]]; then
brew install memcached
elif [[ "$OSTYPE" =~ ^linux ]]; then
sudo apt-get install memcached
else
exit 1
fi
fi
из командной строки попробуйте выполнить команду
echo stats / nc 127.0.0.1 11211*
Если он ничего не возвращает, memcache не работает. В противном случае он должен вернуть кучу статистики, включая время безотказной работы (и количество попаданий и промахов)
ссылка на статью здесь, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/
Я использую мезонин, и единственным ответом, который работал для меня, был ответ Джейкобса. Итак, остановив демона и запустив memcached -vv
после сообщения Aryashree это помогло мне получить ошибку, если memcached не работает локально:
import subprocess
port=11211
res=subprocess.Popen('echo stats | nc 127.0.0.1 %d' % (port), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
if res.stdout:
lines=res.stdout.read()
lineArr=lines.split('\r\n')
pidlineArr=lineArr[0].split(' ')
pid=pidlineArr[len(pidlineArr)-1]
print("[MemCached] pid %s Running on port %d" % (pid, port))
else:
raise RuntimeError("No Memcached is present on port %d" % port)