以特定的速度执行stdout输出

对于我的应用程序(在Linux下)的负载testing,我正在寻找一个工具,在特定的速率(如100字节/秒)输出标准输出数据,以便我可以pipe输出到netcat,它发送给我应用。 dd的一些选项将是理想的,但到目前为止我没有find任何东西。 打印什么样的数据并不重要(NUL字节可以)。 任何提示?

我认为这是你真正想要的: Pipe Viewer

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

我写了一个快速程序,它接受一个参数,每秒打印多少个字符到标准输出(负参数表示没有速率限制)。 希望这可以帮助! :-)(在GNU libc上,您需要将程序与-lrt

编辑:修改为默认打印点,除非指定了第二个参数,在这种情况下,使用了第一个字符。 (这意味着,如果你想打印NUL字符,只需指定一个空字符串作为第二个参数。:-))

 #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); } } 

如果您一次只能获得所有的一百个字节,那么您至少可以在shell中做一个带有sleep和普通旧echo的循环。

那么,我现在使用nuttcp来做“真正的”负载测试。 它似乎有相当低的开销,所以测试系统没有太多的干扰。