6

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

4

4 回答 4

5

A我写了一个快速程序,它接受一个参数,即每秒打印多少个字符到标准输出(负参数意味着没有速率限制)。希望这可以帮助!:-) (在 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);
    }
}
于 2008-10-28T10:30:28.990 回答
3

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

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

于 2012-06-29T14:04:54.990 回答
2

如果您可以一次获取所有一百个字节,那么您至少可以在 shell 中执行一个循环sleep并使用普通的旧echo版本作为第一次尝试。

于 2008-10-28T09:55:30.590 回答
0

好吧,我现在使用 nuttcp 来进行“真正的”负载测试。它的开销似乎很低,因此测试系统并没有受到太多干扰。

于 2008-10-28T10:19:05.380 回答