如何测量一个命令使用的网络流量?


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

Answers:


1

我还建议在网络名称空间中运行所需的程序,这正是该nstrace工具的功能,尽管我不明白为什么他们不简单地编写名称空间的设置脚本。

nsntrace工具需要转发,并用于iptables伪装第ve对对进入到主网络名称空间的传出接口。很可能出了问题,因为它与您的Internet设置不兼容。特别是网络名称空间中的名称服务器问题有些冗长。

所以,我建议你在网络命名空间(读了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。如果要发送某些内容,请使用writesendsyscall系列。我们的启发式方法将跳过readwrite,因为单线分析太难了。

所以,我们开始:

  1. 将应用程序使用的系统调用保存到文件中: strace myapp 2>syscalls
  2. grep所需的系统调用(在这种情况下为send),获取其返回值(=符号后的最后一位数字),然后计算其总和。grep "send" syscalls | grep -E --only-matching "= [0-9]+$" | awk '{ print $2 }' | paste -sd+ | bc

我重申:这种单线不会总是给您正确的结果,但是在大多数情况下都应该起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.