2012-06-09 3 views
3

내 시스템에 카페인이 없는지 확실하지 않지만, 내 인생에서 올바른 방법이 무엇인지 알아낼 수 없습니다 (수학).압연 총계에서 처리량을 계산하십시오.

나는 수동으로 중지 될 때까지 구문 분석 된 ethtool -S의 값을 모두 'x'(이 테스트 동안 6 초)로 기록하는 스크립트를 가지고 있습니다. iterations 등 계산하는 방법에 대한 코드가 있지만 초당 평균 바이트를 올바르게 계산하는 방법을 알아낼 수 없습니다.

다음은 출력의 모습입니다 : 우리는 바이트가 모두 증가했다 볼 수 있듯이

Fri Jun 8 23:48:35 GMT 2012 {{{ 
============== Network Statistics =============== 
IFNAME  rx_bytes  tx_bytes 
eth0  27840111418  3083391508 
eth4  6153013050  18478875401 
eth5  686368648  238683883 
eth6  53863181321  2119523154 
eth7  23127231747  84602654827 
eth8  399517273166  1686004510 

Fri Jun 8 23:48:41 GMT 2012 {{{ 
============== Network Statistics =============== 
IFNAME  rx_bytes  tx_bytes 
eth0  27840118248  3083392896 
eth4  6153014438  18478876789 
eth5  686370036  238685271 
eth6  53863182709  2119524542 
eth7  23127238019  84602660337 
eth8  399519325260  1686018706 

, 나는 이것의 반복의 수천거야.

은 정확히입니다. 인터페이스별로 이러한 숫자를 완전히 계산하고 평균 초당 바이트 수를 계산합니다 (결과적으로 * 0.00000762939453을 통해 mbps로 이동합니다). 내가 해봤

모든 것은 지금까지 비참하게 ... 실패했습니다

\ 시간/인내심/도움을 주셔서 감사합니다!

편집 :: 내가 현재 라고 생각하는 것 내가해야 할 일은 데이터를 표준화하기 위해 rx/tx 바이트의 원래 값을 제거하는 것입니다. 초기 합계를 가져 오는 현재 (못생긴) 문자열은 다음과 같습니다.

int1_rx_bytes=`cat $logfile | grep $int1 | awk '{print $2}' | awk '{sum+=$1} END {printf "%f", sum}'` 

어디에서 뺄셈 목적으로 원래 번호를 삽입할까요? 참고로 이미 $ int1_orig_rx_bytes라는 변수가 있습니다

+0

나는 추가 할 때마다 원래의 합계를 뺀 값을 줄 필요가 있다고 생각하지만, 그럴 것이라고 확신하지는 않습니다. 너희들은 어떻게 생각하니? – Numpty

+0

나는이 질문을 이해하지 못했지만, '평균 또는 평균'을 계산하고자하는 것처럼 들리 네. 각 인터페이스를 가져 와서 평균 (rx_bytes/6)을 계산하고,이 평균을 합산 한 다음 다른 평균을 취합니다. sum_averages/보이는 인터페이스의 수. 또는 전체 시스템 평균의 경우 rx_bytes + tx_bytes를 합산하고 6으로 나누지 않습니까? – Pete855217

+0

왜 그 두려운 문자열을 곱하는 대신에'2^17' (131072)로 나누지 않습니까? –

답변

3

두 스크립트는 모두 테스트되지 않았습니다. 이동 평균의 경우

:

awk 'BEGIN { 
    period = 10 
    pcount=1 
} 
NR == 1 { 
    baserx = $2 
    basetx = $3 
} 
{ 
    rx[$1, pcount] = $2 - baserx 
    tx[$1, pcount] = $3 - basetx 
    ifaces[$1] 
    if (c >= period) { 
     rxsum = txsum = 0 
     for (iface in ifaces) { 
      for (i = 1; i <= period; i++) { 
       rxsum += rx[iface, i] 
       txsum += tx[iface, i] 
      } 
      print iface, rxsum/period, txsum/period 
     } 
    } else { 
     c++ 
    } 
    pcount = (pcount + 1) % period + 1 
}' 

편집 : 모든 항목의 평균

:

awk ' 
NR == 1 { 
    baserx = $2 
    basetx = $3 
} 
{ 
    rx[$1] += $2 - baserx 
    tx[$1] += $3 - basetx 
} 
END { 
    for (iface in rx) { 
     print iface, rx[iface]/NR, tx[iface]/NR 
    } 
}' 

항목이 출력이 보장되지 것이라고 순서. gawk이있는 경우이를 처리 할 정렬 함수를 추가하거나 sort 유틸리티를 사용할 수 있습니다.

편집 2 :

이 위의 두 번째 버전과 모든 종류의 문제를 해결합니다.

awk ' 
    BEGIN { 
     OFMT = "%.4f" 
    } 

    /^[[:blank:]]*$/ { next } 

    ! ($1 in prevrx) { 
     prevrx[$1] = $2 
     prevtx[$1] = $3 
     next 
    } 
    { 
     count[$1]++ 
     drx = $2 - prevrx[$1] 
     dtx = $3 - prevtx[$1] 
     rx[$1] += drx 
     tx[$1] += dtx 
     prevrx[$1] = $2 
     prevtx[$1] = $3 
    } 
    END { 
     for (iface in rx) { 
      print iface, rx[iface]/count[iface], tx[iface]/count[iface] 
     } 
}' 
+0

AWK, Python 또는 Perl로 작성된 단일, 우아하고 응집력있는 프로그램이 될 수있을 때 최종 결과가 서로 연결되는 작은 스크립트의 매시 (mish-mash)로 끝나지 않기를 바랍니다. –

+0

놀랍게도 내가 도와 준 마지막 스레드는 다른 스크립트 세트에 대한 것입니다. 이것은 단지 하나의 수집 데이터이며, 하나는 부검으로 분석됩니다. 또한 파이썬을 사용하고 싶지만이 환경에서는 사용할 수 없습니다. 배시 전용 (그리고 그 오래된). 또한 AWK에서 나는 매우 끔찍합니다. 어떻게 작동하는지 설명해 주시겠습니까? 도움을 주셔서 감사합니다 (다시) – Numpty

+0

또한, 그것을 더 가까이에서 보면 내가 옳은 것처럼 보이기에 너무 높은 숫자를 만들어 내고있는 것처럼 보입니다. 나는 원래 값이 각각 승계> 는 내가 지금 가지고하는 것은 (가짜 코드)에 추가되고이 때문에 믿고 : 'codeint1_rx_sum/반복/시간 int1_tx_sum/반복/시간 int1_rx_sum + int1_tx_sum = 총 처리량. 이것은 완전히 잘못되었습니다 (너무 높음). – Numpty

관련 문제