Linux: Ограничение пропускной способности (канал) в байтах в секунду?

2173
sdaau

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

Из того, что я понимаю, применимо для этих целей

Я хотел бы иметь возможность указать что-то вроде

cat example.txt | ratelimit -Bps 100 > /dev/ttyUSB0 

... и фактически имеет один байт из example.txt, отправляемый каждые 1/100 = 0,01 сек (или 10 мс) для вывода.

3

4 ответа на вопрос

3
bmk

Вы можете попробовать mbuffer(не знаю, есть ли он в Debian по умолчанию):

cat example.txt | mbuffer -R 100 > /dev/ttyUSB0 
Привет @bmk, спасибо и +1 за твой ответ, так как я не знал о [mbuffer: измерительный буфер] (http://linux.die.net/man/1/mbuffer)! Кроме того, `sudo apt-get install mbuffer` в Ubuntu работает нормально. Однако` -R 100` вызывает 'mbuffer: fatal: недопустимое низкое значение для опции "-R" - отсутствует суффикс? `'; требуется не менее 101 (согласно [mbuffer.c] (http://svn.ringlet.net/svn/ringlet/sysutils/mbuffer/branches/vendor/mbuffer/mbuffer.c)). Наконец, кажется, что он использует ограничение только для заполнения своего собственного промежуточного буфера - но все равно записывает частями с большими битами в секунду (пока он буферизируется, у меня нет активности на USB!) Спасибо и ура! sdaau 13 лет назад 0
1
Jonas Kölker

pv can also do it. Here are some moderately contrived examples:

  • pv --rate-limit 1 /dev/zero > /dev/null
  • pv --quiet --rate-limit 16 /dev/urandom | hd
  • pv --quiet --rate-limit 10485760 /dev/zero | gzip | hd
  • head -c 1000 < /dev/zero | pv --size 1000 --rate-limit 150 | sha1sum
0
sdaau

Ну, я решил патч cpipe, вы можете найти патч здесь: cpipe-3.0.1-singlebyte.patch ; это по отношению к текущему ' apt-get source cpipe' в Lucid (который получает меня cpipe_3.0.1.orig.tar.gz и cpipe_3.0.1-1.diff.gz); когда источник загружает и распаковывает каталог cpipe-3.0.1, просто выполните:

$ cp -a cpipe-3.0.1 cpipe-3.0.1B $ cd cpipe-3.0.1B $ patch -p1 < /path/to/cpipe-3.0.1-singlebyte.patch $ make 

Добавлен параметр командной строки -bs для 'байтового одиночного', который теперь может поддерживать однобайтовую запись до 1 Bps; так что теперь можно сделать:

$ echo "hello" | ./cpipe -vt -vw -bs 1 | cat  ./cpipe: period 1 sec, 1000.000000 ms, 1000000000 ns, 0.000000 nsrem  h out: 1000.122ms at 0B/s ( 6B/s avg) 6B e out: 2000.343ms at 0B/s ( 2B/s avg) 6B l out: 3000.536ms at 1B/s ( 1B/s avg) 6B l out: 4000.730ms at 1B/s ( 1B/s avg) 6B o out: 5000.925ms at 1B/s ( 0B/s avg) 6B  out: 6001.100ms at 1B/s ( 0B/s avg) 6B out: 6001.155ms at 1B/s ( 0B/s avg) 6B thru: 6001.209ms at 1B/s ( 1B/s avg) 6B  $ echo "hello" | ./cpipe -vt -vw -bs 5 > /dev/null ./cpipe: period 0 sec, 200.000000 ms, 200000000 ns, 200000000.000000 nsrem  out: 200.120ms at 0B/s ( 30B/s avg) 6B out: 400.323ms at 2B/s ( 10B/s avg) 6B out: 600.507ms at 3B/s ( 5B/s avg) 6B out: 800.690ms at 4B/s ( 3B/s avg) 6B out: 1000.870ms at 4B/s ( 2B/s avg) 6B out: 1201.049ms at 4B/s ( 1B/s avg) 6B out: 1201.098ms at 5B/s ( 1B/s avg) 6B thru: 1201.142ms at 5B/s ( 5B/s avg) 6B 

... однако, это не будет работать слишком хорошо для более высоких скоростей кбит / с - так что в этом случае лучше использовать обычную cpipe -sбуферизованную технику ...

$ cat /etc/X11/rgb.txt | ./cpipe -vt -vw -bs 102400 > /dev/null .... out: 2675.206ms at 6.3kB/s ( 1B/s avg) 17.0kB out: 2675.240ms at 6.3kB/s ( 1B/s avg) 17.0kB thru: 2675.832ms at 6.3kB/s ( 6.3kB/s avg) 17.0kB  $ cat /etc/X11/rgb.txt | ./cpipe -vt -vw -s 100 > /dev/null out: 0.011ms at 1.5GB/s ( 1.5GB/s avg) 17.0kB thru: 166.630ms at 101.9kB/s ( 101.9kB/s avg) 17.0kB 

... как говорится также в man cpipe:

Поскольку в большинстве систем существует определенное минимальное время ожидания usleep (), например 0,01 с, невозможно достичь высоких пределов с небольшим размером буфера

Ну ... надеюсь услышать, что есть лучший способ контролировать это,
ура!

0
sdaau

Вот также скрипт только для Perl, cratelimit.pl - возможно, не очень точный, но, похоже, что-то делает ( -rаргумент принимает байтов в секунду):

cat whatever | ./cratelimit.pl -r=50000 

Похожие вопросы