awk 中只有 x > y 时才输出值

awk 中只有 x > y 时才输出值

输入:

0:root@server:/root # vmstat 60 2

System configuration: lcpu=52 mem=131072MB ent=10.00

kthr    memory              page              faults              cpu          
----- ----------- ------------------------ ------------ -----------------------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec
 5  0 13254063 12378057   0   0   0   0    0   0 3411 22516 9063 10  2 88  0  1.94  19.4
 5  0 13341251 12290955   0   0   0   0    0   0 3507 20192 9062  9  2 89  0  1.88  18.8
0:root@server:/root # 

所需输出:

0

它为零,因为平均 r < lcpu。在这种情况下,“id”值并不重要。

另一个输入:

0:root@server:/root # vmstat 60 2

System configuration: lcpu=52 mem=131072MB ent=10.00

kthr    memory              page              faults              cpu          
----- ----------- ------------------------ ------------ -----------------------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec
 52  0 13254063 12378057   0   0   0   0    0   0 3411 22516 9063 10  2 6  0  1.94  19.4
 53  0 13341251 12290955   0   0   0   0    0   0 3507 20192 9062  9  2 4  0  1.88  18.8
0:root@server:/root # 

所需输出:

95

它是95,因为平均r > lcpu。是95,因为id表示空闲,但是我们需要cpu消耗。所以 6+4 是空闲值,它们的平均值是 5。所以 100-5 = 95% 是 cpu 负载。

“r”中也需要平均值!不只是在“id”中。在上一个示例中,它是 52.5,因此它大于 52。

这是衡量 CPU 消耗的通用 UNIX 问题。如果 r > lcpu 并且 cpu 使用率百分比非常高,则存在 CPU 瓶颈。

有趣的是,没有处理 vmstat 输出的解决方案,这就是为什么我向 awk 大师询问这个问题。

问题:所以我需要这样的东西:“vmstat 60 2 | GODLY-AWK-MAGIC-HERE”

欲了解更多详细信息,请参阅(我找不到更好的链接):

http://aix4admins.blogspot.com/2011/09/vmstat-t-5-3-shows-3-statistics-in-5.html

如果可运行线程 (r) 除以 CPU 数量大于 1 -> 可能是 CPU 瓶颈

答案1

非常粗暴:

awk '
    BEGIN { d = -1 }
    /lcpu/ { lcpu = substr($3, 6); next }
    $1 == "r" { ++d; next }
    d < 0 { next }
    {
        ++d
        r += $1
        id += $16
        next
    }
    END {
        if (r / d > lcpu)
            print 100 - id / d
        else
            print 0
    }
'

或者如果你喜欢:

awk '
    /lcpu/ { lcpu=substr($3, 6) }
    $1 ~ /[0-9]+/ {
        ++d
        r += $1
        id += $16
        next
    }
    END {
        print (r/d>lcpu) ? 100 - id / d : 0
    }
'

到:

awk '/lcpu/{lcpu=substr($3,6)}$1~/[0-9]+/{++d;r+=$1;id+=$16;next;}END{print(r/d>lcpu)?100-id/d:0}'

它能给出您想要的结果吗?

相关内容