简而言之,我正在尝试构建一个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
答案 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 ))