¿Cómo saber si memcached está haciendo algo?

80

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?

MikeN
fuente

Respuestas:

46

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.

  1. Primero, inicie el intérprete de Python y cargue la configuración de su proyecto de django:

    python manage.py shell
    
  2. 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
lettertwo
fuente
3
Además, vale la pena señalar que debe detener la instancia de Memcache que ya se está ejecutando antes de ejecutar memcached -vv. De lo contrario, tendrá dos instancias en ejecución y django seguirá configurando la caché en la primera.
Monika Sulik
Gracias por la explicación detallada, esto explica cómo verificar el caché si aún no sabe cómo funciona
Santiago Angel
Esta es la forma más rápida y confiable de probar si Memcached está funcionando. Debería ser la respuesta aceptada.
Drubio
45

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
Nodo
fuente
35
memcached-tool 127.0.0.1:11211 stats- no es necesario hacer telnet.
JMHeap
^^ Este comentario es la forma correcta de probar memcached. Utilizo esto para probar la conectividad a mis clústeres remotos memcached.
DrStrangepork
1
@JMHeap Ejecuté ese comando y mostrando algunos textos aleatorios, ¿cómo confirmamos que Memcache se está ejecutando?
shajin
9
Para cualquiera que esté luchando por encontrar memcached-tool, en ubuntu es /usr/share/memcached/scripts/memcached-tool.
Aurelijus Rozenas
También pruebe /usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock statso /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(caso de enchufe)
Hassan Baig
42

Inicie Memcache no como un demonio, sino de forma normal, así que simplemente ejecute memcached -vvpara muy detallado. Verá cuando los get y los conjuntos ingresan al servidor de Memcache.

Cwallenpoole
fuente
10

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).

MikeN
fuente
6

Memcached puede escribir en un archivo de registro por sí solo, sin tener que recurrir a reiniciarlo manualmente. El /etc/init.d/memcachedscript de inicio ( /usr/lib/systemd/system/memcached.serviceen EL7 +; ugh) puede llamar a memcached con las opciones especificadas en /etc/memcached.conf(o /etc/sysconfig/memcacheden 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.

Moufle McMitten
fuente
6

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"
Aryashree Pritikrishna
fuente
simple y claro, es genial envolverlo dentro del código Python comosubprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Evhz
5

Para extender la respuesta de Node, puede usar socat UNIX-CONNECT:/var/run/memcached.sock STDINpara 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
zulú
fuente
5

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 memflushcomando:

echo flush_all >/dev/tcp/localhost/11211

y compruebe si las estadísticas aumentaron.

Para volcar todos los objetos almacenados en caché, use memdumpor memcdumpcommand (parte de memcached/ libmemcachedpackage):

memcdump --servers=localhost:11211

o:

memdump --servers=localhost:11211

Si está usando PHP, para ver si es compatible, compruebe por: php -i | grep memcached.


Rastreo

Para comprobar qué proceso de memcached está procesando exactamente, puede utilizar rastreadores de red o depuradores (por ejemplo, straceen Linux o dtrace/ dtrussen Unix / OS X) para eso. Consulte algunos ejemplos a continuación.

Strace

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

Dtruss es un contenedor de dtrace que está disponible en sistemas Unix. Ejecútelo como:

sudo dtruss -t read -fp $(pgrep memcached)

Tcpdump

sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
Kenorb
fuente
¿Qué paquete proporciona memdump? Lo intenté yum install memdumpy fallé.
Martin
@ Martin creo que memdumpes parte de memcached(o libmemcached), a fin de tratar: yum install memcached.
Kenorb
¿te refieres a memcdump?
jobima
@jobima En algunos sistemas se puede llamar memcdump.
kenorb
3

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
Tejaswi Sharma
fuente
1

¿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.

Andrew Grant
fuente
1

Escribí un expectscript is-memcached-runningque 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 Makefileregla, 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
ecmanaut
fuente
1

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}")
Evhz
fuente
0

Estoy usando Mezzanine y la única respuesta que funcionó para mí fue la respuesta de Jacobs. Así que parando el demonio y corriendomemcached -vv

Fred
fuente
Considere comentar sobre la respuesta original o simplemente votar por la respuesta que funcionó para usted
wranvaud