Linux: limitando o throughput de dados (pipe) em bytes por segundo?

3

Eu estava vagando se houvesse um programa Linux que pudesse limitar o throughput de dados de um pipe - em real bytes por segundo ?.

Pelo que eu entendi, aplicável para os propósitos seria

O que eu quero é poder especificar algo como

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

... e na verdade tem um único byte do exemplo.txt enviado a cada 1/100 = 0.01 seg (ou 10 ms) para 'output' ..

    
por sdaau 18.03.2011 / 11:11

4 respostas

0

Bem, eu decidi corrigir cpipe , você pode encontrar o patch aqui: cpipe-3.0.1-singlebyte.patch ; é em relação ao atual ' apt-get source cpipe ' no Lucid (que me pega cpipe_3.0.1.orig.tar.gz e cpipe_3.0.1-1.diff.gz); quando a fonte baixar e desempacotar o cpipe-3.0.1 dir, simplesmente faça:

$ 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

Adicionado um switch de linha de comando -bs para 'byte single', que agora pode suportar gravações de byte único até 1 Bps; então agora pode fazer:

$ 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

... no entanto, isso não funcionará muito bem para taxas mais altas de kB / s - então, nesse caso, é melhor usar a técnica usual cpipe -s buffered ...

$ 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

..., como também diz em man cpipe :

Since on most systems there is a certain minimum time usleep() sleeps, e.g. 0.01s, it is impossible to reach high limits with a small buffer size

Bem .. espero ouvir que há uma maneira melhor de controlar isso,
Felicidades!

    
por 18.03.2011 / 14:30
3

Você poderia tentar mbuffer (não sei se está no Debian por padrão):

cat example.txt | mbuffer -R 100 > /dev/ttyUSB0
    
por 18.03.2011 / 11:19
1

pv também pode fazer isso. Aqui estão alguns exemplos moderadamente inventados:

  • 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
por 24.05.2016 / 23:53
0

Aqui também é um script somente em Perl, cratelimit.pl - possivelmente não muito preciso, mas parece fazer o truque um pouco ( -r argumento aceita bytes por segundo):

cat whatever | ./cratelimit.pl -r=50000
    
por 01.09.2011 / 20:16