3

我不确定是不是我的系统中缺乏咖啡因,但我一生都无法弄清楚这样做的正确方法是什么(数学)。

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

这是输出的样子:

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 的变量

4

1 回答 1

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]
        }
}'
于 2012-06-09T01:01:44.260 回答