2009-10-06 3 views
2

C 또는 셸 스크립트를 사용하여 전송 및 수신 네트워크 사용률을 계산하는 방법은 무엇입니까?전송 및 수신 네트워크 사용률을 계산하는 방법

내 시스템은 임베디드 리눅스입니다. 현재의 방법은 수신 된 바이트를 기록하고 (b1) 1 초 기다린 다음 다시 기록합니다 (b2). 그런 다음 링크 속도를 알고, 나는 사용 된 수신 대역폭의 백분율을 계산합니다.

활용도 = ((((B2)를 - B1) * 8)/link_speed) 수신 * 100

더 나은 방법이 있는가?

+0

왜 (b2-b1)을 8로 곱합니까? – csl

+0

@csl : 링크 속도는 bitspersecond가 될 것입니다. 비트를 비트로 변경하는 이유는 무엇입니까? – vpram86

+0

@Aviator 어쩌면 상수에 이미 포함되어 있어야합니다. _link_speed_ – csl

답변

0

'csl'덕분에 vnstat의 방향으로 나를 가리키게되었습니다. 여기에 vnstat 예제를 사용하면 네트워크 사용률을 계산하는 방법이 있습니다.

#define FP32 4294967295ULL 
#define FP64 18446744073709551615ULL 
#define COUNTERCALC(a,b) (b>a ? b-a : (a > FP32 ? FP64-a-b : FP32-a-b)) 
int sample_time = 2; /* seconds */ 
int link_speed = 100; /* Mbits/s */ 
uint64_t rx, rx1, rx2; 
float rate; 

/* 
* Either read: 
* '/proc/net/dev' 
* or 
* '/sys/class/net/%s/statistics/rx_bytes' 
* for bytes received counter 
*/ 

rx1 = read_bytes_received("eth0"); 
sleep(sample_time); /* wait */ 
rx2 = read_bytes_received("eth0"); 

/* calculate MB/s first the convert to Mbits/s*/ 
rx = rintf(COUNTERCALC(rx1, rx2)/(float)1048576); 
rate = (rx*8)/(float)sample_time; 

percent = (rate/(float)link_speed)*100; 
3

유사한 기능을하는 오픈 소스 프로그램을 확인하십시오.

내 검색에서 vnstat이라는 작은 도구가 나타납니다.

가능한 경우/proc 파일 시스템을 쿼리하고 시스템이없는 시스템에 getifaddrs을 사용합니다. 그래서 당신은 아마해야,

ifinfo.rx = ifd->ifi_ibytes; 
ifinfo.tx = ifd->ifi_obytes; 

은 또한 정확히 일초보다 더 잘 수있는 수면()를 기억 : 그것은 다음과 같이 바이트를 송수신 판독 한 후, 올바른 AF_LINK 인터페이스를 가져옵니다 해당 if_data 구조체를 가져와 귀하의 방정식에 고해상도 (벽시계) 타이머를 사용하십시오. 또는 if 함수와 구조를 파헤쳐 귀하의 작업에 적합한 것을 발견 할 수 있습니다.

+0

좋습니다! :) 그냥 그것에 찾고 있었어요 :) – vpram86

+0

vnstat - 유망한 것처럼 보입니다, 나는 그것에 대해 조사 할 것입니다. – Andrew

관련 문제