Как оценить скорость трубы под Linux?

58

Есть ли фильтр, который я мог бы использовать для ограничения скорости канала в Linux? Если это существует, пусть это называется ограничение скорости, я хочу иметь возможность набирать в терминале что-то вроде

cat /dev/urandom | rate-limit 3 -k | foo

чтобы отправить поток случайных байтов на стандартный ввод foo со скоростью (ниже) 3 кбайт / с.

Frédéric Grosshans
источник
1
Я спросил здесь, потому что я хочу использовать его в программе, а не для устранения неполадок. Но это мой самый первый вопрос, поэтому я прошу прощения за ошибку.
1
Кстати, вышеупомянутое является ненужным использованием кошки, вы могли бы сделать rate-limit 3k < /dev/urandom | foo,
dmckee

Ответы:

80

Просмотрщик труб имеет эту особенность.

cat /dev/urandom | pv -L 3k | foo
Juliano
источник
1
Также удобно использовать при просмотре результатов работы, с -q... например: command 2>&1 | pv -q -L 3k
Attie
17

Я бы сказал, что Джулиано получил правильный ответ если у вас есть этот инструмент, но я бы также предположил, что это изящное небольшое упражнение в стиле K & amp; R: просто напишите специализированную версию cat, которая читает по одному символу за раз stdinвыводит каждый к stdout а потом usleep с, прежде чем двигаться дальше. Быть уверенным снять стандартный вывод , или это будет работать довольно резко.

Я назвал это slowcat.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char**argv){
  int c;
  useconds_t stime=10000; // defaults to 100 Hz

  if (argc>1) { // Argument is interperted as Hz
    stime=1000000/atoi(argv[1]);
  }

  setvbuf(stdout,NULL,_IONBF,0);

  while ((c=fgetc(stdin)) != EOF){
    fputc(c,stdout);
    usleep(stime);
  }

  return 0;
}

Скомпилируйте и попробуйте с

$ ./slowcat 10 < slowcat.c
dmckee
источник
17
Теперь я испытываю ужасное искушение добавить «глухой» шум каждому персонажу и установить скорость по умолчанию 40 CPS, с дополнительной задержкой для перевода строки.
dmckee
Я бы использовал это с одним из этих ретро-экранных заставок для смеха, если бы у меня были подключены динамики к моим Linux-коробкам.
Benny Mackney
4

Вот решение для всех оболочек, которое не потеряет ввод (см. Идею head -1 от Mike S):

hexdump -c /dev/urandom | (lines=0; while read line; do echo $line; if [ $((++lines % 10)) -eq 0 ]; then sleep 1; fi; done) | cat -n
BrianHoltz
источник
4

дроссель кажется разработан конкретно за это. например

cat /dev/urandom | throttle -k 3 | foo
Ponkadoodle
источник
1
Я бы с этим согласился, но стандартного пакета для Ubuntu не существует. Я также не вижу исходного кода для него. Кто-нибудь знает, где можно взять эту утилиту?
Benjamin Leinweber
1
@ BenjaminLeinweber Похоже, сайт, на котором обычно размещается код не в сети, но у freebsd есть источник 1.2, доступный на их FTP-сервер , Вам нужно скачать его там & amp; ./configure && make,
Ponkadoodle
2

Быстро и грязно, все оболочки все время (у меня CentOS и pv не поставляется с ним по умолчанию):

hexdump -c /dev/urandom | while true; do head -1; sleep 1; done | \
your_program_that_reads_stdin  -your_argument_list

... грязный, потому что, хотя он ограничен в скорости, он взрывной со скоростью, которую я не могу вам сказать :-). Но это удобно, когда вам просто нужно отправить данные из одного места в другое (я делал несколько тестов socat), и вы не хотите забивать свой экран мусором.

Mike S
источник