我们的内存缓存守护进程报告非零的 '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' 并不意味着我认为它的作用......
我认为您的逻辑是正确的,即 statcurr_connections
是当前连接的数量。
curr_connections - 与此 Memcached 服务器的打开连接数,在正常操作期间所有服务器上的值应相同。这类似于 mySQL 的“SHOW PROCESSLIST”结果行的计数。
当我设置时,memcached
我注意到它始终保持 10 作为最少数量curr_connections
。
$ echo stats | nc localhost 11211 | grep curr_conn
STAT curr_connections 10
Run Code Online (Sandbox Code Playgroud)
如果您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
.
因此,看起来每个线程在创建并保持打开状态时都在维护一个连接(或对每个连接的引用)。一旦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)
为了进一步简化示例,让我们启动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?这似乎是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
...
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)
所以也就不足为奇了。