Как проверить, сколько соединений открыто в данный момент на конкретном порту TCP?

8

Я делаю некоторые кометные тесты и хотел бы посмотреть, сколько у меня открытых соединений.

На самом деле я использую netstat:

netstat -ant | grep 8080 | grep EST | wc -l

Но для того, чтобы перечислить число, нужно около 4-6 минут. Есть ли инструмент, который может показать его в реальном времени? Количество открытых соединений составляет от 100 000 до 250 000.

Ненад
источник
Исходя из того, что вы пытаетесь достичь, рассматривали ли вы вопрос об использовании NetFlow и анализатора?
SpacemanSpiff
@SpacemanSpiff Я надеюсь, что есть какое-то простое решение, но я взгляну на NetFlow, так как не уверен, работает ли он с коммутатором HP.
Ненад
Вы знаете, мне интересно, может ли запрос perfmon или WMI вернуть эти данные из стека TCP быстрее ... все же ... вы после открытых портов или активных передач данных?
SpacemanSpiff
@SpacemanSpiff Я слежу за открытыми портами
Nenad
Может быть, запрос SNMP? ... просто выбрасываю идеи для вас.
SpacemanSpiff

Ответы:

8

Не знаю, lsofлучше ли, но попробуйте:

lsof -ni:8080 -sTCP:ESTABLISHED | wc -l
ThorstenS
источник
на самом деле это займет 5 секунд, но у меня 20 000 подключений, и подсчет :-) сообщит, сколько времени пройдет 100K
Nenad
обновление: есть некоторые проблемы с нашими клиентами комет, но lsof намного быстрее 10 секунд для 30 000 подключений, будет обновляться после того, как я исправлю проблемы с кометами и смог проверить соединения свыше 100K
Nenad
обновление: 15 секунд, чтобы показать 130 000 соединений - спасибо! Это делает работу для меня для более детального решения, должен использоваться сетевой анализатор.
Ненад
удивительный! Вы также можете использовать переключатель -t- возможно, это даст вам небольшой импульс.
ThorstenS
5

Если вам просто нужно посмотреть статистику подключений, попробуйте ssутилиту из iprouteпакета:

# ss -s
Total: 1788 (kernel 3134)
TCP:   1638 (estab 1409, closed 162, orphaned 0, synrecv 0, timewait 127/0), ports 0

Transport Total     IP        IPv6
*         3134      -         -        
RAW       0         0         0        
UDP       74        69        5        
TCP       1476      1444      32       
INET      1550      1513      37       
FRAG      0         0         0     

Вы также можете просмотреть подробную информацию обо всех установленных соединениях, как это:

ss -n state established

... или только ssh-соединения:

ss -n state established '( dport = :ssh or sport = :ssh )'

Некоторые номера раздела в нижней части этой страницы также могут вас заинтересовать.

Artyom
источник
+1 за неиспользование устаревшего netstat
Джошуа Гриффитс
Я знаю, что это было 6 лет назад, но есть ли у вас или у кого-то еще ссылка на что-то, что нарушает вывод статуса ss. Мне особенно интересно узнать количество портов в конце строки TCP. Я провожу некоторое сравнительное тестирование между двумя серверами, выступающими в качестве балансировщиков нагрузки, и на одном счетчик портов колеблется около 1000, а на другом он всегда равен 0. Что конкретно это означает?
RobertRSeattle
1
@RobertRSeattle с помощью исходного кода ss кажется, что это число читается из tcp_bind_bucketстроки /proc/slabinfoфайла. Вы можете сравнить выходные данные awk 'NR==2||/tcp_bind_bucket/' /proc/slabinfoмежду двумя вашими серверами. Дальнейшие подробности, вероятно, можно найти где-нибудь в исходниках ядра.
Артём
1

Другой вариант будет читать /proc/net/tcpнапрямую. Чтобы увидеть все установленные соединения TCP на 8080, вы должны сделать что-то вроде

$ printf %04X 8080
1F90
$ grep :1F90 /proc/net/tcp | grep ' 01 ' | wc -l

Если вы хотите сделать это в одном процессе (без затрат на ввод-вывод) и обработать угловые случаи, то ниже показано, сколько УСТАНОВЛЕННЫХ TCP-соединений имеет локальный порт 8080:

$ perl -anle '
          $F[1] =~ /:1F90/ and $F[3] =~ /01/ and $cnt++;
          END { print 0+$cnt }
         '  /proc/net/tcp

Если программное обеспечение на вашем компьютере, прослушивающем 8080, поддерживает IPv6, вам также необходимо прочитать /proc/net/tcp6; если программа использует сокеты IPv6, там будут отображаться соединения, даже если они используют IPv4.

джон
источник
0

проще

#netstat -at | wc -l

Будет отображаться номер TCP-соединения в системе ...

user162048
источник
Это займет больше времени, так как вы не используете флаг "n", чтобы остановить поиск всех имен хостов. Он также покажет другие вещи, кроме подключений к порту 8080, о которых речь шла.
Дженни Д