web-dev-qa-db-ja.com

RAMへのサスペンドから抜け出したときに、一時的にpvコマンドの転送制限が適用されなくなったように見えるのはなぜですか?

私はこれを持っていますPerlスクリプト そして私は 発見されたpv コマンドを使用して、スループットの観点からランダム性で何が起こっているかについてフィードバックを得ることにしました。いくつかのテストの後1 私は次のようにコマンドを絞ることにしました:

Perl_commands < /dev/urandom | pv -L 512k | tr -cd SET

5.5MiB 0:00:11 [ 529kiB/s] [                    <=>                             ]

systemctl suspendArchbang)を使用してRAMにサスペンドします。再開すると、コマンドは引き続き実行され、一時停止からの経過時間がダイアログに含まれますが、設定したlimitが適用されなくなったように見えます。スループットは2〜3MiB/sで、CPUは制限なしのように高くなっています。しばらくすると、これはおさまりになり、制限がまだ適用されていることがわかります。

たとえば、コマンドを数秒間だけ実行すると、スループットが設定された制限に戻るまでに数秒かかります。一方、1時間の間に815Mbのデータを生成し、その後30分間一時停止すると、コマンドが設定した制限に戻るまでに約5分かかります。CPU使用率は、その間スロットルがないようなものです。

したがって、制限が適用されていないということではなく、RAMへのサスペンドから抜け出すことがこのコンテキストでのスループットに影響を与えるように見えるということです。この動作を変更できるのはなぜですか?


1.コマンドは、スロットルされていない場合、1つのCPUコアを使用します。 512KiB\sの制限により、CPU使用率は約10〜15%以下です。 80x40のターミナルウィンドウを埋めるのに約2GBのランダム性(およびある程度の時間)がかかります(SETによって異なります)。

1
user44370

pvはシステムの電源状態を知りません。ある時点で時計が非常に大きく変化したことがわかります。

私の推測では、pvは、2つのクロック読み出し間の時間が突然大きくなってもかまわず、時間間隔に基づいてスループットを計算するだけです。間隔が非常に大きいため、スループットが非常に低いように見えます。

スループットの計算は、クロック読み取りの数にわたって平均化されます(観察では約5分)。考慮される間隔に一時停止に費やされた時間が含まれている限り、計算されたスループット値は非常に低くなります。間隔が再びアウェイク時間のみで構成されると、スループットは期待どおりに戻ります。

たとえば、5分間中断したとします。次に、再開した直後に、pvは最後の5分間に500kBが転送されたと計算します。これは、スループットが約1.7kB/sであることを意味します。これは500kBのしきい値をはるかに下回っているため、pvはしばらくの間より多くのデータを転送して補正します。最終的に、スループットの計算は再び安定します。

システムの一時停止は、pvプロセスの一時停止とは異なります。システムの一時停止は、プログラムに対して透過的です。プロセスを一時停止すると、ウェイクアップ時にSIGCONTシグナルが送信されます。 pvにはSIGCONTのシグナルハンドラーがあり、一時停止に費やした時間を多かれ少なかれ差し引くようになっています(キャッチできないSIGSTOPシグナルで一時停止された場合、正確に何が行われるかは確認していませんが、チェックすべきではありません。システムの停止とは異なり、大きな摂動を引き起こします)。

制限を下回っていることを確認することが最も重要な要素であるこのようなシナリオでは、この代替手段を試すことができます cstream (ここでは2分ごとのスループットの概要を含む):

cstream -t -512k -T 120

負の数を許容するスループットオプションは、この状況向けに設計されているようです。

-t num     Limit the throughput of the data stream to num bytes/second.
           Limiting is done at the input side, you can rely on cstream not
           accepting more than this rate. If the number you give is posi-
           tive, cstream accumulates errors and tries to keep the overall
           rate at the specified value, for the whole session. If you give
           a negative number, it is an upper limit for each read/write
           system call pair. In other words: the negative number will
           never exceed that limit, the positive number will exceed it to
           make good for previous underutilization.

プロセスまたはシステムの両方を一時停止することで機能します。

0
user44370