如何测量适配器捕获数据包的平均时间



我想编写一个bash脚本来计算网络接口捕获数据包的平均时间。我找到这个答案给了我帮助,但我需要改进我的脚本。所以我以这种方式扩展了它

#!/bin/bash
INTERVAL="1"  # interval in seconds
if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 "$1"
        echo
        echo shows packets-per-second
        exit
fi
N_PPS=0
SUM_TIME=0
calc_avg()
{
    AVG=$((N_PPS/SUM_TIME))
    echo
    echo "The average of packet captured is $AVG pkts/s"
    exit 0
}
trap calc_avg SIGINT
while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_packets`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_packets`
        RXPPS=`expr $R2 - $R1`
    SUM_TIME=$((SUM_TIME + 1))
    if [ "$RXPPS" > 0 ];
    then
        N_PPS=$((N_PPS + RXPPS))
    fi
    echo "RX $1: $RXPPS pkts/s"
done

正如我所解释的那样,我需要捕获数据包的 AVG 时间,所以我用 N_PPS 来计算我的数据包。我需要更好地了解这个计算是否正确,无论是SUM_TIME还是AVG_TIME,以及如何在 bash 中使用微秒而不是秒。

任何建议或批评都很好接受。

更改后编辑

  1. 由于@jarr答案,我做了更改,但我遇到了问题,如果结果是更少的 han 1,则不显示初始0. 即 AVG = .333

    AVG=$(echo "scale=3;$N_PPS/$SUM_TIME" |公元前 )

  2. 我注意到当我启动此脚本时,它会创建一个名为 0 的 0 字节的文件。为什么以及如何避免这种情况?

代码在数学上似乎是正确的,但当然它可能缺乏数据收集变量$INTERVAL的准确性。也许它可以设置为参数?但这取决于您的需求。这里完成了一些快速优化。

一些

观点(根据我的经验,也许其他人可以指出一些不必要的更改)。

我更喜欢 printf而不是回显,因为它允许更多的控制。另外,我不久前在某处读到它更便携。

您不需要 expr 即可将命令评估为变量。

我个人更喜欢用法进入它自己的功能以增加可读性。该函数应返回一个成功值,因为其调用是预期的,它并不完全是一个错误。

双括号可用于将变量添加到自身。

#!/bin/bash
INTERVAL="1"  # interval in seconds
N_PPS=0
SUM_TIME=0
trap calc_avg SIGINT
fn_usage()
{
    printf "nusage: $0 [network-interface]n"
    printf "ne.g. $0 $1n"
    printf "nshows packets-per-secondn"
    exit 0
}
calc_avg()
{
    AVG=$((N_PPS/SUM_TIME))
    printf  "nThe average of packet captured is $AVG pkts/sn"
    exit 0
}

if [[ -z $1 ]]; then
    fn_usage
fi
while true; do
    R1=$( cat /sys/class/net/$1/statistics/rx_packets )
    sleep $INTERVAL
    R2=$( cat /sys/class/net/$1/statistics/rx_packets )
    RXPPS=$(( $R2 - $R1 ))
    ((SUM_TIME += 1))
    if [[ $RXPPS > 0 ]]; then
        ((N_PPS += RXPPS))
    fi
    printf "RX $1: $RXPPS pkts/sn"
done

最新更新