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

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

14 ответов

Решение

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

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

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

Вы можете использовать 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 не как демон, а как обычно, поэтому просто запустите memcached -vv для очень многословного. Вы увидите, когда get и наборы войдут на сервер memcache.

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

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

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

Справочная статья находится здесь, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

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

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

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

echo flush_all >/dev/tcp/localhost/11211

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

Чтобы сбросить все кэшированные объекты, используйте memdump команда (часть 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 в оболочке в обычный текст?

Dtruss

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

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

Tcpdump

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

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, например.

Для расширения ответа узла вы можете использовать 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 или любой сервер с помощью скрипта ниже

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

После публикации в 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)

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

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

Если вы используете 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

Другие вопросы по тегам