O 'stats' do Memcache reporta 'curr_connections' diferentes de zero - mas lsof não mostra conexões de socket

4

Nosso daemon memcache reporta 'curr_connections' diferente de zero ...

$ telnet memcache-server 11211
Escape character is '^]'.
stats
...
STAT curr_connections 12
...

... e ainda, lsof não mostra conexões de soquete:

$ 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 

Eu estou supondo que 'curr_connections' não significa o que eu acho que faz ...

    
por ttsiodras 28.02.2014 / 12:37

1 resposta

7

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õestelnetsãofechadas,elasdesaparecemdalista.

Então,comopodemoscontarasconexões?

Portanto,sevocêquiseragruparasconexões,podesubtrair10doresultadocurr_connectionsouexecutarlsofecontaronú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.

    
por 28.02.2014 / 23:53

Tags