Назад | Перейти на главную страницу

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

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

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

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

ss -neopt state established

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

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

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

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

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

Подсчет TCP установлен соединения:

By using
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
By using
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  </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 для подсчета. Примечание: стоимость такого при огромном количестве подключений не пробовал.