使用awk从在不同时间读取的2个文件中的一行收集网络使用情况

时间:2019-04-28 13:17:45

标签: awk xfce

简而言之,我正在尝试构建一个genmon脚本,该脚本在1-liner中使用awk监视网络传输,以减少CPU使用。

我的目标是让此脚本每0.25秒更新一次。

我目前拥有的是4行脚本:

PTXRX=( $(awk 'FNR==1' "/sys/class/net/${1}/statistics/tx_bytes" "/sys/class/net/${1}/statistics/rx_bytes") )
sleep 0.125
CTXRX=( $(awk 'FNR==1' "/sys/class/net/${1}/statistics/tx_bytes" "/sys/class/net/${1}/statistics/rx_bytes") )
awk -v ptx=${PTXRX[0]} -v prx=${PTXRX[1]} -v ctx=${CTXRX[0]} -v crx=${CTXRX[1]} 'BEGIN {printf "tx: %.2f KiB/s\nrx: %.2f KiB/s", (ctx-ptx)/512, (crx-prx)/512 }'

0.125,因为该插件需要时间来显示更新,因此我们将时间缩短一半,并将值加倍(相差不远)。

样本数据:(文件中应包含预期数据)

tx_bytes: 284425478
rx_bytes: 3450790917

sleep 0.125

tx_bytes: 284426024
rx_bytes: 3450790917

这个问题是它占用了我10-20%的CPU ...
如何将其减少为一个awk命令并提高性能?

对于需要视觉理解这些功能的人来说,结果应该显示以下内容:

tx: 0.00 KiB/s
rx: 0.00 KiB/s

1 个答案:

答案 0 :(得分:2)

尝试一下:

Ienumrator<int> rator = MyList.GetEnumrator();

try{
   while(rator.MoveNext())
{
    int i = rator.Current; 
    Console.WriteLine(i); 
}
}
finally{
rator.Dispose()
}

如果这没有帮助,那么您将无法解决此代码段中的性能问题,并且必须重新考虑每0.125秒执行一次循环和调用命令的方法。

如果您使用的是bash,则可以将其余对awk的调用替换为:

IFS= read -r ptx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net/${1}/statistics/rx_bytes"
sleep 0.125
IFS= read -r ctx < "/sys/class/net/${1}/statistics/tx_bytes"
IFS= read -r crx < "/sys/class/net/${1}/statistics/rx_bytes"
awk -v ptx="$ptx" -v prx="$prx" -v ctx="$ctx" -v crx="$crx" 'BEGIN {printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512 }'

但是它仍然不会产生重大变化。

您可以尝试的最后一件事是,可以从中榨取稍微更好的性能(或者可能更糟,但是您可以尝试):

printf 'tx: %.2f KiB/s\nrx: %.2f KiB/s\n' $(( (ctx-ptx)/512 )) $(( (crx-prx)/512 ))