Socket

Memcache ‘stats’ 報告非零 ‘curr_connections’ - 但 lsof 顯示沒有套接字連接

  • March 2, 2014

我們的記憶體記憶體守護程序報告非零“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’並不意味著我認為它的作用……

我認為您的邏輯是正確的,即 statcurr_connections是目前的連接數。

curr_connections - 與此 Memcached 伺服器的打開連接數,在正常操作期間所有伺服器上的值應相同。這類似於 mySQL 的“SHOW PROCESSLIST”結果行的計數。

來源: Memcached 統計資訊(stats 命令)

當我設置時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.

   #1

所以看起來每個執行緒都在維護一個連接(或對每個連接的引用),因為它們被建立並保持打開狀態。一旦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 youtelnet 到伺服器查看設置:

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

所以這並不奇怪。

引用自:https://unix.stackexchange.com/questions/117443