使用bash计算最大增量(吞吐量峰值)

时间:2012-06-14 15:23:04

标签: linux bash math

感谢Dennis Williamson的史诗般的工作,我现在能够通过ethtool -S输出计算无限数量NIC的平均吞吐量。详情可在此处找到:

Calculate throughput on a rolling total

现在,平均吞吐量是一个非常有用的大小调整工具,但我还需要确定同一时间段内的最大流量突发。占95%的流量都很好,但是如果我无法对每个NIC看到的最大突发进行简单/准确的测量,我就不能占其他5%的时间。

丹尼斯用awk写了这一切,遗憾的是我并不是很精通。我无法修改他现有的代码来做我想做的事。是否可以在bash中执行此操作?

作为参考,您可以在此处找到我们需要解析的示例日志文件: http://pastebin.com/p1pwZeBN

丹尼斯的代码在这里:

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]
    }
}'

感谢您的帮助! :)

编辑::作为一个例子,帮助详细说明我想看到的内容。如果新脚本可以解析日志文件(对于DMZ入站,请说),它应该确定最大的增量是在第121行和第113行IE之间:

DMZ      36195731362 vs DMZ      36195255177
= 668659 / 131072 = 5.1~mbps

2 个答案:

答案 0 :(得分:1)

这是未经测试的,但应该有一些小改动:

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
    if (drx > maxdrx[$1]) {
        maxdrx[$1] = drx
    }
    if (dtx > maxdtx[$1]) {
        maxdtx[$1] = dtx
    }
}
END {
    for (iface in rx) {
        print iface, rx[iface] / count[iface], tx[iface] / count[iface], maxdrx[iface], maxdtx[iface]
    }
}'

答案 1 :(得分:0)

为什么不将数据收集与处理分开。使用bash工具等获取数据。然后使用更适合数据可视/处理等的工具进行分析.Matlab,Mathematica,Octave,R,Scipy,甚至JMP。

这并不是说这里的awk并不令人印象深刻,只是当出现问题时你会做什么,而你必须调试那个脚本。为数据处理和分析量身定制的语言将有更多工具可以帮助您处理这种情况。