django - framework - ¿Cómo sabes si Memcached está haciendo algo?
django redis cache (13)
¿Puedes usar Curl para buscar una página unos cientos de veces y medir el tiempo de los resultados? También podría ver ejecutar un proceso en el servidor que simule una gran carga de CPU / disco mientras hace esto.
Estoy probando usando memcached para almacenar en caché las vistas de django. ¿Cómo puedo saber si memcached está almacenando en caché algo de la línea de comandos de Linux?
Desde la línea de comando, prueba debajo del comando
echo stats | nc 127.0.0.1 11211 *
Si no devuelve nada, Memcache no se está ejecutando. De lo contrario, debería devolver un montón de estadísticas, incluido el tiempo de actividad (y conteos de aciertos y faltas)
El artículo de referencia está aquí, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/
Después de la publicación de Aryashree, esto me ayudó a obtener un error si memcached no se ejecuta localmente:
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)
En Bash, puedes verificar las estadísticas de Memcache con este comando:
exec 3<>/dev/tcp/localhost/11211; printf "stats/nquit/n" >&3; cat <&3
Para vaciar el caché, use el comando memflush
:
echo flush_all >/dev/tcp/localhost/11211
y verifica si las estadísticas aumentan
Para volcar todos los objetos en caché, use el comando memdump
(parte del paquete memcached
/ libmemcached
):
memdump --servers=localhost:11211
Si está utilizando PHP, para ver si es compatible, verifique por: php -i | grep memcached
php -i | grep memcached
.
Rastreo
Para comprobar qué proceso de memcached está procesando exactamente, puede usar los rastreadores o depuradores de red (por ejemplo, strace
en Linux o dtrace
/ dtruss
en Unix / OS X) para eso. Vea algunos ejemplos a continuación.
Strace
sudo strace -e read,write -fp $(pgrep memcached)
Para formatear la salida de una mejor manera, verifique: ¿cómo analizar strace en shell en texto plano?
Dtruss
Dtruss es un contenedor dtrace que está disponible en los sistemas Unix. Ejecútelo como:
sudo dtruss -t read -fp $(pgrep memcached)
Tcpdump
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
Escribí un script de expect
is-memcached-running
que prueba si memcached se está ejecutando en una combinación de host / puerto (ejecutar como 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
Si ejecuta su sistema desde una regla Makefile
, puede hacer que su inicio dependa de un objetivo make que afirme que está activo y en funcionamiento (o le ayuda a obtener ese estado). Es detallado cuando la comprobación no nos facilita la depuración de las ejecuciones fallidas de ci, instalamos memcached cuando falta, y es breve y va al grano de lo contrario:
#! /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
Estoy usando Mezzanine y la única respuesta que funcionó para mí fue la respuesta de Jacobs. Parando el daemon y ejecutando memcached -vv
Memcached puede escribir en un archivo de registro por sí mismo, sin tener que recurrir a reiniciarlo manualmente. El script de inicio /etc/init.d/memcached
puede llamar a memcached con las opciones especificadas en /etc/memcached.conf
. Entre estas opciones se encuentran la verbosidad y la ruta del archivo de registro.
En resumen, solo necesita agregar (o descomentar) estas dos líneas a /etc/memcached.conf
:
-vv
logfile /path/to/log
... y reinicie el daemon con el service memcached restart
o /etc/init.d/memcached restart
Y luego puede monitorear este registro de la manera tradicional, como tail -f /path/to/log
, por ejemplo.
Para ampliar la respuesta de Node, puede usar socat UNIX-CONNECT:/var/run/memcached.sock STDIN
para depurar un socket de Unix.
Ejemplo:
$ 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
Puede probar memcached o cualquier servidor mediante la secuencia de comandos siguiente
lsof -i :11211 | grep ''LISTEN''>/dev/null 2>/dev/null;echo $?
si devuelve 0, entonces el servidor se está ejecutando realmente o si 1 no es así, si desea saber que el servidor se está ejecutando realmente en algún puerto, utilice la siguiente secuencia de comandos
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
Puede usar telnet y el comando stats, por ejemplo:
# 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
Sé que esta pregunta es antigua, pero este es otro enfoque útil para probar memcached con django:
Como se menciona en @Jacob, puede iniciar memcached en modo muy detallado (no como daemon):
memcached -vv
Para probar su configuración de caché django, puede usar la api de caché de bajo nivel.
Primero, inicie el intérprete de Python y cargue la configuración de su proyecto django:
python manage.py shell
Desde el shell, puede usar la API de bajo nivel para probar su servidor Memcache:
from django.core.cache import cache cache.set(''test'', ''test value'')
Si su configuración de caché es correcta, debería ver el resultado en Memcache similar a esto:
<32 set :1:test 0 300 10
>32 STORED
Una forma simple de probar el funcionamiento de Memcache era filtrar una marca de tiempo comentada en cada página que se sirve. Si la marca de tiempo permanecía igual en varias solicitudes a una página, Memcache almacenaba la página en caché.
En la configuración de Django, también configuré el mecanismo de caché para usar un caché de archivos en el sistema de archivos (realmente lento), pero después de tocar las páginas pude ver que había archivos de caché en la ruta del archivo para poder confirmar que el caché era activo en Django.
Usé estos dos pasos para resolver mi problema de almacenamiento en caché. De hecho, no tenía el caché activado correctamente en Django. El método más nuevo para activar el almacenamiento en caché utiliza el middleware ''django.middleware.cache.CacheMiddleware'' (no el middleware con dos piezas de middleware que tienen que ser la primera / última configuración de middleware).
Inicie Memcache no como un daemon pero es normal, así que simplemente ejecute memcached -vv
para obtener mucha verbose. Verás cuando los get y los sets ingresan al servidor de memcache.