2008-10-28 8 views
6

내 응용 프로그램 (Linux에서)의 부하 테스트의 경우 특정 속도 (예 : 100 바이트/s)로 표준 출력에 데이터를 출력하는 도구를 찾고 있습니다. 내 응용 프로그램에 보내는 netcat의 출력. dd 옵션이 이상적이지만, 지금까지 아무것도 찾지 못했습니다. 어떤 종류의 데이터가 인쇄되는지는 중요하지 않습니다 (NUL 바이트는 정상입니다). 어떤 힌트?특정 속도로 stdout 출력 수행

+0

특파원은 pipe를 netcat에 사용하는 것이 파이프가 제한 요소가 될 수 있음을 의미한다고 나에게 말했습니다. 따라서 당신이 찾는 속도로 소켓에 직접 쓸 수 있습니다. –

답변

3

(. 그리고 당신이 NUL 문자를 인쇄 할 경우, 단지 두 번째 인수로 빈 문자열 :-)를 지정 의미) : Pipe Viewer

<fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output>을 사용하면 파이프가 요청 된 속도로 제한됩니다.

2

한 번에 100 바이트를 모두 얻는 것이 좋으면 최소한 루프를 사용하고 셸에서 평범한 이전 echo을 첫 번째 시도로 사용할 수 있습니다.

+0

좋은 아이디어 - "while [true]와 같음, echo -n"1234567890 "; usleep 10000; done"은 이미 작동합니다. – oliver

0

음, 이제 nuttcp를 사용하여 대신 "실제"부하 테스트를 수행합니다. 오버 헤드가 매우 낮아 테스트 시스템이 너무 많이 방해받지는 않습니다.

5

하나의 인수 (초당 표준 출력으로 인쇄 할 문자 수 A)를 사용하는 빠른 프로그램을 작성했습니다 (음의 인수는 속도 제한 없음을 의미합니다). 희망이 도움이! :-) GNU libc에서 프로그램을 -lrt과 연결해야합니다.

편집 : 두 번째 인수가 지정되지 않은 한 기본적으로 점을 인쇄하도록 수정됩니다.이 경우 첫 번째 문자가 사용됩니다. 나는 이것이 당신이 정말로 원하는 무엇이라고 생각

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <unistd.h> 

int 
sleeptill(const struct timespec *when) 
{ 
    struct timespec now, diff; 

    clock_gettime(CLOCK_REALTIME, &now); 
    diff.tv_sec = when->tv_sec - now.tv_sec; 
    diff.tv_nsec = when->tv_nsec - now.tv_nsec; 
    while (diff.tv_nsec < 0) { 
     diff.tv_nsec += 1000000000; 
     --diff.tv_sec; 
    } 
    if (diff.tv_sec < 0) 
     return 0; 
    return nanosleep(&diff, 0); 
} 

int 
main(int argc, char **argv) 
{ 
    double rate = 0.0; 
    char *endp; 
    struct timespec start; 
    double offset; 

    if (argc >= 2) { 
     rate = strtod(argv[1], &endp); 
     if (endp == argv[1] || *endp) 
      rate = 0.0; 
     else 
      rate = 1/rate; 

     if (!argv[2]) 
      argv[2] = "."; 
    } 

    if (!rate) { 
     fprintf(stderr, "usage: %s rate [char]\n", argv[0]); 
     return 1; 
    } 

    clock_gettime(CLOCK_REALTIME, &start); 
    offset = start.tv_nsec/1000000000.0; 

    while (1) { 
     struct timespec till = start; 
     double frac; 
     double whole; 

     frac = modf(offset += rate, &whole); 
     till.tv_sec += whole; 
     till.tv_nsec = frac * 1000000000.0; 
     sleeptill(&till); 
     write(STDOUT_FILENO, argv[2], 1); 
    } 
} 
+1

최신 개정판을 사용하면 속도로 0을 지정할 수 있습니다. 전문적으로, 그것은 "영원히"기다리지 않습니다 (수학적으로 그렇듯이). 오히려 time_t가 끝날 때까지 기다립니다 (2038 년 1 월, 32 비트 time_t가있는 플랫폼에서). 그래도 꽤 오래 기다려야합니다. :-D –

+0

좋은 물건 - 고마워! 어떻게 사람들이 변경 사항을 추가 할 수 있도록 일부 개정 관리 사이트 (github, launchpad, sourceforge ...)에 올려 놓는 것이 좋습니까? 또한 성능을 위해 한 번에 전체 데이터 블록을 작성하는 것이 유용 할 것이라고 생각합니다. – oliver

+0

의도적으로 버퍼링없이 write()를 사용하여 데이터가 일정한 속도로 보장됩니다. 버퍼링을 사용하려면 write() 호출을 putchar (* argv [2])로 변경하십시오. :-) 공공 개정 관리에 대해 내가 할 수있는 일을 볼 수 있습니다 .... –