Memcache 'stats' 报告非零的 'curr_connections' - 但 lsof 显示没有套接字连接

tts*_*ras 6 lsof socket

我们的内存缓存守护进程报告非零的 'curr_connections'...

$ telnet memcache-server 11211
Escape character is '^]'.
stats
...
STAT curr_connections 12
...
Run Code Online (Sandbox Code Playgroud)

...然而,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 
Run Code Online (Sandbox Code Playgroud)

我猜 'curr_connections' 并不意味着我认为它的作用......

slm*_*slm 7

我认为您的逻辑是正确的,即 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
Run Code Online (Sandbox Code Playgroud)

但为什么是 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)
Run Code Online (Sandbox Code Playgroud)

如果您统计监听服务器 (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
Run Code Online (Sandbox Code Playgroud)

有一个主节点和 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)
Run Code Online (Sandbox Code Playgroud)

最后一行是活动连接。所以我们可以这样计算它们:

$ lsof -p $(pgrep memcached) | grep "memcache->" | wc -l
1
Run Code Online (Sandbox Code Playgroud)

但是您的输出显示 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)
Run Code Online (Sandbox Code Playgroud)

请注意,我们只获得了 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
Run Code Online (Sandbox Code Playgroud)

看到我们无法连接。但是我们可以使用 IPv4 地址:

$ telnet 192.168.1.20 11211
Trying 192.168.1.20...
Connected to 192.168.1.20.
Escape character is '^]'.
Run Code Online (Sandbox Code Playgroud)

统计现在怎么说?

STAT curr_connections 5
Run Code Online (Sandbox Code Playgroud)

看?在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
...
Run Code Online (Sandbox Code Playgroud)

我们可以改变那个值吗?当然是-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)
Run Code Online (Sandbox Code Playgroud)

所以现在我们只有主侦听器(自动)和 1 个 UDP 线程。如果我们stats现在检查:

STAT curr_connections 2
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我们不能将线程数设置为 0。

$ memcached -vv -l 192.168.1.20 -t 0
Number of threads must be greater than 0
Run Code Online (Sandbox Code Playgroud)

所以我们可以达到的最低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)
Run Code Online (Sandbox Code Playgroud)

所以我们仍然有 auto + 1 个 UDP 和 6 个其他连接。我们的stats命令显示了这一点:

STAT curr_connections 8
Run Code Online (Sandbox Code Playgroud)

所以也就不足为奇了。