パイプのデータスループットを制限できるLinuxプログラムがあるかどうか迷っていました-実際のバイト/秒?.
私が集めたものから、目的に適用できるのは
bfr
ただし、Debianから削除されました( 削除候補:bfr )cpipe
ただし、サポートされる最低解像度はkB/sのようです。つまり、バッファ書き込みは引き続きMB/sに達する可能性があります( [解決済み]ターミナルパイプ速度を制限するプログラムはありますか? -ページ2-Ubuntuフォーラム )私が欲しいのは、次のようなものを指定できるようにすることです
cat example.txt | ratelimit -Bps 100 > /dev/ttyUSB0
...そして実際にはexample.txtからの1バイトが1/100 = 0.01秒(または10ミリ秒)ごとに「出力」に送信されます。
さて、私はcpipe
にパッチを当てることにしました。パッチはここにあります: cpipe-3.0.1-singlebyte.patch ; Lucidの現在の「apt-get source cpipe
」(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
'bytesingle'のコマンドラインスイッチ-bsを追加しました。これにより、1Bpsまでのシングルバイト書き込みをサポートできるようになりました。だから今できる:
$ 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
...ただし、これはkB/sレートが高い場合はうまく機能しません。その場合は、通常の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秒、小さなバッファサイズで上限に達することは不可能です
まあ..これを制御するより良い方法があると聞きたいです、
乾杯!
mbuffer
を試すことができます(デフォルトでDebianにあるかどうかはわかりません):
cat example.txt | mbuffer -R 100 > /dev/ttyUSB0
pv
もそれを行うことができます。適度に工夫された例を次に示します。
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
これもPerlのみのスクリプトです cratelimit.pl -おそらくあまり正確ではありませんが、多少はうまくいくようです(-r
引数は1秒あたりのバイト数を受け入れます):
cat whatever | ./cratelimit.pl -r=50000