Memcache ‘stats’ 報告非零 ‘curr_connections’ - 但 lsof 顯示沒有套接字連接
我們的記憶體記憶體守護程序報告非零“curr_connections”…
$ telnet memcache-server 11211 Escape character is '^]'. stats ... STAT curr_connections 12 ...
…然而,
lsof
顯示沒有套接字連接:$ ssh memcache-server # lsof -P -i -n | grep memcache memcached 1759 memcached 26u IPv4 11638 0t0 TCP *:11211 (LISTEN) memcached 1759 memcached 27u IPv6 11639 0t0 TCP *:11211 (LISTEN) memcached 1759 memcached 28u IPv4 11642 0t0 UDP *:11211 memcached 1759 memcached 29u IPv6 11643 0t0 UDP *:11211
我猜’curr_connections’並不意味著我認為它的作用……
我認為您的邏輯是正確的,即 stat
curr_connections
是目前的連接數。curr_connections - 與此 Memcached 伺服器的打開連接數,在正常操作期間所有伺服器上的值應相同。這類似於 mySQL 的“SHOW PROCESSLIST”結果行的計數。
當我設置時
memcached
,我注意到它始終保持 10 作為最少的數量curr_connections
。$ echo stats | nc localhost 11211 | grep curr_conn STAT curr_connections 10
但是為什麼是10?
如果您
memcached
在詳細模式下執行,您會注意到以下輸出:$ memcached -vv ... <26 server listening (auto-negotiate) <27 server listening (auto-negotiate) <28 send buffer was 212992, now 268435456 <28 server listening (udp) <28 server listening (udp) <28 server listening (udp) <29 send buffer was 212992, now 268435456 <28 server listening (udp) <29 server listening (udp) <29 server listening (udp) <29 server listening (udp) <29 server listening (udp)
如果你統計監聽伺服器 (8) + 2 個伺服器(自動協商),你會發現為什麼要啟動 10 個基礎伺服器,至少我一開始是這麼想的。但是您需要更深入地探勘以更好地了解正在發生的事情。
看起來它
memcached
是多執行緒的,因此您注意到的輸出並不是真正如何計算連接。注意執行緒
的輸出
ps -eLf
顯示執行緒:$ ps -eLf | grep memc saml 20036 4393 20036 0 6 20:07 pts/7 00:00:00 memcached -vv saml 20036 4393 20037 0 6 20:07 pts/7 00:00:00 memcached -vv saml 20036 4393 20038 0 6 20:07 pts/7 00:00:00 memcached -vv saml 20036 4393 20039 0 6 20:07 pts/7 00:00:00 memcached -vv saml 20036 4393 20040 0 6 20:07 pts/7 00:00:00 memcached -vv saml 20036 4393 20041 0 6 20:07 pts/7 00:00:00 memcached -vv
有 1 個主節點和 5 個工作執行緒。
lsof
當我memcached
使用與您相同的方法建立 3 個連接時,輸出如下所示,telnet localhost 11211
.所以看起來每個執行緒都在維護一個連接(或對每個連接的引用),因為它們被建立並保持打開狀態。一旦
telnet
連接關閉,它們就會從這個列表中消失。那麼我們如何計算連接數呢?
因此,如果您想統計連接數,您可以從
curr_connections
結果中減去 10,或者您可以執行lsof
併計算與主 PID 關聯的連接數。注意這個輸出:$ lsof |grep memcac | grep IPv memcached 20036 saml 26u IPv4 7833065 0t0 TCP *:memcache (LISTEN) memcached 20036 saml 27u IPv6 7833066 0t0 TCP *:memcache (LISTEN) memcached 20036 saml 28u IPv4 7833069 0t0 UDP *:memcache memcached 20036 saml 29u IPv6 7833070 0t0 UDP *:memcache memcached 20036 saml 30u IPv6 7962078 0t0 TCP localhost:memcache->localhost:38728 (ESTABLISHED)
最後一行是活動連接。所以我們可以這樣計算它們:
$ lsof -p $(pgrep memcached) | grep "memcache->" | wc -l 1
但是您的輸出顯示 IPv4 和 IPv6,這是怎麼回事?
為了進一步簡化範例,讓我們啟動
memcached
並強制它僅偵聽單個 IPv4 地址 192.168.1.20。在上面的範例中,我們memcached
在所有介面上啟動並使用 連接到它localhost
,所以讓我們再看一下。$ memcached -vv -l 192.168.1.20 ... <26 server listening (auto-negotiate) <27 send buffer was 212992, now 268435456 <27 server listening (udp) <27 server listening (udp) <27 server listening (udp) <27 server listening (udp)
請注意,我們只得到了 1/2 的數量?以前我們有 2 個自動協商伺服器和 8 個 UDP,這次我們有 1 個自動協商伺服器和 4 個 UDP。為什麼?好吧,我們告訴
memcached
過只監聽 IPv4 介面,以前它監聽所有內容,IPv4 和 localhost。我們可以通過嘗試連接到 localhost 上的伺服器來說服自己:$ telnet localhost 11211 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused
看到我們無法連接。但是我們可以使用 IPv4 地址:
$ telnet 192.168.1.20 11211 Trying 192.168.1.20... Connected to 192.168.1.20. Escape character is '^]'.
統計數據現在怎麼說?
STAT curr_connections 5
看?顯示
curr_connections
數字 5(1 自動 + 4 UDP)。4個UDP?
為什麼我們執行 4 個 UDP?這似乎是
memcached
. 您可以使用stats settings command when you
telnet 到伺服器查看設置:stats settings STAT maxbytes 67108864 STAT maxconns 1024 STAT tcpport 11211 STAT udpport 11211 STAT inter 192.168.1.20 STAT verbosity 2 ... STAT num_threads 4 STAT num_threads_per_udp 4 ...
我們可以改變這個值嗎?當然是
-t #
切換到memcached
.$ memcached -vv -l 192.168.1.20 -t 1 ... <11 server listening (auto-negotiate) <12 send buffer was 212992, now 268435456 <12 server listening (udp)
所以現在我們只有主監聽器(自動)和 1 個 UDP 執行緒。如果我們
stats
現在檢查:STAT curr_connections 2
順便說一句,我們不能將執行緒數設置為 0。
$ memcached -vv -l 192.168.1.20 -t 0 Number of threads must be greater than 0
所以我們可以達到的最低值
curr_connections
是 2。如果我們打開 6 個 telnet(5 個來自我們自己 - greeneggs 和 1 個來自另一個名為 skinner 的遠端伺服器),我們將在lsof
輸出中看到以下內容:$ lsof -p $(pgrep memcached) | grep ":memcache" memcached 24949 saml 11u IPv4 847365 0t0 TCP greeneggs.bubba.net:memcache (LISTEN) memcached 24949 saml 12u IPv4 847366 0t0 UDP greeneggs.bubba.net:memcache memcached 24949 saml 13u IPv4 855914 0t0 TCP greeneggs.bubba.net:memcache->greeneggs.bubba.net:48273 (ESTABLISHED) memcached 24949 saml 14u IPv4 872538 0t0 TCP greeneggs.bubba.net:memcache->skinner.bubba.net:41352 (ESTABLISHED) memcached 24949 saml 15u IPv4 855975 0t0 TCP greeneggs.bubba.net:memcache->greeneggs.bubba.net:48298 (ESTABLISHED) memcached 24949 saml 16u IPv4 855992 0t0 TCP greeneggs.bubba.net:memcache->greeneggs.bubba.net:48305 (ESTABLISHED) memcached 24949 saml 17u IPv4 859065 0t0 TCP greeneggs.bubba.net:memcache->greeneggs.bubba.net:48316 (ESTABLISHED) memcached 24949 saml 18u IPv4 859077 0t0 TCP greeneggs.bubba.net:memcache->greeneggs.bubba.net:48326 (ESTABLISHED)
所以我們仍然有 auto + 1 個 UDP 和 6 個其他連接。我們的
stats
命令顯示了這一點:STAT curr_connections 8
所以這並不奇怪。