Получение текущего количества TCP-соединений в системе

22

Вместо того, чтобы делать wc -l /proc/net/tcp, есть ли более быстрый способ сделать это?

Мне просто нужно общее количество соединений TCP.

маргаритка
источник
5
Может быть, попробоватьss -s
Ульрих Дангел
@UlrichDangel круто, быстрее, прочитав sockstat; Вы можете фактически поместить это в область ответа ;-)
маргаритка

Ответы:

20

Если вы просто хотите получить номер и вам не нужны никакие подробности, вы можете прочитать данные /proc/net/sockstat{,6}. Помните, что вы должны объединить оба значения, чтобы получить абсолютное количество соединений.

Если вы хотите получить информацию из самого ядра, вы можете использовать ее NETLINK_INET_DIAGдля получения информации из ядра, не считывая ее с/proc

Ульрих Дангел
источник
1
Мне было бы любопытно увидеть тест в системе со многими соединениями, сравнивающий производительность моего решения с вышеупомянутым предложенным решением, который требует дополнительной арифметики и фильтрации, чтобы получить окончательный ответ, который является просто одним числом!
Йохан
7

Более быстрый способ? Этот способ дает ответ за доли секунды, фактически на моем компьютере это занимает 0,009 секунды!

Вы ищете способ, который требует меньше печатать? В этом случае установите псевдоним, например,

alias tcpcount="wc -l /proc/net/tcp"

Теперь вы можете просто ввести псевдоним, например tcpcount, то, что я использовал в моем примере, чтобы получить этот номер.

Введите строку или добавьте ее в свой .bashrc, чтобы псевдоним определялся при каждом входе в систему.

Для большого количества соединений следующее может выполняться немного быстрее (и немного медленнее для очень малого числа соединений):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

Или, может быть ...

awk 'END {print NR}' /proc/net/tcp

Оба эти решения предполагают, что «wc» не очень оптимален для простого подсчета количества строк. Мое тестирование показывает, что это предположение верно.

Первая работает при условии, что команда tail действительно хороша для удаления ненужных данных, настолько, что она компенсирует создание дополнительной вложенной оболочки и выполнение дополнительной работы с переменными среды. Он использует тот факт, что строки в / proc / net / tcp уже пронумерованы, чтобы исключить необходимость подсчета строк. Окончательное решение предполагает, что awk считает достаточно хорошо, чтобы компенсировать любые недостатки из-за загрузки более крупной программы по сравнению с созданием нескольких процессов. Решение awk имеет дополнительное преимущество, заключающееся в том, что оно хорошо вписывается в простое однострочное определение псевдонима (что дает дополнительные преимущества в том смысле, что не вызывается ни один сценарий, поэтому дополнительные процессы оболочки не разветвляются, что дает дополнительное преимущество в несколько секунд).

Johan
источник
1
У меня 40к + соединение, где это занимает более 3 секунд
маргаритка
2
Хм, я не думаю, что есть намного более быстрый способ, чем читать /proc/net/tcp. Вы можете попробовать netstat -n -t | wc -l, но я думаю, что netstat также читает из/proc/net/tcp
Kotte
netstat более чем в 3 раза медленнее, чем чтение / proc / net / tcp в моей системе, но это связано с очень небольшим числом соединений, поэтому может быть, что некоторые накладные расходы при запуске уменьшаются, если количество соединений велико. С помощью netstat легко получить количество соединений в разных штатах ....
Йохан,
1
На сервере с 16 ГБ оперативной памяти теперь требуется более минуты, чтобы выполнить netstat -ntоколо 180 000 подключений. Я не вижу причин, почему это должно быть таким медленным ... (чтение /proc/net/tcpтакже очень медленное)
Marki555
1
Некоторое застенчивое тестирование на машине с 180k-соединениями показывает, что awkподход гораздо медленнее, чем wc. tailкажется наравне с wc.
Феликс Франк
-1

Используйте ss -sкоманду, чтобы получить подробный ответ.

user3894067
источник