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/issues/22)

2 ответа2

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 требуемый системный вызов (в данном случае send), взять их возвращаемое значение (последний блок цифр после знака = ) и посчитать его сумму. grep "send" syscalls | grep -E --only-matching "= [0-9]+$" | awk '{ print $2 }' | paste -sd+ | bc

Я повторяю: эта строка не всегда даст вам правильный результат, но должна работать в большинстве случаев.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .