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?
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.)
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.
Tout d'abord, démarrez l'interpréteur python et chargez vos paramètres de projet Django:
python manage.py Shell
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
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.
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
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.
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
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
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
.
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.
Sudo strace -e read,write -fp $(pgrep memcached)
Pour mieux formater la sortie, vérifiez: Comment analyser strace dans Shell en texte brut?
Dtruss est un wrapper dtrace disponible sur les systèmes Unix. Exécutez-le comme:
Sudo dtruss -t read -fp $(pgrep memcached)
Sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
J'ai écrit un script expect
is-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
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.
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/
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
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)