Как вы узнаете, делает ли memcached что-нибудь?

Я тестирую использование memcached для кэширования представлений django. Как я могу сказать, действительно ли memcached кэширует что-либо из командной строки Linux?

13 ответов


запустите memcache не как демон, а как обычный, поэтому просто запустите memcached -vv за многословность. Вы увидите, когда get и наборы приходят на сервер memcache.


вы можете использовать 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 с django:

как упоминал @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

простой способ проверить работу memcache состоял в том, чтобы проникнуть в прокомментированную метку времени на каждой странице. Если метка времени оставалась неизменной при нескольких запросах на страницу, то страница кэшировалась memcache.

в настройках Django я также настраиваю механизм кэша для использования кэша файлов в файловой системе( очень медленно), но после нажатия на страницы я мог видеть, что в пути к файлу были размещены фактические файлы кэша, поэтому я мог подтвердить, что кэширование было активным в Джанго.

Я использовал оба этих шага, чтобы решить проблему кэширования. Я на самом деле не кэширование правильно в Django. Более новый метод активации кэширования-это использование ' django.промежуточное программное обеспечение.кэш.Промежуточное ПО CacheMiddleware (не промежуточное ПО с двумя частями промежуточного ПО, которые должны быть первыми/последними настройками промежуточного ПО.)


для ответа extend 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

Memcached может фактически писать в файл журнала самостоятельно, без необходимости прибегать к перезапуску вручную. The /etc/init.d/memcached init script может вызывать memcached с параметрами, указанными в /etc/memcached.conf. Среди этих параметров-детализация и путь к файлу журнала.

короче, вам просто нужно добавить (или раскомментировать) эти две строчки /etc/memcached.conf:

-vv
logfile /path/to/log

...и перезапустите демона с помощью service memcached restart или /etc/init.d/memcached restart

и затем вы можете контролировать этот журнал традиционным способом, как tail -f /path/to/log, например.


вы можете протестировать 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

в Bash вы можете проверить статистику memcache с помощью этой команды:

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

очистить кэш, используйте :

echo flush_all >/dev/tcp/localhost/11211

и проверьте, увеличилась ли статистика.

чтобы сбросить все кэшированные объекты, используйте (часть memcached/libmemcached пакета):

memdump --servers=localhost:11211

если вы используете PHP, чтобы узнать, поддерживается ли он, проверьте по: php -i | grep memcached.


трассировка

чтобы проверить, что memcached процесс точно обработки, вы можете использовать сетевые снифферы или отладчики (например,strace в Linux или dtrace/dtruss в Unix / OS X) для этого. Проверьте несколько примеров ниже.

Strace

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

для лучшего форматирования вывода проверьте:как разобрать strace в shell на обычный текст?

Dtruss

Dtruss-это оболочка dtrace, которая доступна в системах Unix. Запустить его as:

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

Tcpdump

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

можете ли вы использовать curl, чтобы получить страницу несколько сотен раз и время результатов? Вы также можете посмотреть на запуск процесса на сервере, который имитирует тяжелую загрузку процессора/диска при этом.


Я написал 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

из командной строки попробуйте выполнить команду

echo stats / nc 127.0.0.1 11211*

Если он ничего не возвращает, memcache не работает. В противном случае он должен вернуть кучу статистики, включая время безотказной работы (и количество попаданий и промахов)

ссылка на статью здесь, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/


Я использую мезонин, и единственным ответом, который работал для меня, был ответ Джейкобса. Итак, остановив демона и запустив memcached -vv


после сообщения 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)