Acho que você está correto em sua lógica que stat curr_connections
é o número de conexões atuais.
curr_connections - Number of open connections to this Memcached server, should be the same value on all servers during normal operation. This is something like the count of mySQL's "SHOW PROCESSLIST" result rows.
Fonte: Estatísticas do Memcached ( comando stats)
Quando configuro memcached
, percebi que ele sempre mantinha 10 como a menor quantidade de curr_connections
.
$ echo stats | nc localhost 11211 | grep curr_conn
STAT curr_connections 10
Mas por que 10?
Se você executar memcached
no modo detalhado, verá a seguinte saída:
$ 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)
Se você acumular os servidores de escuta (8) + 2 servidores (auto-negociado), descobrirá porque existem 10 servidores de base para começar, pelo menos é o que eu pensei no início. Mas você precisa se aprofundar para entender melhor o que está acontecendo.
Parece que memcached
é multiencadeado e, portanto, a saída que você estava percebendo não é exatamente como seria calcular as conexões.
Observe os tópicos
A saída de ps -eLf
mostra os tópicos:
$ 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
Existe um nó principal e 5 threads de trabalho.
Veja como é a saída de lsof
quando fiz 3 conexões com memcached
usando o mesmo método que você, telnet localhost 11211
.
Portanto,parecequecadathreadestámantendoumaconexão(ouumareferênciaparacadaconexão)conformeelessãocriadosemantidosabertos.Assimqueasconexõestelnet
sãofechadas,elasdesaparecemdalista.
Então,comopodemoscontarasconexões?
Portanto,sevocêquiseragruparasconexões,podesubtrair10doresultadocurr_connections
ouexecutarlsof
econtaronúmerodeconexõesassociadasaoPIDprincipal.Observeestasaída:
$lsof|grepmemcac|grepIPvmemcached20036saml26uIPv478330650t0TCP*:memcache(LISTEN)memcached20036saml27uIPv678330660t0TCP*:memcache(LISTEN)memcached20036saml28uIPv478330690t0UDP*:memcachememcached20036saml29uIPv678330700t0UDP*:memcachememcached20036saml30uIPv679620780t0TCPlocalhost:memcache->localhost:38728(ESTABLISHED)
Essaúltimalinhaéumaconexãoativa.Entãopoderíamoscontá-losassim:
$lsof-p$(pgrepmemcached)|grep"memcache->" | wc -l
1
Mas sua saída mostra IPv4 & IPv6, o que há com isso?
Para simplificar ainda mais o exemplo, vamos iniciar memcached
up e forçá-lo a escutar somente um único endereço IPv4, 192.168.1.20. Nos exemplos acima, estávamos começando memcached
em todas as interfaces e nos conectando a ele usando localhost
, então vamos dar outra olhada.
$ 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)
Observe que estamos recebendo apenas 1/2? Anteriormente tínhamos 2 servidores auto-negociados e 8 UDP, desta vez temos 1 auto e 4 UDP. Por quê? Bem, nós dissemos memcached
para apenas escutar na interface IPv4, antes estava escutando tudo, o IPv4 e o localhost. Podemos nos convencer disso tentando conectar-se ao servidor em 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
Veja que não podemos nos conectar. Mas podemos usar o endereço IPv4:
$ telnet 192.168.1.20 11211
Trying 192.168.1.20...
Connected to 192.168.1.20.
Escape character is '^]'.
O que as estatísticas dizem agora?
STAT curr_connections 5
Veja? O curr_connections
está mostrando o número 5 (1 auto + 4 UDP).
4 UDPs?
Por que estamos executando 4 UDPs? Isso parece ser uma configuração padrão em memcached
. Você pode ver as configurações usando o stats settings command when you
telnet 'para o servidor:
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
...
Podemos mudar esse valor? É claro que a -t #
muda para 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)
Agora, temos apenas o ouvinte principal (automático) e um encadeamento UDP. Se verificarmos stats
agora:
STAT curr_connections 2
Por acaso, não podemos definir o número de segmentos como 0.
$ memcached -vv -l 192.168.1.20 -t 0
Number of threads must be greater than 0
Portanto, o mínimo que podemos obter é curr_connections
2. Se abrirmos 6 telnets (5 de nós mesmos - greeneggs e 1 de outro servidor remoto chamado skinner), veremos o seguinte na nossa saída 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)
Portanto, ainda temos o auto + o 1 UDP e 6 outras conexões. Nosso comando stats
mostra isso:
STAT curr_connections 8
Então não é nenhuma surpresa.