Làm thế nào để bạn biết nếu memcached đang làm bất cứ điều gì?


79

Tôi đang thử nghiệm bằng cách sử dụng memcached để lưu vào bộ nhớ cache các chế độ xem django. Làm cách nào để biết memcached có thực sự đang lưu vào bộ nhớ đệm bất kỳ thứ gì từ dòng lệnh Linux hay không?

Câu trả lời:


46

Tôi biết câu hỏi này đã cũ, nhưng đây là một cách tiếp cận hữu ích khác để kiểm tra memcached với django:

Như @Jacob đã đề cập, bạn có thể bắt đầu memcached ở chế độ rất dài dòng (không phải dưới dạng daemon):

memcached -vv

Để kiểm tra cấu hình bộ đệm django của bạn, bạn có thể sử dụng api bộ đệm cấp thấp.

  1. Đầu tiên, khởi động trình thông dịch python và tải cài đặt dự án django của bạn:

    python manage.py shell
    
  2. Từ shell, bạn có thể sử dụng api bộ nhớ cache cấp thấp để kiểm tra máy chủ memcache của mình:

    from django.core.cache import cache
    cache.set('test', 'test value')
    

Nếu cấu hình bộ nhớ cache của bạn chính xác, bạn sẽ thấy đầu ra trong bộ nhớ cache tương tự như sau:

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

3
Ngoài ra - cần lưu ý rằng bạn cần dừng phiên bản memcache đang chạy trước khi chạy memcached -vv Nếu không, bạn sẽ có hai phiên bản đang chạy và django sẽ vẫn thiết lập bộ đệm trong phiên bản đầu tiên.
Monika Sulik

Cảm ơn lời giải thích thấu đáo, điều này giải thích làm thế nào để kiểm tra bộ nhớ cache nếu bạn chưa biết làm thế nào nó hoạt động
Santiago Thiên thần

Đây là cách nhanh hơn và đáng tin cậy nhất để kiểm tra xem memcached có hoạt động hay không. Nên là câu trả lời được chấp nhận.
Drubio

45

Bạn có thể sử dụng tập lệnh perl chính thức:

memcached-tool 127.0.0.1:11211 stats 

Hoặc chỉ sử dụng telnet và lệnh thống kê, ví dụ:

# 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- bạn không cần phải telnet.
JMHeap

^^ Nhận xét này là cách chính xác để kiểm tra memcached. Tôi sử dụng điều này để kiểm tra kết nối với các cụm bộ nhớ đệm từ xa của mình.
DrStrangepork

1
@JMHeap Tôi chạy lệnh đó và hiển thị một số văn bản ngẫu, làm thế nào để chúng tôi xác nhận rằng memcache đang chạy ..
shajin

9
Đối với bất kỳ ai đang gặp khó khăn trong việc tìm kiếm công cụ memcached - trên ubuntu đó là công cụ /usr/share/memcached/scripts/memcached-tool.
Aurelijus Rozenas,

Cũng thử /usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock statshoặc /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats(hộp đựng ổ cắm)
Hassan Baig

42

Khởi động memcache không phải dưới dạng daemon mà là bình thường, vì vậy chỉ cần chạy memcached -vvrất dài dòng. Bạn sẽ thấy khi nào get và set được đưa vào máy chủ memcache.


10

Cách đơn giản để kiểm tra khả năng hoạt động của memcache là lén xem dấu thời gian đã nhận xét trên mỗi trang được cung cấp. Nếu dấu thời gian được giữ nguyên trên nhiều yêu cầu đối với một trang, thì trang đó đang được lưu vào bộ nhớ đệm bởi memcache.

Trong cài đặt Django, tôi cũng thiết lập cơ chế bộ đệm để sử dụng bộ đệm tệp trên hệ thống tệp (thực sự chậm), nhưng sau khi truy cập các trang, tôi có thể thấy rằng có các tệp bộ nhớ cache thực được đặt trong đường dẫn tệp nên tôi có thể xác nhận bộ nhớ đệm là hoạt động ở Django.

Tôi đã sử dụng cả hai bước này để giải quyết vấn đề bộ nhớ đệm của mình. Tôi thực sự không bật bộ nhớ đệm chính xác trong Django. Phương pháp mới hơn để kích hoạt bộ nhớ đệm là sử dụng phần mềm trung gian 'django.middleware.cache.CacheMiddleware' (không phải phần mềm trung gian có hai phần mềm trung gian phải là cài đặt phần mềm trung gian đầu tiên / cuối cùng.)


6

Memcached thực sự có thể tự ghi vào logfile mà không cần phải khởi động lại theo cách thủ công. Tập /etc/init.d/memcachedlệnh init ( /usr/lib/systemd/system/memcached.servicetrên EL7 +; ugh) có thể gọi memcached với các tùy chọn được chỉ định trong /etc/memcached.conf(hoặc /etc/sysconfig/memcachedtrên EL5 +). Trong số các tùy chọn này có độ dài và đường dẫn tệp nhật ký.

