我想知道是否有一个Linux程序可以限制管道的数据吞吐量实际的每秒字节数?。
据我所知,适用于以下目的的是
bfr
然而,它已从 Debian 中删除(移除候选人:bfr)cpipe
不过,它支持的最低分辨率似乎为 KB/s,这意味着缓冲区写入仍然可以达到 KB/s([已解决] 有没有限制终端管道速度的程序? - 第 2 页 - Ubuntu 论坛)
我想要的是能够指定类似
cat example.txt | ratelimit -Bps 100 > /dev/ttyUSB0
...实际上,example.txt 中的一个字节每 1/100 = 0.01 秒(或 10 毫秒)发送到“输出”...
答案1
您可以尝试mbuffer
(不知道它是否默认在 Debian 中):
cat example.txt | mbuffer -R 100 > /dev/ttyUSB0
答案2
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
答案3
好吧,我决定修补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
为‘单字节’添加了一个命令行开关 -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
... 但是,对于更高的 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 秒,因此不可能以较小的缓冲区大小达到高限制
嗯..希望听到有更好的方法来控制这个,
干杯!
答案4
这也是一个仅限 Perl 的脚本,cratelimit.pl- 可能不太准确,但似乎有点作用(-r
参数接受每秒字节数):
cat whatever | ./cratelimit.pl -r=50000