Estoy probando el uso de memcached para almacenar en caché las vistas de django. ¿Cómo puedo saber si Memcached está almacenando en caché algo desde la línea de comandos de Linux?
Respuestas:
Sé que esta pregunta es antigua, pero aquí hay otro enfoque útil para probar memcached con django:
Como mencionó @Jacob, puede iniciar memcached en modo muy detallado (no como un demonio):
memcached -vv
Para probar su configuración de caché de 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 de django:
python manage.py shell
Desde el shell, puede usar la API de caché 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 un resultado en Memcache similar a este:
<32 set :1:test 0 300 10
>32 STORED
Puede usar el script oficial de Perl:
memcached-tool 127.0.0.1:11211 stats
O simplemente use 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
memcached-tool 127.0.0.1:11211 stats
- no es necesario hacer telnet.
/usr/share/memcached/scripts/memcached-tool
.
/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats
o /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats
(caso de enchufe)
Inicie Memcache no como un demonio, sino de forma normal, así que simplemente ejecute memcached -vv
para muy detallado. Verá cuando los get y los conjuntos ingresan al servidor de Memcache.
Una forma sencilla de probar el funcionamiento de Memcache era introducir una marca de tiempo comentada en cada página servida. Si la marca de tiempo se mantuvo igual en varias solicitudes a una página, Memcache estaba almacenando 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 acceder a las páginas, pude ver que se estaban colocando archivos de caché reales en la ruta del archivo para poder confirmar que el almacenamiento en caché era activo en Django.
Usé estos dos pasos para resolver mi problema de almacenamiento en caché. De hecho, no tenía el almacenamiento en caché activado correctamente en Django. El método más nuevo para activar el almacenamiento en caché es usar el middleware 'django.middleware.cache.CacheMiddleware' (no el middleware con dos piezas de middleware que deben ser la primera / última configuración de middleware).
Memcached puede escribir en un archivo de registro por sí solo, sin tener que recurrir a reiniciarlo manualmente. El /etc/init.d/memcached
script de inicio ( /usr/lib/systemd/system/memcached.service
en EL7 +; ugh) puede llamar a memcached con las opciones especificadas en /etc/memcached.conf
(o /etc/sysconfig/memcached
en EL5 +). 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 ese archivo conf / sysconfig ...
-vv
logfile /path/to/log
... y reinicia el demonio con service memcached restart
(EL3-7) o /etc/init.d/memcached restart
(debuntus)
Y luego puede monitorear este registro de la manera tradicional, como tail -f /path/to/log
, por ejemplo.
Desde la línea de comando, pruebe el siguiente 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 recuentos de aciertos y errores)
El artículo de referencia está aquí, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/
Para ver cambios cada 2 segundos:
watch "echo stats | nc 127.0.0.1 11211"
subprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Para extender la respuesta de Node, puede usar socat UNIX-CONNECT:/var/run/memcached.sock STDIN
para depurar un socket 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
En Bash, puede verificar las estadísticas de Memcache con este comando:
exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3
Para vaciar la caché, use el memflush
comando:
echo flush_all >/dev/tcp/localhost/11211
y compruebe si las estadísticas aumentaron.
Para volcar todos los objetos almacenados en caché, use memdump
or memcdump
command (parte de memcached
/ libmemcached
package):
memcdump --servers=localhost:11211
o:
memdump --servers=localhost:11211
Si está usando PHP, para ver si es compatible, compruebe por: php -i | grep memcached
.
Para comprobar qué proceso de memcached está procesando exactamente, puede utilizar rastreadores de red o depuradores (por ejemplo, strace
en Linux o dtrace
/ dtruss
en Unix / OS X) para eso. Consulte algunos ejemplos a continuación.
sudo strace -e read,write -fp $(pgrep memcached)
Para formatear la salida de una mejor manera, consulte: ¿Cómo analizar strace en shell en texto sin formato?
Dtruss es un contenedor de dtrace que está disponible en sistemas Unix. Ejecútelo como:
sudo dtruss -t read -fp $(pgrep memcached)
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
yum install memdump
y fallé.
memdump
es parte de memcached
(o libmemcached
), a fin de tratar: yum install memcached
.
memcdump
.
Puede probar Memcached o cualquier servidor mediante el siguiente script
lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?
si devuelve 0, entonces el servidor realmente se está ejecutando o si 1 no es así si desea saber que el servidor realmente se está ejecutando en algún puerto, use el siguiente script
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
¿Puedes usar curl para buscar una página unos cientos de veces y cronometrar los resultados? También puede considerar ejecutar un proceso en el servidor que simule una gran carga de CPU / disco mientras hace esto.
Escribí un expect
script 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 Makefile
regla, puede hacer que su inicio dependa de un objetivo de marca que afirma que está en funcionamiento (o lo ayuda a obtener ese estado). Es detallado cuando la verificación no nos facilita la depuración de ejecuciones de ci fallidas, instala 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
Siguiendo 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(f"echo stats | nc 127.0.0.1 {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[-1]
print(f"[MemCached] pid {pid} Running on port {port}")
else:
raise RuntimeError(f"No Memcached is present on port {port}")