장고 뷰를 캐시하기 위해 memcached를 사용하여 테스트 중입니다. memcached가 실제로 Linux 명령 줄에서 어떤 것을 캐시하고 있는지 어떻게 알 수 있습니까?
답변:
이 질문이 오래되었다는 것을 알고 있지만 여기에 django로 memcached를 테스트하는 또 다른 유용한 접근 방식이 있습니다.
@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
공식 펄 스크립트를 사용할 수 있습니다.
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 및 set가 memcache 서버에 들어올 때 볼 수 있습니다.
memcache 작업을 테스트하는 간단한 방법은 제공되는 모든 페이지에 주석 처리 된 타임 스탬프를 몰래 넣는 것입니다. 타임 스탬프가 페이지에 대한 여러 요청에서 동일하게 유지되면 페이지가 Memcache에 의해 캐시 된 것입니다.
Django 설정에서 파일 시스템에서 파일 캐시를 사용하도록 캐시 메커니즘을 설정했습니다 (정말 느림).하지만 페이지를 조회 한 후에는 파일 경로에 실제 캐시 파일이 있는지 확인할 수 있으므로 캐시가 Django에서 활성화되었습니다.
이 두 단계를 모두 사용하여 캐싱 문제를 해결했습니다. 실제로 Django에서 캐싱을 올바르게 설정하지 않았습니다. 캐싱을 활성화하는 새로운 방법은 'django.middleware.cache.CacheMiddleware'미들웨어를 사용하는 것입니다 (첫 번째 / 마지막 미들웨어 설정이어야하는 두 개의 미들웨어 조각이있는 미들웨어가 아닙니다.)
Memcached는 실제로 로그 파일을 수동으로 다시 시작하지 않고도 자체적으로 로그 파일에 쓸 수 있습니다. /etc/init.d/memcached
(init 스크립트 /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 )
확장 노드의 응답 socat UNIX-CONNECT:/var/run/memcached.sock STDIN
을 위해 유닉스 소켓을 디버그하는 데 사용할 수 있습니다 .
예:
$ 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
..
memcached 프로세스가 정확히 처리 중인지 확인하려면 네트워크 스니퍼 또는 디버거 (예 : strace
Linux 또는 dtrace
/ dtruss
Unix / OS X)를 사용할 수 있습니다. 아래에서 몇 가지 예를 확인하십시오.
sudo strace -e read,write -fp $(pgrep memcached)
더 나은 방법으로 출력 형식을 지정하려면 다음을 확인하십시오. 쉘의 strace를 일반 텍스트로 구문 분석하는 방법?
Dtruss는 Unix 시스템에서 사용할 수있는 dtrace 래퍼입니다. 다음과 같이 실행하십시오.
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
memcached가 호스트 / 포트 조합에서 실행 중인지 테스트 하는 expect
스크립트 is-memcached-running
를 작성했습니다 (으로 실행 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
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}")