Somente valor de saída se x y no awk

1

ENTRADA:

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 # 

SAÍDA NECESSÁRIA:

0

É zero, uma vez que a média r < lcpu. Os valores de "id" não são importantes neste caso.

outro INPUT:

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 # 

SAÍDA NECESSÁRIA:

95

É 95, porque a média r > lcpu. E é 95, porque id significa ocioso, mas precisamos do consumo de CPU. Então 6 + 4 é o valor inativo, a média deles é 5. Então 100-5 = 95% é a carga da cpu.

A média é necessária nos "r" também! Não apenas em "id". No último exemplo é 52,5, então foi maior que 52.

Este é um problema geral do UNIX para medir o consumo de CPU. Se r > lcpu e o uso da CPU% é muito alto, então temos um gargalo na CPU.

É interessante que não há solução para o processamento da saída do vmstat, por isso estou perguntando aos grandes mestres do awk sobre isso.

Pergunta : Então eu preciso de algo assim: "vmstat 60 2 | GODLY-AWK-MAGIC-AQUI"

Para mais detalhes, consulte (não consegui encontrar um link melhor):

link

If runnable threads (r) divided by the number of CPU is greater than one -> possible CPU bottleneck

    
por naki vagyok 24.03.2016 / 23:34

1 resposta

0

Muito cru:

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
    }
'

ou se você gosta:

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

para:

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

Isso fornece os resultados desejados?

    
por 25.03.2016 / 00:32

Tags