你怎么知道memcached是否正在做任何事情?

时间:2009-03-10 19:30:02

标签: django memcached django-cache

我正在测试使用memcached来缓存django视图。如何判断memcached是否实际缓存了Linux命令行中的任何内容?

14 个答案:

答案 0 :(得分:42)

启动memcache不是作为守护进程而是正常的,所以只需运行memcached -vv非常详细。你将会看到get和sets进入memcache服务器的时间。

答案 1 :(得分:42)

我知道这个问题已经过时了,但这是另一个用django测试memcached的有用方法:

正如@Jacob所提到的,你可以在非常详细的模式下启动memcached(而不是守护进程):

memcached -vv

要测试django缓存配置,可以使用低级缓存api。

  1. 首先,启动python解释器并加载django项目设置:

    python manage.py shell
    
  2. 从shell中,您可以使用低级缓存api来测试您的内存缓存服务器:

    from django.core.cache import cache
    cache.set('test', 'test value')
    
  3. 如果您的缓存配置正确,您应该在memcache中看到与此类似的输出:

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

答案 2 :(得分:41)

您可以使用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

答案 3 :(得分:9)

测试memcache工作的简单方法是在每个提供的页面上隐藏一个已注释的时间戳。如果时间戳在对页面的多个请求中保持不变,则该页面由memcache缓存。

在Django设置中,我还设置了缓存机制,以便在文件系统上使用文件缓存(非常慢),但在点击页面后,我可以看到实际的缓存文件放在文件路径中,所以我可以确认缓存在Django中是活跃的。

我使用这两个步骤来解决我的缓存问题。我实际上没有在Django中正确启用缓存。更新的激活缓存的方法是使用'django.middleware.cache.CacheMiddleware'中间件(不是具有两个中间件的中间件,必须是第一个/最后一个中间件设置。)

答案 4 :(得分:5)

Memcached实际上可以自己写入日志文件,而不必手动重启。 /etc/init.d/memcached init脚本可以使用/etc/memcached.conf中指定的选项调用memcached。这些选项包括详细程度和日志文件路径。

简而言之,您只需要将这两行添加(或取消注释)到/etc/memcached.conf

-vv
logfile /path/to/log

...并使用service memcached restart/etc/init.d/memcached restart

重启守护程序

然后您可以使用传统方式监控此日志,例如tail -f /path/to/log

答案 5 :(得分:4)

对于扩展节点的响应,您可以使用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

答案 6 :(得分:3)

您可以通过以下脚本

测试memcached或任何服务器
lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?

如果它返回0然后服务器实际上正在运行,或者如果你不知道服务器实际上正在某个端口上运行,则使用以下脚本

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

答案 7 :(得分:3)

在Bash中,您可以通过以下命令检查内存缓存的统计信息:

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

要刷新缓存,请使用memflush命令:

echo flush_all >/dev/tcp/localhost/11211

并检查统计数据是否增加。

要转储所有缓存的对象,请使用memdumpmemcdump命令(memcached / libmemcached包的一部分):

memcdump --servers=localhost:11211

或:

memdump --servers=localhost:11211

如果你正在使用PHP,看看是否支持,请查看:php -i | grep memcached

跟踪

要检查memcached进程正在处理什么,您可以使用网络嗅探器或调试器(例如Linux上的strace或Unix / OS X上的dtrace / dtruss)。查看下面的一些例子。

strace的

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

要更好地格式化输出,请检查:How to parse strace in shell into plain text?

Dtruss

Dtruss是一个dtrace包装器,可在Unix系统上使用。运行方式为:

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

TCPDUMP

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

答案 8 :(得分:1)

你可以使用curl来获取页面几百次并计算结果吗?您还可以在服务器上运行一个模拟CPU /磁盘负载过重的进程。

答案 9 :(得分:1)

我编写了一个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时安装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

答案 10 :(得分:1)

从命令行尝试以下命令

echo stats | nc 127.0.0.1 11211 *

如果它没有返回任何内容,则memcache不会运行。否则它应该返回一堆统计数据,包括正常运行时间(以及命中和未命中计数)

参考文章在这里, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

答案 11 :(得分:0)

我正在使用Mezzanine,唯一对我有用的答案是Jacobs回答。所以停止守护进程并运行memcached -vv

答案 12 :(得分:0)

按照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)

答案 13 :(得分:0)

如果您使用的是 RHEL 或 Centos 8 将 memcached 日志内容放到 /var/log/messages(快速无轮换)

https://serverfault.com/questions/208538/how-to-specify-the-log-file-for-memcached-on-rhel-centos/1054741#1054741