web-dev-qa-db-fra.com

Comment savoir si memcached fait quelque chose?

Je teste l'utilisation de memcached pour mettre en cache Django. Comment puis-je savoir si memcached met réellement en cache quoi que ce soit à partir de la ligne de commande Linux?

72
MikeN

Un moyen simple de tester le fonctionnement de Memcache était d'introduire un horodatage commenté sur chaque page servie. Si l'horodatage est resté le même sur plusieurs demandes adressées à une page, la page a été mise en cache par memcache.

Dans les paramètres Django, j'ai également configuré le mécanisme de cache pour utiliser un cache de fichiers sur le système de fichiers (vraiment lent), mais après avoir parcouru les pages, j'ai pu voir qu'il y avait des fichiers de cache réels placés dans le chemin du fichier afin que je puisse confirmer que la mise en cache était active dans Django.

J'ai utilisé ces deux étapes pour résoudre mon problème de mise en cache. En fait, la mise en cache n'était pas correctement activée dans Django. La méthode la plus récente pour activer la mise en cache utilise le middleware 'Django.middleware.cache.CacheMiddleware' (pas le middleware avec deux pièces de middleware qui doivent être les premier/dernier paramètres de middleware.)

10
MikeN

Je sais que cette question est ancienne, mais voici une autre approche utile pour tester memcached avec Django:

Comme @Jacob l'a mentionné, vous pouvez démarrer memcached en mode très détaillé (pas en tant que démon):

memcached -vv

Pour tester votre configuration de cache Django, vous pouvez utiliser l'API de cache de bas niveau.

  1. Tout d'abord, démarrez l'interpréteur python et chargez vos paramètres de projet Django:

    python manage.py Shell
    
  2. Depuis le Shell, vous pouvez utiliser l'API de cache de bas niveau pour tester votre serveur memcache:

    from Django.core.cache import cache
    cache.set('test', 'test value')
    

Si votre configuration de cache est correcte, vous devriez voir une sortie dans memcache similaire à ceci:

<32 set :1:test 0 300 10
>32 STORED
43
lettertwo

Démarrez memcache non pas comme un démon mais normal, alors lancez simplement memcached -vv pour très verbeux. Vous verrez quand les get et les sets arrivent sur le serveur memcache.

42
Jacob

Vous pouvez utiliser telnet et la commande stats, par exemple:

# 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
42
Node

Memcached peut en fait écrire dans un fichier journal seul, sans avoir à recourir à un redémarrage manuel. Le /etc/init.d/memcached script init (/usr/lib/systemd/system/memcached.service sur EL7 +; ugh) peut appeler memcached avec les options spécifiées dans /etc/memcached.conf (ou /etc/sysconfig/memcached sur EL5 +). Parmi ces options figurent la verbosité et le chemin du fichier journal.

En bref, il vous suffit d'ajouter (ou de décommenter) ces deux lignes à ce fichier conf/sysconfig ...

-vv
logfile /path/to/log

... et redémarrez le démon avec service memcached restart (EL3-7) ou /etc/init.d/memcached restart (debuntus)

Vous pouvez ensuite surveiller ce journal de manière traditionnelle, comme tail -f /path/to/log, par exemple.

6
Moufle McMitten

Pour étendre la réponse de Node, vous pouvez utiliser socat UNIX-CONNECT:/var/run/memcached.sock STDIN pour déboguer une socket unix.

Exemple:

$ 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
4
Zulu

Vous pouvez tester memcached ou n'importe quel serveur par le script ci-dessous

lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?

s'il retourne 0 alors le serveur est réellement en cours d'exécution ou si 1 ce n'est pas le cas si vous voulez savoir que le serveur fonctionne réellement sur un port, utilisez le script suivant

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
3
Tejaswi Sharma

Dans Bash, vous pouvez vérifier les statistiques de memcache par cette commande:

exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3

Pour vider le cache, utilisez la commande memflush:

echo flush_all >/dev/tcp/localhost/11211

et vérifiez si les statistiques ont augmenté.

Pour vider tous les objets mis en cache, utilisez la commande memdump ou memcdump (partie du package memcached/libmemcached):

memcdump --servers=localhost:11211

ou:

memdump --servers=localhost:11211

Si vous utilisez PHP, pour voir s'il est pris en charge, vérifiez par: php -i | grep memcached.


Tracé

Pour vérifier quel processus memcached traite exactement, vous pouvez utiliser des renifleurs ou des débogueurs réseau (par exemple strace sous Linux ou dtrace/dtruss sous Unix/OS X) pour cela. Consultez quelques exemples ci-dessous.

Strace

Sudo strace -e read,write -fp $(pgrep memcached)

Pour mieux formater la sortie, vérifiez: Comment analyser strace dans Shell en texte brut?

Dtruss

Dtruss est un wrapper dtrace disponible sur les systèmes Unix. Exécutez-le comme:

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

Tcpdump

Sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
3
kenorb

J'ai écrit un script expectis-memcached-running qui teste si memcached s'exécute sur une combinaison hôte/port (exécuté en tant que 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 vous exécutez votre système à partir d'une règle Makefile, vous pouvez faire dépendre votre démarrage d'une cible make qui affirme qu'il est opérationnel (ou vous aide à obtenir cet état). Il est détaillé lorsque la vérification échoue pour nous faciliter le débogage des exécutions ci échouées, installe memcached lorsqu'il est manquant, et est bref et au point contraire:

#! /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
1
ecmanaut

Pouvez-vous utiliser curl pour récupérer une page plusieurs centaines de fois et chronométrer les résultats? Vous pouvez également envisager d'exécuter un processus sur le serveur qui simule une lourde charge CPU/disque en faisant cela.

1
Andrew Grant

Depuis la ligne de commande, essayez la commande ci-dessous

statistiques d'écho | nc 127.0.0.1 11211 *

S'il ne retourne rien, memcache ne fonctionne pas. Sinon, il devrait renvoyer un tas de statistiques, y compris le temps de disponibilité (et les coups sûrs et manqués)

L'article de référence est ici, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

1

J'utilise Mezzanine et la seule réponse qui a fonctionné pour moi était la réponse de Jacobs. Donc, arrêter le démon et exécuter memcached -vv

0
fred

Après la publication d'Aryashree, cela m'a aidé à obtenir une erreur si memcached ne fonctionne pas localement:

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)
0
Evhz