Получить количество установленных TCP-соединений

Получить количество установленных TCP-соединений

На сервере Linux можно использовать, netstat -tan | grep ESTABLISHED| wc -lно это не будет работать на сервере с высокой нагрузкой с watch -n1.

Такой подход работает нормально, если сервер не сильно загружен или интервал мониторинга достаточно большой. Но что можно порекомендовать в качестве альтернативы для сервера с высокой нагрузкой?

решение1

Использование /proc для снижения рабочей нагрузки

Мне нравится получать доступпеременные ядранапрямую через /proc. Это очень эффективно, быстро и удобно для системы.

Есть псевдофайл (таблица переменных ядра) с именем, /proc/net/tcpгде ядро ​​хранит список TCP-подключений и прослушиваний. Шестое поле, называемоеstдлясостояниеможет содержать 0Aкак для прослушиваемой записи, так и 01для установленного соединения.

ПодсчетТКП учредилсоединения:

Используя
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
Используя
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'

или

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
Используя
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l

Время исполнения

Поскольку этот вопрос касается системы с высокой рабочей нагрузкой, я сделал небольшой бенчмарк:

Метод ответа по миллисекундам

grep Техно 2.48
awk без регулярного выражения ($4=="01") 2.51
сэд | туалет 2.67
awk с регулярным выражением 2.93

ss -neopt состояние установлено | wc -l Suprjami 15.14
lsof -i tcp -s tcp: УСТАНОВЛЕНО Tonioc 25055.00

Ок, ответ Тониока очень медленный, но очень интересный своей многословностью. Так что явно не пригоден для использования в системах с высокой рабочей нагрузкой.

Этот стенд позволяет увидеть, что если ssэто очень полезный специализированный инструмент, то запрос /procпеременных может быть намного быстрее.

решение2

Используйте команду:

ss -neopt state established

Это покажет вам только текущие сеансы TCP ESTABLISHED, не требуется никаких дополнительных команд, поэтому это очень быстро.

ssлучше, чем предыдущий netstat, потому что старый netstatпросто читает из procfs, которая подвержена блокировкам файлов. ssна самом деле делает запрос внутри ядра, который обрабатывается планировщиком ядра и всегда возвращает точную информацию.

решение3

Проверьте также:527875.

netstat + grepэто хороший и простой вариант для нескольких подключений, но если у вас огромное количество подключений, я бы рекомендовал, ssкак рекомендовано вnixCraft.

Например:ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  

решение4

Также есть lsof, который может фильтровать по протоколу и состоянию: например, для поиска TCP ESTABLISHED соединений:

~# lsof -i tcp -s tcp:ESTABLISHED

затем | wc -l для подсчета. Примечание: не проверял стоимость этого при огромном количестве подключений.

Связанный контент