计算滚动总量的吞吐量

时间:2012-06-09 00:37:58

标签: linux bash math

我不确定我的系统中是否缺乏咖啡因,但我不能为我的生活找出正确的方法是做什么(数学)。

我有一个脚本记录解析的ethtool -S的值,每隔'x'(在此测试期间为6)秒,直到手动停止。我有关于如何计算迭代等的代码,但我无法弄清楚如何正确计算每秒的平均字节数。

这是输出的样子:

Fri Jun  8 23:48:35 GMT 2012 {{{
============== Network Statistics ===============
IFNAME     rx_bytes        tx_bytes
eth0      27840111418      3083391508
eth4      6153013050      18478875401
eth5      686368648      238683883
eth6      53863181321      2119523154
eth7      23127231747      84602654827
eth8      399517273166      1686004510

Fri Jun  8 23:48:41 GMT 2012 {{{
============== Network Statistics ===============
IFNAME     rx_bytes        tx_bytes
eth0      27840118248      3083392896
eth4      6153014438      18478876789
eth5      686370036      238685271
eth6      53863182709      2119524542
eth7      23127238019      84602660337
eth8      399519325260      1686018706

正如我们所看到的那样,字节都增加了,我将有数千次迭代。

在每个接口的基础上完全按照这些数字的正确方式是什么,并计算每秒的平均字节数(我最终会通过* 0.00000762939453将其移动到mbps)。

到目前为止,我所尝试的一切都失败了......悲惨地说:\

感谢您的时间/耐心/协助!

编辑:: 我目前认为我需要做的是删除rx / tx字节的原始值以规范化数据。用于提取初始总和的当前(丑陋)字符串是:

int1_rx_bytes=`cat $logfile | grep $int1 | awk '{print $2}' | awk '{sum+=$1} END {printf "%f", sum}'`

我将原始数字放在哪里用于减法目的?作为参考,我已经有一个名为$ int1_orig_rx_bytes的变量

1 个答案:

答案 0 :(得分:3)

这两个脚本都未经过测试。

对于移动平均线:

awk 'BEGIN {
    period = 10
    pcount=1
}
NR == 1 {
    baserx = $2
    basetx = $3
}
{
    rx[$1, pcount] = $2 - baserx
    tx[$1, pcount] = $3 - basetx
    ifaces[$1]
    if (c >= period) {
        rxsum = txsum = 0
        for (iface in ifaces) {
            for (i = 1; i <= period; i++) {
                rxsum += rx[iface, i]
                txsum += tx[iface, i]
            }
            print iface, rxsum / period, txsum / period
        }
    } else {
        c++
    }
    pcount = (pcount + 1) % period + 1
}'

修改

所有参赛作品的平均值:

awk '
NR == 1 {
    baserx = $2
    basetx = $3
}
{
    rx[$1] += $2 - baserx
    tx[$1] += $3 - basetx
}
END {
    for (iface in rx) {
        print iface, rx[iface] / NR, tx[iface] / NR
    }
}'

无法保证输入条目的顺序。如果你有gawk,你可以添加一个排序函数来处理它,或者你可以使用sort实用程序。

编辑2:

这解决了上述第二版的所有问题。

awk '
    BEGIN {
        OFMT = "%.4f"
    }

    /^[[:blank:]]*$/ { next }

    ! ($1 in prevrx) {
        prevrx[$1] = $2
        prevtx[$1] = $3
        next
    }
    {
        count[$1]++
        drx = $2 - prevrx[$1]
        dtx = $3 - prevtx[$1]
        rx[$1] += drx
        tx[$1] += dtx
        prevrx[$1] = $2
        prevtx[$1] = $3
    }
    END {
        for (iface in rx) {
            print iface, rx[iface] / count[iface], tx[iface] / count[iface]
        }
}'