Pipe-Viewer 更改速率限制时出现问题

Pipe-Viewer 更改速率限制时出现问题

我用于pv通过 发送文件ssh

我可以将“active pv”限制更改为 100M 以下,没有任何问题。当我将活动pv进程设置为 100M 或 1G 或更高时,我无法再更改速率......

但!如果我将 1M 更改为 2M 5-10 次,2M 更改为 1Mpv有时可以设置为新速率。

我找不到解决该问题的方法。任何想法?

例子:

pv -R "15778"  -f -F "%p***%t***%e***%r***%b" -L 1M  
pv -R "15778"  -f -F "%p***%t***%e***%r***%b" -L 1G  
pv -R "15778"  -f -F "%p***%t***%e***%r***%b" -L 1M (not working anymore)  

答案1

这是由于会计核算造成的pv,这实际上意味着它的速率限制是读限制而不是写限制。看着源代码表明速率限制是由“目标”驱动的,即金额其余的发送。如果启用了速率限制,则每个速率限制评估周期一次,目标都会增加我们根据速率限制应该发送的数量;然后目标会减少实际写入的量。这意味着,如果您将速率限制设置为大于实际写入容量的值,则目标将不断上升;降低速率限制不会产生任何效果,直到pv达到其目标(包括根据新的速率限制允许写入的内容)。

要查看其实际效果,请启动一个基本的pv

pv /dev/zero /dev/null

然后控制:

pv -R 32605 -L 1M; sleep 10; pv -R 32605 -L 1G; sleep 1; pv -R 32605 -L 1M

您将通过改变第二次睡眠的持续时间来看到目标计算的影响......

由于写入限制,只有当您将速率限制设置为大于写入容量的值时,才会出现问题。

更详细地说,以下是在能够传输 400M 的连接上,流量最初限制为 1M,然后限制为 1G 5 秒,然后回到 1M 时的计费方式:

Time    Rate     Target Sent    Remaining
1       1M       1M     1M      0
2       1G       1G     400M    600M
3       1G       1.6G   400M    1.2G
4       1G       2.2G   400M    1.8G
5       1G       2.8G   400M    2.4G
6       1G       3.4G   400M    3G
7       1M       3001M  400M    2601M
8       1M       2602M  400M    2202M
9       1M       2203M  400M    1803M
10      1M       1804M  400M    1404M
11      1M       1405M  400M    1005M
12      1M       1006M  400M    606M
13      1M       607M   400M    207M
14      1M       208M   208M    0
15      1M       1M     1M      0

再次应用速率限制需要 7 秒。高速率限制花费的时间越长,执行降低的速率限制所需的时间就越长......

解决此问题的方法非常简单,如果您可以重新编译pv:在 中loop.c,将第 154 行更改为target =(from target +=),结果是

                   || (cur_time.tv_sec == next_ratecheck.tv_sec
                       && cur_time.tv_usec >=
                       next_ratecheck.tv_usec)) {
                       target =
                           ((long double) (state->rate_limit)) /
                           (long double) (1000000 /
                                          RATE_GRANULARITY);

一旦完成,就会立即应用速率限制降低(好吧,在一个速率限制周期内)。

答案2

看来是缓冲问题。这是我的测试台:

pv --pidfile /tmp/pv.pid --rate-limit 1K </dev/zero |
    ssh remote 'cat>/dev/null'

这是我的控制:

pv --rate-limit 100M --remote $(cat /tmp/pv.pid)
sleep 1
pv --rate-limit 1K --remote $(cat /tmp/pv.pid)

如果间隔一秒,则运行需要大约 13 秒pv才能从尝试的 100MB/s (1Gb/s) 降低到最终目标 1KB/s。将间隔增加sleep1 秒,实现最终目标的时间就会增加近 10 秒:

Sleep   Delay
 1       13
 2       22
 3       28
 4       37

四个样本对于趋势线来说确实不够,所以我将避免暗示它是线性相关的。

答案3

我正在纠正自己; pv可以改变速度..我不知道为什么,但它需要根据你的速度限制需要一些时间...如果你将其设置为1G,你必须等待45秒才能降低速度。
5G - 5 分钟
10G - 7 分钟

例如:

命令:

pv --pidfile /tmp/pv.pid --rate-limit 10G </dev/zero | ssh 10.1.1.5 'cat>/dev/null'
pv --rate-limit 1M --remote $(cat /tmp/pv.pid)

-ON 10Gb/s 网卡:

3.99GiB 0:02:26 [ 157MiB/s] (Right here i just changed to 1M)
26.1GiB 0:02:30 [ 160MiB/s]
77.6GiB 0:09:38 [1.01MiB/s]

7分钟后,速度终于变了……

-ON 1Gb/s 网卡:

我又开始了10G的限制。

770MiB 0:00:07 [ 112MiB/s]
44.5GiB 0:06:49 [ 111MiB/s]
46.4GiB 0:07:31 [1.00MiB/s]

结果是一样的。如果将速度从10G更改为1M,则至少需要等待7分钟。但如果您将速度从 1M 更改为 10G,则无需等待。我不认为这只是与缓冲区有关,因为 7 分钟(45Gb)对于缓冲区来说一定太大了。但这只是我的意见。

相关内容