您怎么知道memcached在做什么?


80

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

Answers:


46

我知道这个问题很旧,但这是另一种使用django测试memcached的有用方法:

如@Jacob所述,您可以在非常详细的模式下启动memcached(而不是作为守护程序):

memcached -vv

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

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

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

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

如果您的缓存配置正确,则应该在memcache中看到类似于以下内容的输出:

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

3
另外-值得注意的是,您需要在运行memcached -vv之前停止已经运行的memcache实例,否则,您将有两个实例在运行,而django仍将在第一个实例中设置缓存。
Monika Sulik 2014年

感谢您的详尽解释,这说明了如果您不知道缓存的工作原理,如何检查缓存
Santiago Angel

这是测试memcached是否正常工作的更快,最可靠的方法。应该是公认的答案。
德鲁比奥(Drubio)

45

您可以使用官方的perl脚本:

memcached-tool 127.0.0.1:11211 stats 

或者只使用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

35
memcached-tool 127.0.0.1:11211 stats-您不需要telnet。
JMHeap 2013年

^^此评论是测试memcached的正确方法。我用它来测试到远程memcached群集的连接。
DrStrangepork 2014年

1
@JMHeap我跑了命令,并呈现出一些随机的文本,我们如何确认内存缓存运行..
沙金

9
对于任何努力在ubuntu上找到memcached-tool的人来说,它是/usr/share/memcached/scripts/memcached-tool
Aurelijus Rozenas

也可以尝试/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats/usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(处理案件)
哈桑·拜格

42

启动memcache并不是将其作为守护进程,而是正常启动,因此只需memcached -vv非常详细地运行即可。您会看到get和sets何时进入内存缓存服务器。


10

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

在Django设置中,我还设置了缓存机制以在文件系统上使用文件缓存(确实很慢),但是在浏览页面后,我可以看到在文件路径中放置了实际的缓存文件,因此可以确认缓存在Django中活跃。

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


6

Memcached实际上可以自行写入日志文件,而不必诉诸手动重新启动它。的/etc/init.d/memcached初始化脚本(/usr/lib/systemd/system/memcached.service上EL7 +;啊)可以调用memcached的与指定的选项/etc/memcached.conf(或/etc/sysconfig/memcached上EL5 +)。这些选项包括详细程度和日志文件路径。

简而言之,您只需要在该conf / sysconfig文件中添加(或取消注释)这两行...

-vv
logfile /path/to/log

...并使用service memcached restart(EL3-7)或/etc/init.d/memcached restart(debuntus)重新启动守护程序

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


6

在命令行中,尝试以下命令:

echo stats | nc 127.0.0.1 11211

如果未返回任何内容,则表明内存缓存未运行。否则,它应该返回一堆统计信息,包括正常运行时间(以及命中率和未命中率)

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

要每2秒查看一次更改:

watch "echo stats | nc 127.0.0.1 11211"

简单明了,将其包装在python代码中的效果非常好subprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Evhz

5

为了扩展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

5

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

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的过程正好处理,你可以使用网络嗅探器或调试器(例如,strace在Linux或dtrace/dtruss在Unix / OS X)为。请查看以下示例。

痕迹

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

为了更好地格式化输出,请检查:如何将shell中的strace解析为纯文本?

桁架

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

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

Tcpdump

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

哪个软件包提供了memdump?我尝试了yum install memdump,但失败了。
马丁

我认为@Martinmemdumpmemcached(或libmemcached)的一部分,因此请尝试:yum install memcached
kenorb

你是说memcdump吗?
Jobima

@jobima在某些系统上可以称为memcdump
kenorb

3

您可以通过以下脚本测试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

1

您可以使用curl来获取页面几百次并获取结果时间吗?您还可以查看在服务器上运行一个进程,该进程在执行此过程时会模拟大量的CPU /磁盘负载。


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,它很简短,否则会很关键:

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

在Aryashree的帖子之后,如果memcached不在本地运行,这可以帮助我得到一个错误:

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

我使用的是Mezzanine,唯一对我有用的答案是Jacobs答案。因此停止守护程序并运行memcached -vv


考虑对原始答案进行评论,或仅对对您
有用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.