Как вы узнаете, что memcached что-то делает? - PullRequest
71 голосов
/ 10 марта 2009

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

Ответы [ 13 ]

42 голосов
/ 09 августа 2011

Я знаю, что этот вопрос старый, но вот еще один полезный подход для тестирования 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
42 голосов
/ 09 апреля 2009

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

42 голосов
/ 10 марта 2009

Вы можете использовать telnet и команду stats, например ::1001

# 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
9 голосов
/ 18 марта 2009

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

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

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

5 голосов
/ 07 марта 2014

Memcached может фактически записывать в файл журнала самостоятельно, не прибегая к его перезапуску вручную. Сценарий инициализации /etc/init.d/memcached может вызывать 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.

4 голосов
/ 07 сентября 2013

Для ответа расширенного узла вы можете использовать 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
3 голосов
/ 12 апреля 2016

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

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

Чтобы очистить кэш, используйте команду memflush:

echo flush_all >/dev/tcp/localhost/11211

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

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

memcdump --servers=localhost:11211

или

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 в оболочке в обычный текст?

Dtruss

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

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

Tcpdump

sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
3 голосов
/ 26 августа 2013

Вы можете протестировать 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 голос
/ 07 августа 2015

Из командной строки, попробуйте ниже команду

эхо-статистика | нк 127.0.0.1 11211 *

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

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

1 голос
/ 24 июня 2013

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