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

80

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

MikeN
источник

Ответы:

46

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

Если ваша конфигурация кеша верна, вы должны увидеть вывод в кэше памяти, подобный этому:

<32 set :1:test 0 300 10
>32 STORED
буква два
источник
3
Также - стоит отметить, что вам нужно остановить уже запущенный экземпляр memcache перед запуском memcached -vv. В противном случае у вас будут запущены два экземпляра, а django по-прежнему будет устанавливать кеш в первом.
Моника Сулик
Спасибо за подробное объяснение, это объясняет, как проверить кеш, если вы еще не знаете, как он работает
Сантьяго Энджел
Это самый быстрый и надежный способ проверить, работает ли memcached. Должен быть принятый ответ.
Друбио
45

Вы можете использовать официальный сценарий 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
Узел
источник
35
memcached-tool 127.0.0.1:11211 stats- Телнет не нужен.
JMHeap
^^ Этот комментарий - правильный способ протестировать memcached. Я использую это для проверки возможности подключения к моим удаленным кластерам memcached.
DrStrangepork
1
@JMHeap Я выполнил эту команду и показал несколько случайных текстов, как мы можем подтвердить, что memcache запущен ..
Shajin
9
Всем, кто пытается найти memcached-tool - на ubuntu это /usr/share/memcached/scripts/memcached-tool.
Aurelijus Rozenas
Также попробуйте /usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock statsили /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(корпус гнезда)
Хассан Бэйг
42

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

Cwallenpoole
источник
10

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

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

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

MikeN
источник
6

Memcached может самостоятельно записывать в файл журнала, не прибегая к перезапуску вручную. Сценарий /etc/init.d/memcachedинициализации ( /usr/lib/systemd/system/memcached.serviceна EL7 +; тьфу) может вызывать memcached с параметрами, указанными в /etc/memcached.conf(или /etc/sysconfig/memcachedна EL5 +). Среди этих параметров - подробность и путь к файлу журнала.

Короче говоря, вам просто нужно добавить (или раскомментировать) эти две строки в файл conf / sysconfig ...

-vv
logfile /path/to/log

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

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

Муфл МакМиттен
источник
6

В командной строке попробуйте выполнить следующую команду:

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 )
Evhz
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
Зулусский
источник
5

В 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/ libmemcachedpackage):

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
Kenorb
источник
Какой пакет предоставляет memdump? Я попробовал yum install memdump, но ничего не вышло.
Мартин
@Martin я считаю , memdumpявляется частью memcached(или libmemcached), так что попробуйте: yum install memcached.
kenorb
ты имеешь ввиду memcdump?
jobima
@jobima На некоторых системах это может быть вызвано memcdump.
kenorb
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
Теджасви Шарма
источник
1

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

Эндрю Грант
источник
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
экманавт
источник
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}")
Evhz
источник
0

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

Фред
источник
Вы можете прокомментировать исходный ответ или просто проголосовать за тот ответ, который сработал для вас
wranvaud