3

それが私のシステムにカフェインが不足しているのかどうかはわかりませんが、これを行う正しい方法が何であるかを私は一生理解できません(数学)。

手動で停止するまで、解析されたethtool -Sの値を「x」(このテストでは6)秒ごとに記録するスクリプトがあります。反復の計算方法などのコードはありますが、1秒あたりの平均バイト数を正しく計算する方法がわかりません。

出力は次のようになります。

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

ご覧のとおり、バイトはすべてインクリメントされており、これを何千回も繰り返すことになります。

インターフェイスごとにこれらの数値を合計し、1秒あたりの平均バイト数を計算する正しい方法は何ですか(最終的には* 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:

これにより、上記の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 に答える