一時停止からRAMに切り替えると、pvコマンド転送制限が適用されなくなったように一時的に表示されるのはなぜですか?

一時停止からRAMに切り替えると、pvコマンド転送制限が適用されなくなったように一時的に表示されるのはなぜですか?

私はこれを持っています真珠 スクリプトそして私発見するこれpvコマンドを実行し、それを使用して、スループットランダム性に関して何が起こっているのかについてのフィードバックを得ることにしました。複数のテストを実行した後、次のようにコマンドを制限することにしました

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

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

systemctl suspend(アーチバン)。再起動すると、コマンドは引き続き実行され、ダイアログボックスにサスペンド後の経過時間が含まれますが、次のようになります。限界私の設定は強制されなくなり、スループットは2-3MiB / sで、CPUは高くなります。制限がないようです。しばらくして、座るまだ制限が有効であることがわかります。

たとえば、わずか数秒間コマンドを実行すると、スループットが設定された制限に戻るのに数秒かかります。一方、815Mbのデータは、1時間に生成されてから30分間一時停止され、次のコマンドが私が設定した制限に戻るのに約5分かかります。この間、CPU使用率は調整なしのものと同じです。

したがって、制限は適用されませんが、この場合、サスペンドからメモリに切り替えることはスループットに影響を与えるようです。なぜこのような行動が変わるのですか?


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

答え1

pvシステムの電源状態が不明です。それが見るのは、ある時点で時計が大きく変わったということだけです。

私の考えでは、pv2つのクロック読み出しの間の時間が突然大きくなっても、時間間隔に基づいてスループットを計算するだけです。間隔が大きいためスループットが低いようです。

スループット計算は、複数の時計読み取り値の平均です(約5分間観察)。考慮された間隔に一時停止にかかる時間が含まれている限り、計算されたスループット値は非常に低いです。間隔が再びアクティブ化時間でのみ構成されている場合、スループットは予想レベルに戻ります。

たとえば、5分間停止したとします。その後、回復後、pv過去5分間に500 kBが送信されたと計算されます。これは、スループットが約1.7kB / sにすぎないことを意味します。これは500kBのしきい値よりはるかに低いため、pv補償のためにしばらくの間データを転送する必要があります。結局のところ、スループット計算は再び安定します。

システムを一時停止することは、プロセスを一時停止することとは異なりますpv。システム一時停止はプログラムに透過的です。停止したプロセスが起きると、SIGCONT信号がそのプロセスに送信されます。pv停止にかかる時間をある程度減らすSIGCONT信号ハンドラがあります。 (キャッチできないSIGSTOP信号で停止している場合は、正確に何をしているのかを確認していませんが、混乱を招くべきではありません。システムの停止とは異なります)。

答え2

この場合、限度未満を維持することが最も重要な要素です。次の回避策を試すことができます。ストリームメディア(処理量の概要は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.

プロセスまたはシステムを一時停止するために使用されます。

関連情報