Як дізнатися, чи робить memcached щось?


80

Я тестую за допомогою memcached для кешування переглядів django. Як я можу зрозуміти, чи memcached насправді кешує щось із командного рядка Linux?

Відповіді:


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')
    

Якщо ваша конфігурація кешу правильна, ви побачите вихід у memcache, подібний до цього:

<32 set :1:test 0 300 10
>32 STORED

3
Також - варто зазначити, що вам потрібно зупинити вже запущений екземпляр memcache перед тим, як запустити memcached -vv В іншому випадку у вас буде запущено два екземпляри, і django все одно буде встановлювати кеш-пам’ять у першому.
Моніка Сулік

Дякую за ретельне пояснення, це пояснює, як перевірити кеш-пам’ять, якщо ви ще не знаєте, як це працює
Santiago Angel

Це швидший і найнадійніший спосіб перевірити, чи працює 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. Я використовую це, щоб перевірити підключення до моїх віддалених кластерів, що пам'ятають.
DrStrangepork

1
@JMHeap Я запустив цю команду і показав кілька випадкових текстів, як ми підтверджуємо, що memcache працює ..
shajin

9
Для тих, хто намагається знайти інструмент memcached - на 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(корпус гнізда)
Hassan Baig

42

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


10

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

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

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


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

Якщо він нічого не повертає, memcache не працює. В іншому випадку він повинен повернути купу статистичних даних, включаючи час безвідмовної роботи (і кількість вражень і промахів)

Довідкова стаття тут, 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 21.03.18

5

Для розширення відповіді 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

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/ libmemcachedпакета):

memcdump --servers=localhost:11211

або:

memdump --servers=localhost:11211

Якщо ви використовуєте PHP, щоб побачити , чи підтримується, перевірити по: php -i | grep 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

Який пакет надає 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, яка стверджує, що вона працює і працює (або допомагає отримати такий стан). Це багатослівно, коли перевірка не спрощує нам налагодження невдалих циклів, встановлює 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}")

0

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


Подумайте про те, щоб покластися на оригінальну відповідь або просто проголосувати за відповідну вам відповідь
wranvaud
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.