내 응용 프로그램 (Linux에서)의 부하 테스트의 경우 특정 속도 (예 : 100 바이트/s)로 표준 출력에 데이터를 출력하는 도구를 찾고 있습니다. 내 응용 프로그램에 보내는 netcat의 출력. dd 옵션이 이상적이지만, 지금까지 아무것도 찾지 못했습니다. 어떤 종류의 데이터가 인쇄되는지는 중요하지 않습니다 (NUL 바이트는 정상입니다). 어떤 힌트?특정 속도로 stdout 출력 수행
답변
(. 그리고 당신이 NUL 문자를 인쇄 할 경우, 단지 두 번째 인수로 빈 문자열 :-)를 지정 의미) : Pipe Viewer
<fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output>
을 사용하면 파이프가 요청 된 속도로 제한됩니다.
한 번에 100 바이트를 모두 얻는 것이 좋으면 최소한 루프를 사용하고 셸에서 평범한 이전 echo
을 첫 번째 시도로 사용할 수 있습니다.
좋은 아이디어 - "while [true]와 같음, echo -n"1234567890 "; usleep 10000; done"은 이미 작동합니다. – oliver
음, 이제 nuttcp를 사용하여 대신 "실제"부하 테스트를 수행합니다. 오버 헤드가 매우 낮아 테스트 시스템이 너무 많이 방해받지는 않습니다.
하나의 인수 (초당 표준 출력으로 인쇄 할 문자 수 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);
}
}
최신 개정판을 사용하면 속도로 0을 지정할 수 있습니다. 전문적으로, 그것은 "영원히"기다리지 않습니다 (수학적으로 그렇듯이). 오히려 time_t가 끝날 때까지 기다립니다 (2038 년 1 월, 32 비트 time_t가있는 플랫폼에서). 그래도 꽤 오래 기다려야합니다. :-D –
좋은 물건 - 고마워! 어떻게 사람들이 변경 사항을 추가 할 수 있도록 일부 개정 관리 사이트 (github, launchpad, sourceforge ...)에 올려 놓는 것이 좋습니까? 또한 성능을 위해 한 번에 전체 데이터 블록을 작성하는 것이 유용 할 것이라고 생각합니다. – oliver
의도적으로 버퍼링없이 write()를 사용하여 데이터가 일정한 속도로 보장됩니다. 버퍼링을 사용하려면 write() 호출을 putchar (* argv [2])로 변경하십시오. :-) 공공 개정 관리에 대해 내가 할 수있는 일을 볼 수 있습니다 .... –
특파원은 pipe를 netcat에 사용하는 것이 파이프가 제한 요소가 될 수 있음을 의미한다고 나에게 말했습니다. 따라서 당신이 찾는 속도로 소켓에 직접 쓸 수 있습니다. –