使用 awk 从不同时间读取的 2 个文件中的单行收集网络使用情况
Using awk to gather network use from a single line in 2 files read at different times
简而言之,我正在尝试构建一个 genmon 脚本,该脚本在 1-liner 中使用 awk 来监控网络传输,以减少 CPU 使用。
我的目标是希望此脚本每 0.25 秒更新一次。
我目前拥有的是一个 4 行脚本:
PTXRX=( $(awk 'FNR==1' "/sys/class/net//statistics/tx_bytes" "/sys/class/net//statistics/rx_bytes") )
sleep 0.125
CTXRX=( $(awk 'FNR==1' "/sys/class/net//statistics/tx_bytes" "/sys/class/net//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
试试这个:
IFS= read -r ptx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net//statistics/rx_bytes"
sleep 0.125
IFS= read -r ctx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r crx < "/sys/class/net//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 }'
如果这没有帮助,那么您将无法解决此代码段中的性能问题,您将不得不重新考虑每 0.125 秒循环和调用一次命令的方法。
如果您正在使用 bash,您可以将剩余的 awk 调用替换为:
printf 'tx: %.2f KiB/s\nrx: %.2f KiB/s\n' $(( (ctx-ptx)/512 )) $(( (crx-prx)/512 ))
但它仍然不会产生显着差异。
您可以尝试的最后一件事可能会从中挤出更好的性能(或者甚至可能更差,但您可以尝试):
IFS= read -r ptx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net//statistics/rx_bytes"
sleep 0.125
awk -v ptx="$ptx" -v prx="$prx" -v tx_bytes="/sys/class/net//statistics/tx_bytes" -v rx_bytes="/sys/class/net//statistics/rx_bytes" 'BEGIN{
getline ctx < tx_bytes
getline crx < rx_bytes
printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512
}'
简而言之,我正在尝试构建一个 genmon 脚本,该脚本在 1-liner 中使用 awk 来监控网络传输,以减少 CPU 使用。
我的目标是希望此脚本每 0.25 秒更新一次。
我目前拥有的是一个 4 行脚本:
PTXRX=( $(awk 'FNR==1' "/sys/class/net//statistics/tx_bytes" "/sys/class/net//statistics/rx_bytes") )
sleep 0.125
CTXRX=( $(awk 'FNR==1' "/sys/class/net//statistics/tx_bytes" "/sys/class/net//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
试试这个:
IFS= read -r ptx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net//statistics/rx_bytes"
sleep 0.125
IFS= read -r ctx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r crx < "/sys/class/net//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 }'
如果这没有帮助,那么您将无法解决此代码段中的性能问题,您将不得不重新考虑每 0.125 秒循环和调用一次命令的方法。
如果您正在使用 bash,您可以将剩余的 awk 调用替换为:
printf 'tx: %.2f KiB/s\nrx: %.2f KiB/s\n' $(( (ctx-ptx)/512 )) $(( (crx-prx)/512 ))
但它仍然不会产生显着差异。
您可以尝试的最后一件事可能会从中挤出更好的性能(或者甚至可能更差,但您可以尝试):
IFS= read -r ptx < "/sys/class/net//statistics/tx_bytes"
IFS= read -r prx < "/sys/class/net//statistics/rx_bytes"
sleep 0.125
awk -v ptx="$ptx" -v prx="$prx" -v tx_bytes="/sys/class/net//statistics/tx_bytes" -v rx_bytes="/sys/class/net//statistics/rx_bytes" 'BEGIN{
getline ctx < tx_bytes
getline crx < rx_bytes
printf "tx: %.2f KiB/s\nrx: %.2f KiB/s\n", (ctx-ptx)/512, (crx-prx)/512
}'