Woher wissen Sie, ob memcached etwas tut?


79

Ich teste mit Memcached, um Django-Ansichten zwischenzuspeichern. Wie kann ich feststellen, ob memcached tatsächlich etwas von der Linux-Befehlszeile zwischenspeichert?

Antworten:


46

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.

  1. Starten Sie zuerst den Python-Interpreter und laden Sie Ihre Django-Projekteinstellungen:

    python manage.py shell
    
  2. Ü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

3
Beachten Sie auch, dass Sie die bereits ausgeführte Memcache-Instanz stoppen müssen, bevor Sie memcached -vv ausführen. Andernfalls werden zwei Instanzen ausgeführt, und Django setzt den Cache weiterhin in der ersten.
Monika Sulik

Vielen Dank für die ausführliche Erklärung, dies erklärt, wie Sie den Cache überprüfen, wenn Sie noch nicht wissen, wie es funktioniert
Santiago Angel

Dies ist die schnellere und zuverlässigste Methode, um zu testen, ob memcached funktioniert. Sollte die akzeptierte Antwort sein.
Drubio

45

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

35
memcached-tool 127.0.0.1:11211 stats- Sie müssen nicht telnet.
JMHeap

^^ Dieser Kommentar ist der richtige Weg, um Memcached zu testen. Ich verwende dies, um die Konnektivität zu meinen zwischengespeicherten Remote-Clustern zu testen.
DrStrangepork

1
@ JMHeap Ich habe diesen Befehl ausgeführt und einige zufällige Texte angezeigt. Wie können wir bestätigen, dass der Memcache ausgeführt wird
?

9
Für alle, die Schwierigkeiten haben, ein Memcached-Tool zu finden - auf Ubuntu ist es das /usr/share/memcached/scripts/memcached-tool.
Aurelijus Rozenas

Versuchen Sie auch /usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock statsoder /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(Steckdose)
Hassan Baig

42

Starten Sie memcache nicht als Daemon, sondern als normal, also führen Sie es einfach memcached -vvsehr ausführlich aus. Sie werden sehen, wann Get's und Sets auf dem Memcache-Server eingehen.


10

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


6

Memcached kann tatsächlich selbst in eine Protokolldatei schreiben, ohne sie manuell neu starten zu müssen. Das /etc/init.d/memcachedInit-Skript ( /usr/lib/systemd/system/memcached.serviceauf EL7 +; ugh) kann memcached mit den in /etc/memcached.conf(oder /etc/sysconfig/memcachedauf 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/logzum Beispiel.


5

Um die Antwort von Node zu erweitern, können Sie socat UNIX-CONNECT:/var/run/memcached.sock STDINeinen 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

5

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"

einfach und klar, es ist großartig, es in Python-Code wiesubprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Evhz

4

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 memflushBefehl, 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 memdumpoder memcdumpBefehl (Teil memcached/ libmemcachedPaket):

memcdump --servers=localhost:11211

oder:

memdump --servers=localhost:11211

Wenn Sie PHP verwenden, überprüfen Sie, ob unterstützt wird : php -i | grep memcached.


Rückverfolgung

Um zu überprüfen, welcher zwischengespeicherte Prozess genau verarbeitet wird, können Sie dafür Netzwerk-Sniffer oder -Debugger (z. B. straceunter Linux oder dtrace/ dtrussunter Unix / OS X) verwenden. Überprüfen Sie einige Beispiele unten.

Strace

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

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)

Tcpdump

sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10

Welches Paket bietet memdump? Ich habe es versucht yum install memdumpund das ist fehlgeschlagen.
Martin

@ Martin Ich glaube, es memdumpist Teil von memcached(oder libmemcached), also versuche : yum install memcached.
Kenorb

meinst du memcdump?
Jobima

@jobima Auf einigen Systemen kann es aufgerufen werden memcdump.
Kenorb

3

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

1

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.


1

Ich habe ein expectSkript 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 MakefileRegel 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

1

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}")

0

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


Erwägen Sie, die ursprüngliche Antwort zu kommentieren oder nur für die Antwort zu stimmen, die für Sie funktioniert hat
wranvaud
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.