memcached가 어떤 일을하고 있는지 어떻게 알 수 있습니까?


80

장고 뷰를 캐시하기 위해 memcached를 사용하여 테스트 중입니다. memcached가 실제로 Linux 명령 줄에서 어떤 것을 캐시하고 있는지 어떻게 알 수 있습니까?

답변:


46

이 질문이 오래되었다는 것을 알고 있지만 여기에 django로 memcached를 테스트하는 또 다른 유용한 접근 방식이 있습니다.

@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
또한-memcached -vv를 실행하기 전에 이미 실행중인 memcache 인스턴스를 중지해야합니다. 그렇지 않으면 두 개의 인스턴스가 실행되고 django는 여전히 첫 번째 인스턴스에서 캐시를 설정합니다.
— Monika Sulik 2014

철저한 설명 주셔서 감사합니다, 이것은 당신이 이미 그것이 어떻게 작동하는지 모르는 경우 캐시를 확인하는 방법에 대해 설명합니다
— 산티아고 천사

이것은 memcached가 작동하는지 테스트하는 가장 빠르고 안정적인 방법입니다. 받아 들여진 대답이어야합니다.
— Drubio

45

공식 펄 스크립트를 사용할 수 있습니다.

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을 찾는 데 어려움을 겪는 사람에게는 /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 및 set가 memcache 서버에 들어올 때 볼 수 있습니다.


10

memcache 작업을 테스트하는 간단한 방법은 제공되는 모든 페이지에 주석 처리 된 타임 스탬프를 몰래 넣는 것입니다. 타임 스탬프가 페이지에 대한 여러 요청에서 동일하게 유지되면 페이지가 Memcache에 의해 캐시 된 것입니다.

Django 설정에서 파일 시스템에서 파일 캐시를 사용하도록 캐시 메커니즘을 설정했습니다 (정말 느림).하지만 페이지를 조회 한 후에는 파일 경로에 실제 캐시 파일이 있는지 확인할 수 있으므로 캐시가 Django에서 활성화되었습니다.

이 두 단계를 모두 사용하여 캐싱 문제를 해결했습니다. 실제로 Django에서 캐싱을 올바르게 설정하지 않았습니다. 캐싱을 활성화하는 새로운 방법은 'django.middleware.cache.CacheMiddleware'미들웨어를 사용하는 것입니다 (첫 번째 / 마지막 미들웨어 설정이어야하는 두 개의 미들웨어 조각이있는 미들웨어가 아닙니다.)


6

Memcached는 실제로 로그 파일을 수동으로 다시 시작하지 않고도 자체적으로 로그 파일에 쓸 수 있습니다. /etc/init.d/memcached(init 스크립트 /usr/lib/systemd/system/memcached.serviceEL7 +에, 우)는 지정된 옵션 memcached를 호출 할 수 있습니다 /etc/memcached.conf(또는 /etc/sysconfig/memcachedEL5 +에). 이러한 옵션에는 자세한 정보 및 로그 파일 경로가 있습니다.

간단히 말해서이 두 줄을 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"

간단하고 명확는, 그것의 중대한처럼 파이썬 코드 내부에 그것을 포장하기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을 위해 유닉스 소켓을 디버그하는 데 사용할 수 있습니다 .

예:

$ 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..


트레이싱

memcached 프로세스가 정확히 처리 중인지 확인하려면 네트워크 스니퍼 또는 디버거 (예 : straceLinux 또는 dtrace/ dtrussUnix / OS X)를 사용할 수 있습니다. 아래에서 몇 가지 예를 확인하십시오.

Strace

sudo strace -e read,write -fp $(pgrep memcached)

더 나은 방법으로 출력 형식을 지정하려면 다음을 확인하십시오. 쉘의 strace를 일반 텍스트로 구문 분석하는 방법?

드 트러스

Dtruss는 Unix 시스템에서 사용할 수있는 dtrace 래퍼입니다. 다음과 같이 실행하십시오.

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

Tcpdump

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

memdump를 제공하는 패키지는 무엇입니까? 나는 시도했지만 yum install memdump실패했습니다.
— Martin

@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을 사용하여 페이지를 수백 번 가져오고 결과 시간을 측정 할 수 있습니까? 이 작업을 수행하는 동안 과도한 CPU / 디스크로드를 시뮬레이션하는 프로세스를 서버에서 실행하는 것도 살펴볼 수 있습니다.


1

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

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

나는 Mezzanine을 사용하고 있으며 나를 위해 일한 유일한 대답은 Jacobs 대답이었습니다. 따라서 데몬을 중지하고 실행memcached -vv


원래의 대답에 comenting 또는 당신을 위해 일한 대답을 투표를 고려
— wranvaud
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.