
На сервере 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
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 для подсчета. Примечание: не проверял стоимость этого при огромном количестве подключений.