6

私のアプリケーション (Linux で) の負荷テストのために、特定の速度 (100 バイト/秒など) で stdout にデータを出力するツールを探しています。応用。dd のいくつかのオプションが理想的ですが、これまでのところ何も見つかりませんでした。どのような種類のデータが出力されるかは問題ではありません (NUL バイトは問題ありません)。ヒントはありますか?

4

4 に答える 4

5

A標準出力に 1 秒間に何文字出力するかという 1 つの引数を取る簡単なプログラムを作成しました (負の引数は速度制限がないことを意味します)。お役に立てれば!:-) (GNU libc では、プログラムを とリンクする必要があります-lrt。)

編集:2番目の引数が指定されていない限り、デフォルトでドットを印刷するように改訂されました。指定された場合、その最初の文字が使用されます。(つまり、NUL 文字を出力したい場合は、2 番目の引数として空の文字列を指定するだけです。:-))

#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

これがあなたが本当に望んでいることだと思います:パイプビューア

を使用<fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output>すると、パイプが要求されたレートに制限されます。

于 2012-06-29T14:04:54.990 に答える
2

一度に 100 バイトすべてを取得しても問題ない場合は、少なくとも最初の試行として、シェル内でsleep単純に古いものを使用してループを実行できます。echo

于 2008-10-28T09:55:30.590 に答える
0

さて、代わりに「実際の」負荷テストを行うためにnuttcpを使用しています。オーバーヘッドが非常に低いように見えるため、テスト システムはあまり影響を受けません。

于 2008-10-28T10:19:05.380 に答える