Linux: Begrenzung des Datendurchsatzes (Pipe) in Bytes pro Sekunde?

2372
sdaau

Ich wanderte, wenn es ein Linux-Programm gibt, das den Datendurchsatz eines Pipe-In tatsächlich einschränken kann Bytes pro Sekunde .

Von dem, was ich erfahre, wäre dies für die Zwecke geeignet

Was ich möchte, ist, so etwas spezifizieren zu können

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

... und tatsächlich haben Sie ein einzelnes Byte aus example.txt, das jeweils 1/100 = 0,01 s (oder 10 ms) an 'output' gesendet wird.

3

4 Antworten auf die Frage

3
bmk

Sie könnten versuchen mbuffer(weiß nicht, ob es standardmäßig in Debian ist):

cat example.txt | mbuffer -R 100 > /dev/ttyUSB0 
Hallo @bmk, danke und +1 für deine Antwort, da ich [mbuffer: Messpuffer] nicht wusste (http://linux.die.net/man/1/mbuffer)! Auch "sudo apt-get install mbuffer" ist in Ubuntu in Ordnung. Allerdings führt "-R 100" zu "mbuffer: fatal: ungültiger niedriger Wert für Option" -R "- ​​fehlendes Suffix?` '; mindestens 101 wird benötigt (gemäß [mbuffer.c] (http://svn.ringlet.net/svn/ringlet/sysutils/mbuffer/branches/vendor/mbuffer/mbuffer.c)). Schließlich scheint es, dass das Limit nur zum Füllen des eigenen Zwischenspeichers verwendet wird - es werden jedoch immer noch Brocken mit großen Bps geschrieben (während es puffert, habe ich keine Aktivität auf USB!). Vielen Dank! sdaau vor 13 Jahren 0
1
Jonas Kölker

pvkann es auch tun. Hier einige mäßig erfundene Beispiele:

  • 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

Nun, ich habe mich für einen Patch entschieden, den Patch cpipefinden Sie hier: cpipe-3.0.1-singlebyte.patch ; es ist in Bezug auf das aktuelle ' apt-get source cpipe' in Lucid (was mir cpipe_3.0.1.orig.tar.gz und cpipe_3.0.1-1.diff.gz bringt); Wenn die Quelle das Verzeichnis herunterlädt und entpackt cpipe-3.0.1, machen Sie einfach Folgendes :

$ 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 

Befehlszeilenschalter -bs für 'Byte single' hinzugefügt, der jetzt das Schreiben von Einzelbytes auf 1 Bps unterstützt; so kann jetzt tun:

$ 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 

... dies funktioniert jedoch bei höheren kB / s-Raten nicht allzu gut - in diesem Fall ist es besser, die übliche cpipe -sgepufferte Technik zu verwenden ...

$ 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 

... wie es auch heißt in man cpipe:

Da auf den meisten Systemen eine bestimmte Mindestzeit für das Einschlafen von usleep (), z. B. 0,01 s, vorhanden ist, können mit einer kleinen Puffergröße keine hohen Grenzwerte erreicht werden

Nun, ich hoffe zu hören, dass es einen besseren Weg gibt, dies zu kontrollieren,
Cheers!

0
sdaau

Hier ist auch ein Perl-only-Skript, cratelimit.pl - möglicherweise nicht sehr genau, scheint jedoch den Trick etwas auszuführen ( -rArgument akzeptiert Bytes pro Sekunde):

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