【问题标题】:How do you know if memcached is doing anything?你怎么知道 memcached 是否在做任何事情?
【发布时间】:2010-10-12 12:38:33
【问题描述】:

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

【问题讨论】:

    标签: django memcached django-cache


    【解决方案1】:

    我知道这个问题很老了,但这里有另一种用 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
    

    【讨论】:

    • 另外——值得注意的是,在运行 memcached -vv 之前,您需要停止已经运行的 memcache 实例,否则您将有两个实例正在运行,而 django 仍将在第一个中设置缓存。跨度>
    • 感谢您的详尽解释,如果您还不知道缓存是如何工作的,这说明了如何检查缓存
    • 这是测试 memcached 是否正常工作的更快、最可靠的方法。应该是公认的答案。
    【解决方案2】:

    你可以使用官方的 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
    

    【讨论】:

    • memcached-tool 127.0.0.1:11211 stats - 你不需要远程登录。
    • ^^ 这个注释是测试 memcached 的正确方法。我用它来测试与我的远程 memcached 集群的连接。
    • @JMHeap 我运行了该命令并显示了一些随机文本,我们如何确认 memcache 正在运行..
    • 致所有努力寻找 memcached-tool 的人 - 在 ubuntu 上是 /usr/share/memcached/scripts/memcached-tool
    • 也可以试试/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats/usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(插座盒)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        从命令行,尝试以下命令:

        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 )
        【解决方案6】:

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

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

        -vv
        logfile /path/to/log
        

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            在 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 进程到底在处理什么,您可以使用网络嗅探器或调试器(例如,Linux 上的 strace 或 Unix/OS X 上的 dtrace/dtruss)。查看下面的一些示例。

            追踪

            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
            

            【讨论】:

            • 哪个包提供memdump?我试过yum install memdump,但失败了。
            • @Martin 我相信memdumpmemcached(或libmemcached)的一部分,所以试试:yum install memcached
            • 你是说 memcdump 吗?
            • @jobima 在某些系统上可以称为memcdump
            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                我写了一个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
                

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                    • 考虑对原始答案发表评论,或者只是为适合您的答案投票
                    【解决方案14】:

                    如果您使用的是 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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-11-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-11-18
                      • 2015-05-14
                      • 2011-11-05
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多