2008-10-28 34 views
6

對於我的應用程序(在Linux下)的負載測試,我正在尋找一種工具,以特定速率(如100字節/秒)在標準輸出上輸出數據,以便管道輸出到netcat,將其發送到我的應用程序。 dd的某些選項會很理想,但到目前爲止我沒有找到任何東西。打印什麼樣的數據並不重要(NUL字節正常)。任何提示?以特定速度執行stdout輸出

+0

一位記者向我表示,使用管道連接netcat可能意味着管道可能是一個限制因素。因此,以您所尋求的速度直接寫入套接字更爲可靠。 – 2008-10-28 11:26:11

回答

3

我認爲這是你真正想要的:Pipe Viewer

使用<fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output>將限制管道到要求的速率。

2

如果您一次只能獲取所有的一百個字節,您可以至少在第一次嘗試時在shell中執行一個與sleep和普通舊版echo的循環。

+0

好主意 - 類似於「while [true];做echo -n」1234567890「;使用10000次;完成」已經有效。 – oliver 2008-10-28 10:16:57

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 – 2008-10-28 10:58:00