сделать вывод stdout с определенной скоростью - PullRequest
6 голосов
/ 28 октября 2008

Для нагрузочного теста моего приложения (под Linux) я ищу инструмент, который выводит данные на стандартный вывод с определенной скоростью (например, 100 байт / с), чтобы я мог передать вывод в netcat, который это к моему заявлению. Какой-то вариант для dd был бы идеальным, но я пока ничего не нашел. Неважно, какие данные печатаются (NUL-байты в порядке). Есть намеки?

Ответы [ 4 ]

5 голосов
/ 28 октября 2008

Я написал быструю программу, которая принимает один аргумент, сколько 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);
    }
}
3 голосов
/ 29 июня 2012

Я думаю, что это то, что вы действительно хотите: Просмотрщик труб

Использование <fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output> ограничит канал до требуемой скорости.

2 голосов
/ 28 октября 2008

Если вы можете получать все сто байт за раз, вы можете сделать цикл с sleep и простым старым echo в оболочке как минимум с первой попытки.

0 голосов
/ 28 октября 2008

Ну, теперь я использую nuttcp вместо "реальных" нагрузочных тестов. Кажется, что накладные расходы довольно низкие, поэтому тестовая система не слишком сильно нарушена.

...