Статистика «Memcache» сообщает о ненулевых «curr_connections», но lsof не показывает соединений сокетов

Наш демон memcache сообщает о ненулевых «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» не означает, что я думаю, что он делает …

  • lsof vs cat / proc / ... / maps
  • Почему `lsof -i` не показывает открытое соединение, которое перечисляет` netstat -n`?
  • Активность дискового диска FreeBSD 10
  • Что такое смещение файла в lsof output?
  • Более быстрые альтернативы lsof
  • Как lsof прикрепить к скрипту PID скрипта?
  • Как я могу выяснить, из каких pty из qemu?
  • Список текущих часов inotify (путь, PID)
  • One Solution collect form web for “Статистика «Memcache» сообщает о ненулевых «curr_connections», но lsof не показывает соединений сокетов”

    Я думаю, что вы правы в своей логике, что stat curr_connections – это количество подключаемых соединений.

    curr_connections – количество открытых подключений к этому серверу Memcached должно быть одинаковым для всех серверов во время нормальной работы. Это что-то вроде количества строк результатов SHS PROCESSLIST mySQL.

    Источник: статистика Memcached (команда статистики)

    Когда я устанавливаю 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 

    Существует один главный узел и 5 рабочих потоков.

    Вот как выглядит вывод lsof когда я сделал 3 подключения к memcached используя тот же метод, что и вы, telnet localhost 11211 .

    ss # 1

    Таким образом, кажется, что каждый поток поддерживает соединение (или ссылку на каждое соединение) по мере их создания и остается открытым. Как только telnet соединения будут закрыты, они исчезнут из этого списка.

    Итак, как мы можем подсчитать соединения?

    Поэтому, если вы хотите подсчитать соединения, вы можете либо вычесть 10 из результата curr_connections , либо вы можете запустить 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 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 ... 

    Можем ли мы изменить это значение? Конечно, это -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 telnets (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 

    Так что неудивительно.

    Linux и Unix - лучшая ОС в мире.