На сервере Linux можно использовать netstat -tan | grep ESTABLISHED| wc -l
но это не будет работать на сервере с высокой нагрузкой с watch -n1
.
Такой подход работает нормально, если сервер не очень загружен или интервал мониторинга достаточно велик. Но что можно порекомендовать в качестве альтернативы высоконагруженному серверу?
Используйте команду:
ss -neopt state established
Это покажет вам только сеансы TCP в ESTABLISHED
состояние, никаких конвейеров для других команд не требуется, так что это очень быстро.
ss
лучше, чем netstat
потому что старший netstat
просто читает из procfs, который подвержен блокировкам файлов. ss
фактически делает запрос внутри ядра, который обрабатывается планировщиком ядра и всегда возвращает точную информацию.
Мне нравится доступ переменные ядра прямо через /proc
. Это очень эффективно, быстро и дружелюбно к системе.
Существует псевдофайл (таблица переменных ядра) с именем /proc/net/tcp
где ядро хранит список TCP-соединений и прослушиваний. Шестое поле, названное st
для штат может содержать 0A
для прослушивания записи и 01
для установленного соединения.
Подсчет TCP установлен соединения:
By using grepgrep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
By using 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}'
By using sed sed </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l
Поскольку этот вопрос означает высокую загруженность системы. Я сделал небольшую скамейку:
Method Answer by Milliseconds grep Techno 2.48 awk no regexp ($4=="01") 2.51 sed | wc 2.67 awk with regexp 2.93 ss -neopt state established | wc -l Suprjami 15.14 lsof -i tcp -s tcp:ESTABLISHED Tonioc 25055.00
Хорошо, Тониок отвечает очень медленно, но очень интересен своей многословностью. Так что явно непригоден для системы с высокой нагрузкой.
Эта скамейка позволит вам увидеть, что если ss
это очень полезный специализированный инструмент, спрашивающий /proc
переменные могут быть намного быстрее.
Также проверьте: 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
ss
хороший инструмент. Для удовольствия вы также можете просто:
[kbrandt@ny-kbrandt01: ~] cat /proc/net/snmp | grep Tcp | awk '{print $10}'
CurrEstab
3
Существует также lsof, который может фильтровать по протоколу и состоянию: например, для поиска TCP ESTABLISHED-соединений:
~# lsof -i tcp -s tcp:ESTABLISHED
тогда | wc -l для подсчета. Примечание: стоимость такого при огромном количестве подключений не пробовал.