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:
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.
Đầ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
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
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
memcached-tool 127.0.0.1:11211 stats
- bạn không cần phải telnet.
/usr/share/memcached/scripts/memcached-tool
.
/usr/share/memcached/scripts/memcached-tool /tmp/memcached.sock stats
hoặc /usr/share/memcached/scripts/memcached-tool /var/run/memcached/memcached.sock stats
(hộp đựng ổ cắm)
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 -vv
rất dài dòng. Bạn sẽ thấy khi nào get và set được đưa vào máy chủ memcache.
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.)
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/memcached
lệnh init ( /usr/lib/systemd/system/memcached.service
trê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/memcached
trê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/log
hạn như.
Để 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
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"
subprocess.Popen('echo stats | nc 127.0.0.1 11211', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
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 memflush
lệ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 memdump
hoặc memcdump
(một phần của memcached
/ libmemcached
gó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
.
Để 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ụ: strace
trên Linux hoặc dtrace
/ dtruss
trên Unix / OS X) cho việc đó. Kiểm tra một số ví dụ dưới đây.
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 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)
sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
yum install memdump
và điều đó không thành công.
memdump
là một phần của memcached
(hoặc libmemcached
), vì vậy hãy thử: yum install memcached
.
memcdump
.
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
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.
Tôi đã viết một expect
tậ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 Makefile
quy 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
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}")