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이므로 0입니다. 이 경우 "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

평균 r > lcpu이므로 95입니다. ID가 유휴 상태를 나타내므로 95이지만 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}'

원하는 결과를 제공합니까?

관련 정보