Я тестую за допомогою memcached для кешування переглядів django. Як я можу зрозуміти, чи memcached насправді кешує щось із командного рядка Linux?
Відповіді:
Я знаю, що це питання давнє, але ось ще один корисний підхід для тестування memcached за допомогою django:
Як згадував @Jacob, ви можете розпочати memcached у дуже багатослівному режимі (не як демон):
memcached -vv
Щоб протестувати конфігурацію кешу django, ви можете використовувати API низького рівня кешу.
Спочатку запустіть інтерпретатор python і завантажте налаштування проекту django:
python manage.py shell
З оболонки ви можете використовувати API низького рівня кеш-пам’яті для тестування вашого сервера memcache:
from django.core.cache import cache
cache.set('test', 'test value')
Якщо ваша конфігурація кешу правильна, ви побачите вихід у memcache, подібний до цього:
<32 set :1:test 0 300 10
>32 STORED
Ви можете використовувати офіційний скрипт 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
memcached-tool 127.0.0.1:11211 stats
- вам не потрібно телефонувати.
/usr/share/memcached/scripts/memcached-tool
.
/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats
або /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats
(корпус гнізда)
Запустіть memcache не як демон, а звичайно, тому просто запускайте memcached -vv
дуже детально. Ви побачите, коли get та набори надходять на сервер memcache.
Найпростіший спосіб перевірити роботу memcache - це прописати відмічену мітку часу на кожній поданій сторінці. Якщо мітка часу залишалася незмінною для декількох запитів на сторінку, то сторінка кешувалася memcache.
У налаштуваннях Django я також налаштовую механізм кешування для використання кеш-файлу у файловій системі (дійсно повільно), але після натискання сторінок я бачив, що фактичні файли кешу розміщуються у шляху до файлу, щоб я міг підтвердити, що кешування було активний у Джанго.
Я використав обидва ці кроки, щоб вирішити свою проблему кешування. Насправді у мене не було правильно ввімкнено кешування в Django. Новіший метод активації кешування - використання проміжного програмного забезпечення django.middleware.cache.CacheMiddleware (а не проміжного програмного забезпечення з двома елементами проміжного програмного забезпечення, які мають бути першим / останнім налаштуванням проміжного програмного забезпечення.)
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
, наприклад,.
У командному рядку спробуйте команду нижче:
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"
subprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Для розширення відповіді 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
У 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). Перегляньте кілька прикладів нижче.
sudo strace -e read,write -fp $(pgrep memcached)
Щоб краще форматувати вихід, поставте прапорець: Як проаналізувати strace в оболонці на звичайний текст?
Dtruss - це обгортка dtrace, яка доступна в системах Unix. Запустіть його як:
sudo dtruss -t read -fp $(pgrep memcached)
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
yum install memdump
але це не вдалося.
memdump
є частиною memcached
(або libmemcached
), так що спробуйте: yum install memcached
.
memcdump
.
Ви можете протестувати 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
Чи можете ви використовувати 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, яка стверджує, що вона працює і працює (або допомагає отримати такий стан). Це багатослівно, коли перевірка не спрощує нам налагодження невдалих циклів, встановлює 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
Після публікації в 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}")