web-dev-qa-db-ja.com

memcachedが何かを行っているかどうかをどのように確認しますか?

Memcachedを使用してDjangoビューをキャッシュします。memcachedが実際にLinuxコマンドラインから何かをキャッシュしているかどうかを確認するにはどうすればよいですか?

72
MikeN

Memcacheの動作をテストする簡単な方法は、提供されたページごとにコメントアウトされたタイムスタンプを忍び込ませることでした。ページへの複数のリクエストでタイムスタンプが同じままである場合、ページはmemcacheによってキャッシュされていました。

Django=設定では、ファイルシステムでファイルキャッシュを使用するようにキャッシュメカニズムも設定します(本当に遅い)が、ページにアクセスした後、実際にキャッシュファイルが配置されていることがわかりましたDjangoでキャッシュがアクティブであることを確認できるようにファイルパス。

キャッシングの問題を解決するために、これらの両方の手順を使用しました。私は実際にDjangoでキャッシュを正しくオンにしていませんでした。キャッシングをアクティブにする新​​しい方法は、「Django.middleware.cache.CacheMiddleware」ミドルウェアを使用することです(最初/最後のミドルウェア設定である必要がある2つのミドルウェア部分を含むミドルウェアではありません)。

10
MikeN

私はこの質問が古いことを知っていますが、Djangoでmemcachedをテストするための別の便利なアプローチを次に示します。

@Jacobが述べたように、memcachedは非常に詳細なモード(デーモンとしてではなく)で起動できます。

memcached -vv

Djangoキャッシュ設定をテストするには、低レベルのキャッシュAPIを使用できます。

  1. まず、pythonインタープリターを起動し、Djangoプロジェクト設定をロードします。

    python manage.py Shell
    
  2. シェルから、低レベルキャッシュAPIを使用してmemcacheサーバーをテストできます。

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

キャッシュ構成が正しい場合、memcacheに次のような出力が表示されます。

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

デーモンとしてではなく通常としてmemcacheを起動します。非常に冗長にするためにmemcached -vvを実行してください。 getおよびsetがmemcacheサーバーにいつ入るかがわかります。

42
Jacob

Telnetとstatsコマンドを使用できます(例:

# 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は、手動で再起動することなく、ログファイルに実際に書き込むことができます。 /etc/init.d/memcached initスクリプト(EL7 +では/usr/lib/systemd/system/memcached.service; ugh)は、/etc/memcached.conf(またはEL5 +では/etc/sysconfig/memcached)で指定されたオプションでmemcachedを呼び出すことができます。これらのオプションには、冗長性とログファイルパスがあります。

つまり、conf/sysconfigファイルにこれらの2行を追加(またはコメント解除)するだけです...

-vv
logfile /path/to/log

...そしてservice memcached restart(EL3-7)または/etc/init.d/memcached restart(debuntus)でデーモンを再起動します

そして、たとえばtail -f /path/to/logなどの従来の方法でこのログを監視できます。

6
Moufle McMitten

Nodeの応答を拡張するには、socat UNIX-CONNECT:/var/run/memcached.sock STDINを使用してUNIXソケットをデバッグできます。

例:

$ 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

以下のスクリプトでmemcachedまたは任意のサーバーをテストできます

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

0を返す場合、サーバーは実際に実行されています。1の場合、サーバーが実際に特定のポートで実行されていることを知りたい場合は、次のスクリプトを使用します。

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

Bashでは、次のコマンドでmemcacheの統計を確認できます。

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

キャッシュをフラッシュするには、memflushコマンドを使用します。

echo flush_all >/dev/tcp/localhost/11211

統計情報が増加したかどうかを確認します。

キャッシュされたすべてのオブジェクトをダンプするには、memdumpまたはmemcdumpコマンド(memcached/libmemcachedパッケージの一部)を使用します。

memcdump --servers=localhost:11211

または:

memdump --servers=localhost:11211

PHPを使用している場合、サポートされているかどうかを確認するには、php -i | grep memcached


トレース

どのmemcachedプロセスが正確に処理しているかを確認するには、ネットワークスニファーまたはデバッガー(たとえば、Linuxではstrace、Unix/OS Xではdtrace/dtruss)を使用できます。以下の例を確認してください。

トレース

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

出力をより良い方法でフォーマットするには、次を確認してください: Shellでstraceをプレーンテキストに解析する方法は?

ドトラス

Dtrussは、Unixシステムで利用可能なdtraceラッパーです。次のように実行します。

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

Tcpdump

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

expectスクリプトis-memcached-running memcachedがホスト/ポートの組み合わせで実行されているかどうかをテストします(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

Makefileルールからシステムを実行する場合、スタートアップが実行中であることをアサートする(またはその状態を取得するのに役立つ)makeターゲットにスタートアップを依存させることができます。チェックが失敗してciの実行を簡単にデバッグできず、memcachedが欠落している場合にインストールし、それ以外の場合は簡潔かつ重要な場合、冗長です。

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

Curlを使用してページを数百回取得し、結果の時間を計ることができますか?また、サーバー上で、CPU /ディスクの重い負荷をシミュレートするプロセスを実行することもできます。

1
Andrew Grant

コマンドラインから、以下のコマンドを試してください

エコー統計| nc 127.0.0.1 11211 *

何も返されない場合、memcacheは実行されていません。それ以外の場合は、稼働時間(およびヒットカウントとミスカウント)を含む統計の束を返す必要があります

リファレンス記事はこちら https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

私はメザニンを使用しており、私のために働いた唯一の答えはジェイコブスの答えでした。したがって、デーモンを停止してmemcached -vvを実行します

0
fred

Aryashreeの投稿に続いて、memcachedがローカルで実行されていない場合、これによりエラーが発生しました。

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