Tóm lại, bạn chỉ cần thêm (hoặc bỏ ghi chú) hai dòng này vào tệp conf / sysconfig đó ...

-vv
logfile /path/to/log

... và khởi động lại daemon bằng service memcached restart(EL3-7) hoặc /etc/init.d/memcached restart(debuntus)

Và sau đó, bạn có thể theo dõi nhật ký này theo cách truyền thống, chẳng tail -f /path/to/loghạn như.


5

Để mở rộng phản hồi của Node, bạn có thể sử dụng socat UNIX-CONNECT:/var/run/memcached.sock STDINđể gỡ lỗi một ổ cắm unix.

Thí dụ:

$ 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

Từ dòng lệnh, hãy thử lệnh dưới đây:

echo stats | nc 127.0.0.1 11211

Nếu nó không trả về bất cứ điều gì, memcache không chạy. Nếu không, nó sẽ trả về một loạt các số liệu thống kê bao gồm thời gian hoạt động (và số lần đánh và trượt)

Bài viết tham khảo tại đây, https://www.percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

Để xem các thay đổi cứ sau 2 giây:

watch "echo stats | nc 127.0.0.1 11211"

đơn giản và rõ ràng, tuyệt vời của nó để quấn nó bên trong mã python nhưsubprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
Evhz

4

Trong Bash, bạn có thể kiểm tra số liệu thống kê của memcache bằng lệnh này:

exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3

Để xóa bộ nhớ cache, hãy sử dụng memflushlệnh:

echo flush_all >/dev/tcp/localhost/11211

và kiểm tra xem các số liệu thống kê có tăng lên không.

Để kết xuất tất cả các đối tượng được lưu trong bộ nhớ cache, hãy sử dụng lệnh memdumphoặc memcdump(một phần của memcached/ libmemcachedgói):

memcdump --servers=localhost:11211

hoặc là:

memdump --servers=localhost:11211

Nếu bạn đang sử dụng PHP, để xem liệu được hỗ trợ, kiểm tra bằng cách: php -i | grep memcached.


Truy tìm

Để kiểm tra xem quá trình memcached đang xử lý chính xác gì, bạn có thể sử dụng trình dò ​​tìm mạng hoặc trình gỡ lỗi (ví dụ: stracetrên Linux hoặc dtrace/ dtrusstrên Unix / OS X) cho việc đó. Kiểm tra một số ví dụ dưới đây.

Strace

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

Để định dạng đầu ra theo cách tốt hơn, hãy kiểm tra: Làm thế nào để phân tích cú pháp strace trong shell thành văn bản thuần túy?

Dtruss

Dtruss là một trình bao bọc dtrace có sẵn trên các hệ thống Unix. Chạy nó như:

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

Tcpdump

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

Gói nào cung cấp memdump? Tôi đã thử yum install memdumpvà điều đó không thành công.
Martin

@ Martin Tôi tin memdumplà một phần của memcached(hoặc libmemcached), vì vậy hãy thử: yum install memcached.
kenorb

ý bạn là memcdump?
jobima

@jobima Trên một số hệ thống, nó có thể được gọi memcdump.
kenorb

3

Bạn có thể kiểm tra memcached hoặc bất kỳ máy chủ nào bằng script bên dưới

lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?

nếu nó trả về 0 thì máy chủ thực sự đang chạy hoặc nếu 1 thì không, nếu bạn muốn biết rằng máy chủ thực sự đang chạy trên một số cổng, hãy sử dụng tập lệnh sau

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

Bạn có thể sử dụng curl để tìm nạp một trang vài trăm lần và thời gian cho kết quả không? Bạn cũng có thể xem xét việc chạy một quy trình trên máy chủ mô phỏng tải CPU / đĩa nặng khi thực hiện việc này.


1

Tôi đã viết một expecttập lệnh is-memcached-runningđể kiểm tra xem memcached có đang chạy trên tổ hợp máy chủ / cổng hay không (chạy dưới dạng 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

Nếu bạn chạy hệ thống của mình từ một Makefilequy tắc, bạn có thể làm cho việc khởi động của mình phụ thuộc vào một mục tiêu tạo xác nhận rằng nó đang hoạt động (hoặc giúp bạn có được trạng thái đó). Nó dài dòng khi kiểm tra không thành công để giúp chúng tôi dễ dàng gỡ lỗi ci chạy không thành công, cài đặt memcached khi nó bị thiếu, ngắn gọn và đến điểm khác:

#! /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

Sau bài đăng trên Aryashree, điều này đã giúp tôi gặp lỗi nếu memcached không chạy cục bộ:

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

Tôi đang sử dụng Mezzanine và câu trả lời duy nhất phù hợp với tôi là câu trả lời Jacobs. Vì vậy, dừng daemon và chạymemcached -vv


Cân nhắc comenting trên câu trả lời ban đầu hoặc chỉ bỏ phiếu cho các câu trả lời mà làm việc cho bạn
wranvaud
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.