Отримання поточного підключення TCP до системи


22

Замість цього wc -l /proc/net/tcpчи існує більш швидкий спосіб зробити це?

Мені просто потрібно загальна кількість підключень tcp.


5
Можливо, спробуйтеss -s
Ульріх Дангель

@UlrichDangel круто, це швидше, читаючи sockstat; ви можете насправді поставити це у зоні відповідей ;-)
ромашка

Відповіді:


20

Якщо ви просто хочете отримати номер і не потребуєте жодних деталей, ви можете прочитати дані /proc/net/sockstat{,6}. Майте на увазі, що вам потрібно поєднувати обидва значення, щоб отримати абсолютну кількість з'єднань.

Якщо ви хочете отримати інформацію від самого ядра, ви можете скористатися NETLINK_INET_DIAGдля отримання інформації з ядра без необхідності її читання/proc


1
Мені було б цікаво побачити тест на системі з багатьма підключеннями, порівнюючи ефективність мого рішення з запропонованим вище рішенням, яке вимагає додаткової арифметики та фільтрації, щоб отримати остаточну відповідь, а це лише одне число!
Йохан

7

Швидший шлях? Це дає відповідь за частку секунди, адже на моєму комп’ютері це займає 0,009 секунди!

Шукаєте спосіб, який потребує меншої кількості тексту? У цьому випадку встановіть псевдонім, наприклад

alias tcpcount="wc -l /proc/net/tcp"

Тепер ви можете просто ввести псевдонім, наприклад tcpcount, те, що я використав у своєму прикладі, щоб отримати це число.

Введіть рядок або додайте його у свій .bashrc, щоб псевдонім визначався кожного разу при вході в систему.

Для великої кількості з'єднань, можливо, наступне може працювати трохи швидше (І трохи повільніше для дуже невеликої кількості з'єднань):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

Або можливо ...

awk 'END {print NR}' /proc/net/tcp

Обидва ці рішення передбачають, що "wc" не дуже оптимальний для простого підрахунку кількості рядків. Моє тестування показує, що це припущення вірно.

Перший працює на передумові, що команда хвоста дійсно гарна в тому, щоб відкинути непотрібні дані, настільки, що вона компенсує створення додаткової підшкірної оболонки та проведення додаткової роботи над змінними середовища. Це використовує той факт, що рядки в / proc / net / tcp вже пронумеровані, щоб усунути необхідність підрахунку рядків. Остаточне рішення передбачає, що awk нараховує досить добре, щоб компенсувати будь-які недоліки через завантаження більшої програми та створення декількох процесів. Рішення awk має додаткову перевагу, що воно добре вписується в просте однолінійне визначення псевдоніму (Що дає додаткові переваги в тому, що сценарій не викликається, таким чином, додаткові оболонки не розгортаються, що дає додаткові переваги в мілі секунди.)


1
У мене 40k + з'єднання, де це займає більше 3 секунд
ромашка

2
Хм, я не думаю, що існує набагато швидший спосіб, ніж читання з /proc/net/tcp. Можна спробувати netstat -n -t | wc -l, але я гадаю, що netstat також читає з/proc/net/tcp
Kotte

netstat більш ніж у 3 рази повільніше, ніж читання / proc / net / tcp в моїй системі, але це з дуже малою кількістю підключень, тому, можливо, деякий запуск накладних витрат зменшиться, якщо кількість підключень велике. netstat дозволяє легко отримувати кількість підключень у різних штатах ....
Йохан

1
На сервері з 16 ГБ оперативної пам’яті зараз потрібно більше хвилини, щоб зробити netstat -ntблизько 180 000 з'єднань. Я не бачу причини, щоб це було так повільно ... (читання /proc/net/tcpтеж дуже повільне)
Marki555,

1
Деякі сором'язливі випробування на машині зі 180-кілограмовим підключенням вказують на те, що цей awkпідхід жахливо повільніше, ніж wc. tailначебто, нарівні з wc.
Фелікс Френк

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.