Ich teste mit Memcached, um Django-Ansichten zwischenzuspeichern. Wie kann ich feststellen, ob memcached tatsächlich etwas von der Linux-Befehlszeile zwischenspeichert?
Antworten:
Ich weiß, dass diese Frage alt ist, aber hier ist ein weiterer nützlicher Ansatz zum Testen von Memcached mit Django:
Wie bei @Jacob erwähnt, können Sie memcached im sehr ausführlichen Modus starten (nicht als Daemon):
memcached -vv
Um Ihre Django-Cache-Konfiguration zu testen, können Sie die Low-Level-Cache-API verwenden.
Starten Sie zuerst den Python-Interpreter und laden Sie Ihre Django-Projekteinstellungen:
python manage.py shell
Über die Shell können Sie die Cache-API auf niedriger Ebene verwenden, um Ihren Memcache-Server zu testen:
from django.core.cache import cache
cache.set('test', 'test value')
Wenn Ihre Cache-Konfiguration korrekt ist, sollte die Ausgabe im Memcache ähnlich aussehen:
<32 set :1:test 0 300 10
>32 STORED
Sie können das offizielle Perl-Skript verwenden:
memcached-tool 127.0.0.1:11211 stats
Oder verwenden Sie einfach Telnet und den Befehl stats, z.
# 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
- Sie müssen nicht telnet.
/usr/share/memcached/scripts/memcached-tool
.
/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats
oder /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats
(Steckdose)
Starten Sie memcache nicht als Daemon, sondern als normal, also führen Sie es einfach memcached -vv
sehr ausführlich aus. Sie werden sehen, wann Get's und Sets auf dem Memcache-Server eingehen.
Ein einfacher Weg, um die Memcache-Funktion zu testen, bestand darin, auf jeder bereitgestellten Seite einen auskommentierten Zeitstempel einzugeben. Wenn der Zeitstempel bei mehreren Anforderungen an eine Seite gleich blieb, wurde die Seite vom Memcache zwischengespeichert.
In den Django-Einstellungen habe ich auch den Cache-Mechanismus so eingerichtet, dass ein Dateicache im Dateisystem verwendet wird (sehr langsam), aber nachdem ich die Seiten aufgerufen habe, konnte ich feststellen, dass tatsächlich Cache-Dateien im Dateipfad abgelegt wurden, um zu bestätigen, dass das Caching durchgeführt wurde aktiv in Django.
Ich habe beide Schritte verwendet, um mein Caching-Problem zu lösen. Ich hatte das Caching in Django eigentlich nicht richtig aktiviert. Die neuere Methode zum Aktivieren des Caching verwendet die Middleware 'django.middleware.cache.CacheMiddleware' (nicht die Middleware mit zwei Middleware-Teilen, bei denen es sich um die erste / letzte Middleware-Einstellung handeln muss.)
Memcached kann tatsächlich selbst in eine Protokolldatei schreiben, ohne sie manuell neu starten zu müssen. Das /etc/init.d/memcached
Init-Skript ( /usr/lib/systemd/system/memcached.service
auf EL7 +; ugh) kann memcached mit den in /etc/memcached.conf
(oder /etc/sysconfig/memcached
auf EL5 +) angegebenen Optionen aufrufen. Zu diesen Optionen gehören Ausführlichkeit und Protokolldateipfad.
Kurz gesagt, Sie müssen nur diese beiden Zeilen zu dieser conf / sysconfig-Datei hinzufügen (oder auskommentieren) ...
-vv
logfile /path/to/log
... und starten Sie den Daemon mit service memcached restart
(EL3-7) oder /etc/init.d/memcached restart
(debuntus) neu
Und dann können Sie dieses Protokoll auf herkömmliche Weise überwachen, wie tail -f /path/to/log
zum Beispiel.
Um die Antwort von Node zu erweitern, können Sie socat UNIX-CONNECT:/var/run/memcached.sock STDIN
einen Unix-Socket debuggen.
Beispiel:
$ 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
Versuchen Sie in der Befehlszeile den folgenden Befehl:
echo stats | nc 127.0.0.1 11211
Wenn nichts zurückgegeben wird, wird der Memcache nicht ausgeführt. Andernfalls sollte eine Reihe von Statistiken einschließlich der Verfügbarkeit (und der Anzahl der Treffer und Fehler) zurückgegeben werden.
Der Referenzartikel ist hier, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/
So sehen Sie alle 2 Sekunden Änderungen:
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 )
In Bash können Sie die Statistik von memcache mit diesem Befehl überprüfen:
exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3
Verwenden Sie den folgenden memflush
Befehl, um den Cache zu leeren:
echo flush_all >/dev/tcp/localhost/11211
und überprüfen Sie, ob die Statistiken erhöht wurden.
Dump alle die im Cache gespeicherten Objekte, Verwendung memdump
oder memcdump
Befehl (Teil memcached
/ libmemcached
Paket):
memcdump --servers=localhost:11211
oder:
memdump --servers=localhost:11211
Wenn Sie PHP verwenden, überprüfen Sie, ob unterstützt wird : php -i | grep memcached
.
Um zu überprüfen, welcher zwischengespeicherte Prozess genau verarbeitet wird, können Sie dafür Netzwerk-Sniffer oder -Debugger (z. B. strace
unter Linux oder dtrace
/ dtruss
unter Unix / OS X) verwenden. Überprüfen Sie einige Beispiele unten.
sudo strace -e read,write -fp $(pgrep memcached)
Um die Ausgabe besser zu formatieren , aktivieren Sie Folgendes : Analysieren Sie Strace in Shell in einfachen Text.
Dtruss ist ein Dtrace-Wrapper, der auf Unix-Systemen verfügbar ist. Führen Sie es aus als:
sudo dtruss -t read -fp $(pgrep memcached)
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
yum install memdump
und das ist fehlgeschlagen.
memdump
ist Teil von memcached
(oder libmemcached
), also versuche : yum install memcached
.
memcdump
.
Sie können memcached oder einen beliebigen Server mit dem folgenden Skript testen
lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?
Wenn 0 zurückgegeben wird, wird der Server tatsächlich ausgeführt, oder wenn 1 nicht, wenn Sie wissen möchten, dass der Server tatsächlich an einem Port ausgeführt wird, verwenden Sie das folgende Skript
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
Können Sie Curl verwenden, um eine Seite einige hundert Mal abzurufen und die Ergebnisse zeitlich abzustimmen? Sie können auch einen Prozess auf dem Server ausführen, der dabei eine hohe CPU- / Festplattenlast simuliert.
Ich habe ein expect
Skript geschrieben is-memcached-running
, das testet, ob memcached auf einer Host / Port-Kombination ausgeführt wird (ausführen als 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
Wenn Sie Ihr System nach einer Makefile
Regel ausführen , können Sie Ihren Start von einem Make-Ziel abhängig machen, das bestätigt, dass es betriebsbereit ist (oder Ihnen dabei hilft, diesen Status zu erhalten). Es ist ausführlich, wenn die Prüfung es uns nicht leicht macht, fehlgeschlagene CI-Läufe zu debuggen, Memcached installiert, wenn es fehlt, und ist kurz und auf den Punkt gebracht:
#! /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
Nach dem Beitrag von Aryashree konnte ich einen Fehler erhalten, wenn memcached nicht lokal ausgeführt wurde:
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}")
Ich benutze Mezzanine und die einzige Antwort, die für mich funktioniert hat, war Jacobs Antwort. Stoppen Sie also den Daemon und führen Sie ihn ausmemcached -vv