मैं django विचारों को कैश करने के लिए मेमकाटेड का उपयोग करके परीक्षण कर रहा हूं। मैं कैसे बता सकता हूं कि क्या वास्तव में मेमेकैक्ड लिनक्स कमांड लाइन से कुछ भी कैशिंग कर रहा है?
जवाबों:
मुझे पता है कि यह सवाल पुराना है, लेकिन यहाँ django के साथ मेमेकैल्ड परीक्षण के लिए एक और उपयोगी तरीका है:
जैसा कि @ जेकॉब ने उल्लेख किया है, आप बहुत क्रिया मोड में याद रखना शुरू कर सकते हैं (डेमन के रूप में नहीं):
memcached -vv
अपने django cache config का परीक्षण करने के लिए, आप निम्न-स्तरीय कैश एप का उपयोग कर सकते हैं।
सबसे पहले, अजगर दुभाषिया शुरू करें और अपनी django परियोजना सेटिंग्स लोड करें:
python manage.py shell
शेल से, आप अपने मेम्चेचे सर्वर का परीक्षण करने के लिए निम्न-स्तरीय कैश एपीआई का उपयोग कर सकते हैं:
from django.core.cache import cache
cache.set('test', 'test value')
यदि आपका कैश कॉन्फ़िगरेशन सही है, तो आपको इसके समान मेमेचे में आउटपुट देखना चाहिए:
<32 set :1:test 0 300 10
>32 STORED
आप आधिकारिक पर्ल स्क्रिप्ट का उपयोग कर सकते हैं:
memcached-tool 127.0.0.1:11211 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
(सॉकेट केस)
मेमने को एक डेमन के रूप में नहीं बल्कि सामान्य रूप से शुरू करें, इसलिए memcached -vv
बहुत वर्बोज़ के लिए दौड़ें । जब मेम के सर्वर में सेट और सेट आते हैं तो आप देखेंगे।
मेकचेस काम करने के लिए परीक्षण करने का सरल तरीका यह था कि हर पेज पर टाइमस्टैम्प पर टिप्पणी की जाए। यदि टाइमस्टैम्प एक पृष्ठ पर एक से अधिक अनुरोधों पर एक ही रहा, तो मेमेचे द्वारा पृष्ठ को कैश किया जा रहा था।
Django सेटिंग्स में, मैं फ़ाइल सिस्टम पर फ़ाइल कैश का उपयोग करने के लिए कैश तंत्र को भी सेटअप करता हूं (वास्तव में धीमा), लेकिन उन पृष्ठों को मारने के बाद मैं देख सकता था कि फ़ाइल पथ में वास्तविक कैश फाइलें रखी जा रही थीं, इसलिए मैं कैशिंग की पुष्टि कर सकता था Django में सक्रिय।
मैंने अपनी कैशिंग समस्या के समाधान के लिए इन दोनों चरणों का उपयोग किया। मैंने वास्तव में Django में कैशिंग को सही ढंग से चालू नहीं किया था। कैशिंग को सक्रिय करने की नई विधि 'django.middleware.cache.CacheMiddleware' मिडलवेयर (दो मिडलवेयर टुकड़ों के साथ मिडलवेयर नहीं है जो पहले / अंतिम मिडलवेयर सेटिंग होना चाहिए) का उपयोग कर रहा है।
Memcached वास्तव में अपने आप ही एक logfile को लिख सकता है, बिना इसे मैन्युअल रूप से पुनरारंभ करने का सहारा लेने के। /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
(डिबंटस)
और फिर आप इस लॉग को पारंपरिक तरीके से देख सकते हैं, जैसे tail -f /path/to/log
, उदाहरण के लिए।
कमांड लाइन से, नीचे दिए गए कमांड का प्रयास करें:
echo stats | nc 127.0.0.1 11211
यदि यह कुछ भी वापस नहीं करता है, तो मेमेचेस नहीं चल रहा है। अन्यथा इसे अपटाइम (और हिट और मिस काउंट्स) सहित आँकड़ों का एक गुच्छा वापस करना चाहिए
संदर्भ लेख यहाँ है, 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
एक यूनिक्स सॉकेट को डीबग लिए ।
उदाहरण:
$ 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
बैश में, आप इस आदेश द्वारा मेमचे के आंकड़ों की जांच कर सकते हैं:
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
लिनक्स या dtrace
/ dtruss
यूनिक्स / ओएस एक्स पर) का उपयोग कर सकते हैं । नीचे कुछ उदाहरण देखें।
sudo strace -e read,write -fp $(pgrep memcached)
आउटपुट को बेहतर तरीके से फॉर्मेट करने के लिए, चेक करें: शेल में प्लेन टेक्स्ट में पार्स कैसे करें?
Dtruss एक 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
।
आप स्क्रिप्ट या किसी भी सर्वर को स्क्रिप्ट के नीचे देख सकते हैं
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
क्या आप पृष्ठ को कुछ सौ बार लाने और परिणामों के लिए कर्ल का उपयोग कर सकते हैं? आप सर्वर पर एक प्रक्रिया को भी देख सकते हैं जो ऐसा करते समय भारी सीपीयू / डिस्क लोड का अनुकरण करता है।
मैंने एक 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
नियम से अपना सिस्टम चलाते हैं , तो आप अपने स्टार्टअप को एक ऐसे लक्ष्य पर निर्भर कर सकते हैं जो यह सुनिश्चित करता है कि वह ऊपर है और चल रहा है (या आपको वह स्थिति प्राप्त करने में मदद करता है)। यह क्रिया है जब चेक हमारे लिए विफल ci रन को डिबग करना आसान बनाता है, गायब होने पर मेमस्कैस्ट स्थापित करता है, और संक्षिप्त है और अन्यथा बिंदु पर है:
#! /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
आर्यश्री पद के बाद, इसने मुझे एक त्रुटि प्राप्त करने में मदद की अगर स्थानीय स्तर पर नहीं चल रहा है:
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}")