Отримуйте кількість встановлених TCP-з'єднань

На сервері Linux можна використовувати netstat -tan | grep Встановлено | wc -l , але це не буде працювати на високонавантаженому сервері з watch -n1 .

Такий підхід відмінно працює, якщо сервер не дуже зайнятий або інтервал моніторингу досить великий. Але що може бути рекомендовано як альтернативу для сервера з високим навантаженням?

5
seomthing як diff виходу ss з плином часу?
додано Автор Sirex, джерело
Я не розумію. Ви маєте на увазі необхідність оновлення частіше, ніж кожні 1 секунду? Або ви хочете знати загальну кількість з'єднань, які були встановлені протягом певного періоду, замість кількості з'єднань, встановлених на момент запуску netstat?
додано Автор Andrew Schulman, джерело
@AndrewSchulman з високим навантаженням, netstat , за яким слідує команда grep , не буде достатньо швидкою, щоб дати статистику за секундами. Але ви можете отримати її за допомогою ss або розбору /proc . Я хочу знати кількість встановлених TCP з'єднань кожну секунду.
додано Автор Paul, джерело
@ Sirex насправді в моєму випадку я просто хотів дивитися його з плином часу. Якщо ви хочете створити скрипт, то я б віддав перевагу [cat/sed/grep] у /proc .
додано Автор Paul, джерело

5 Відповіді

Використовуйте команду:

ss -neopt state established

Це покаже вам лише TCP сесії в ESTABLISHED стані, немає трубопроводів для інших команд, необхідних, так що це дуже швидко.

ss is better than netstat because the older netstat just reads from procfs which is subject to file locks. ss actually makes a query inside the kernel which is handled by the kernel scheduler and always returns accurate information.

7
додано

Використання/proc для зменшення навантаження

Мені подобається отримувати доступ до змінних ядра безпосередньо через /proc . Це дуже ефективне, швидке та дружнє до системи.

Існує псевдофайл (таблиця змінних ядра) з ім'ям /proc/net/tcp , де зберегти список з'єднань і слухань TCP. 6-е поле, зване st для стану , може містити 0A для запису прослуховування та 01 для встановленого з'єднання.

Підрахунок TCP встановлено з'єднань:

By using
grep 
By using
awk  

або

awk  
By using
sed  

Час виконання

As this question stand fабо high wабоkload system. I've done a little bench:

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

Ok Tonioc's answer is very slow, but very insteresting by his verbosity. So clearly not useable on high wабоkload system.

Даний стенд дозволить вам побачити, що якщо ss є дуже корисним інструментом, що задається, запит змінних /proc може бути набагато швидшим.

1
додано
Це тільки мені чи /proc/net/tcp не показувати номери портів?
додано Автор Ken Sharp, джерело
Або вони після двокрапки в шістнадцятковій?
додано Автор Ken Sharp, джерело
@KenSharp Так, це так. Перший рядок - рядок заголовка. поля local_address і rem_address містять IP та PORT, розділені двокрапкою. поле st (статус) розрізняє значення ESTABLISHED, LISTEN, WAIT ...
додано Автор tim, джерело

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

netstat + grep is a good and simple option for a few connections but if you have a huge number of connections I would recommend ss as recommended in nixCraft.

For instance: 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  
1
додано

ss is a good tool. For kicks you could also can just:

[[email protected]: ~] cat /proc/net/snmp | grep Tcp | awk '{print $10}'
CurrEstab
3
0
додано

Існує також lsof, який може фільтрувати за протоколом і вказувати: наприклад, шукати з'єднання TCP:

~# lsof -i tcp -s tcp:ESTABLISHED

потім | wc -l для підрахунку. Примітка: не варто спробувати вартість цього з величезною кількістю з'єднань.

0
додано