Pipe-Viewerで速度制限を変更する問題

Pipe-Viewerで速度制限を変更する問題

私は経由pvでファイルを送信するために使用しますssh

問題なく「アクティブpv」制限を100M未満に変更できます。アクティブプロセスを100Mまたは1G以上に設定すると、pv速度を変更できなくなります。

しかし! 1Mから2Mを5~10回変更すると、2Mから1Mがpv新しい速度に設定されることがあります。

この問題の解決策が見つかりません。どんなアイデアがありますか?

例:

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

2番目の睡眠時間を変更すると、目標計算の影響を確認できます。

書き込み制限が速度​​制限を書き込み容量より大きい値に設定した場合にのみ問題が発生します。

より詳細には、400Mを送信できる接続では、トラフィックが最初に1Mに制限され、5秒間1Gに制限され、再び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.c154行を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);

完了すると、レート制限の減少がすぐに適用されます(まあ、1つのレート制限期間内)。

おすすめ記事