87

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

4

14 回答 14

49

你可以使用官方的 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
于 2009-03-10T19:59:11.070 回答
49

我知道这个问题很老,但这是用 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')
    

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

<32 set :1:test 0 300 10
>32 STORED
于 2011-08-08T23:18:51.157 回答
42

启动 memcache 不是作为守护进程而是正常的,所以运行memcached -vv非常冗长。您将看到 get 和 set 何时进入 memcache 服务器。

于 2009-04-09T16:35:52.587 回答
10

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

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

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

于 2009-03-18T14:47:26.873 回答
8

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

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"
于 2015-08-07T12:22:21.240 回答
6

Memcached 实际上可以自行写入日志文件,而无需手动重新启动它。/etc/init.d/memcachedinit 脚本(在EL7+ 上;呃)可以使用在(或在 EL5+ 上)/usr/lib/systemd/system/memcached.service中指定的选项调用 memcached 。这些选项包括详细程度和日志文件路径。/etc/memcached.conf/etc/sysconfig/memcached

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

-vv
logfile /path/to/log

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

然后你可以用传统的方式来监控这个日志,比如tail -f /path/to/log,例如。

于 2014-03-07T01:34:45.607 回答
6

在 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
于 2016-04-12T17:18:02.373 回答
5

对于扩展节点的响应,您可以使用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
于 2013-09-07T17:17:54.407 回答
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
于 2013-08-25T22:20:42.867 回答
1

您可以使用 curl 获取页面数百次并计算结果吗?您还可以查看在执行此操作时在服务器上运行一个模拟繁重 CPU/磁盘负载的进程。

于 2009-03-10T19:37:19.187 回答
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
于 2013-06-23T21:51:46.420 回答
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}")
于 2018-03-21T14:17:34.497 回答
0

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

于 2013-12-09T17:37:39.143 回答
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

于 2021-02-23T15:17:41.677 回答