Як я можу виміряти мережевий трафік, який використовується однією командою?


1

Я часто пишу:

time npm install

що дасть мені результат:

real    0m22.933s
user    0m24.058s
sys     0m3.346s

Я хотів би мати однотипну інформацію, але для споживання в мережі.

Наприклад,

netmeasure npm install

повернеться:

Upload : 499kb
Download : 44MB

Це було б корисно, щоб можна було робити "регресійні тести" в деяких програмах.

Чи можливо отримати таку інформацію за допомогою простих інструментів Unix?

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

Я знайшов https://github.com/jonasdn/nsntrace, який виглядає як хороший інструмент, але всередині nsntrace я не маю підключення (див. Випуск https://github.com/jonasdn/nsntrace/isissue/22 )

Відповіді:


1

Я б також запропонував запустити програму, яку ви хочете, у мережевий простір імен, саме це і nstraceробить цей інструмент, хоча я не розумію, чому вони не просто скриптують налаштування простору імен.

nsntraceІнструмент вимагає переадресації і використовує , iptablesщоб маскувати з'єднання Veth-пар в основній мережі імен для вихідного інтерфейсу. Дуже ймовірно, що пішло не так, тому що те, що він робить, не сумісне з вашими налаштуваннями Інтернету. Особливо проблеми з сервером імен у мережевих просторах імен трохи волохаті.

Тож я б запропонував вам прочитати про мережевий простір імен ( ip netns), маскування iptablesта DNS-резолюцію ( /etc/resolv.conf, /etc/netns/NAME/resolv.conf), щоб мати змогу з’ясувати, що саме пішло не так.

Ось сценарій, який я використовую для установки мережевого простору імен та запуску xterm «всередині» цього простору імен, якщо це допомагає:

#!/bin/bash

# Setup network namespace with veth pair, start xterm in it

# nsterm ns0 veth0 10.0.0 yellow 24

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

NS=${1:-ns0}
DEV=${2:-veth0}
DEV_A=${DEV}a
DEV_B=${DEV}b
ADDR=${3-:10.0.0}
ADDR_A=${ADDR}.254
ADDR_B=${ADDR}.1
MASK=${5:-24}
COL=${4:-yellow}

# echo ns=$NS dev=$DEV col=$COL mask=$MASK

ip netns add $NS
ip link add $DEV_A type veth peer name $DEV_B netns $NS
ip addr add $ADDR_A/$MASK dev $DEV_A
ip link set ${DEV}a up
ip netns exec $NS ip addr add $ADDR_B/$MASK dev $DEV_B
ip netns exec $NS ip link set ${DEV}b up
ip netns exec $NS ip route add default via $ADDR_A dev $DEV_B
ip netns exec $NS su -c "xterm -bg $COL &" YOUR_USERNAME

Адаптуйте за потребою (після того, як ви прочитаєте на ній, щоб зрозуміти, що це робить). Вам все одно потрібно активувати переадресацію

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

і налаштувати маскування в будь-якій формі.

Боюся, я не можу придумати більш просте рішення для вимірювання точного використання мережі.


0

Ви можете отримати наближення за допомогою декількох основних команд. Напевно, nstraceі краще, але я не міг знайти його в своєму дистрофії.

Все, що вам потрібно зробити, - це вивчити системні дзвінки, які використовується додатком. Додаток, який хоче читати з мережі, повинен викликати щось із recvсім'ї або read. Якщо ви хочете щось надіслати, ви використовуєте writeабо sendсімейство системних дзвінків. Наша евристика буде пропущена, readі writeтому що однолінійний аналіз важко проаналізувати.

Отже, ось ми:

  1. Збережіть системні дзвінки, які використовує програма, у файл: strace myapp 2>syscalls
  2. grepнеобхідний системний виклик (у цьому випадку відправити), візьміть їх повернене значення (останній блок цифр після =знаку) та підрахуйте його суму.grep "send" syscalls | grep -E --only-matching "= [0-9]+$" | awk '{ print $2 }' | paste -sd+ | bc

Я ще раз повторюю: цей одноколісний не завжди дасть вам правильний результат, але повинен працювати більшу частину часу.

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