為什麼當我從掛起到記憶體時,它暫時看起來不再強制執行 pv 命令傳輸限制?
我有這個perl 腳本,我發現了這個
pv
命令,並決定用它來獲得一些關於吞吐量方面隨機性的回饋。經過幾次測試1我決定限制命令,如下所示:perl_commands < /dev/urandom | pv -L 512k | tr -cd SET 5.5MiB 0:00:11 [ 529kiB/s] [ <=> ]
我暫停使用
systemctl suspend
(Archbang)進行撞擊。當我恢復時,該命令仍然執行並在其對話框中包含自掛起以來經過的時間,但看起來我設置的限制不再強制執行,吞吐量為 2-3MiB/s 並且 CPU 更高 - 就像沒有限制一樣。一段時間後,這種情況會消退,我可以看到限制仍在執行。例如,如果我只執行該命令幾秒鐘,則吞吐量需要幾秒鐘才能恢復到其設置的限制。另一方面,在一小時內生成 815Mb 的數據,然後暫停 30 分鐘,然後命令需要大約 5 分鐘才能返回到我設置的限制 - 並且 CPU 使用率在此期間就像沒有節流一樣。
因此,並不是沒有強制執行限制,而是在這種情況下,從掛起到記憶體似乎會影響吞吐量。為什麼以及可以改變這種行為?
- 該命令在未限制時使用一個 CPU 核心。在 512KiB\s 的限制下,CPU 使用率約為 10-15% 或更少。填充我的 80x40 終端視窗(取決於 SET)大約需要 2gb 的隨機性(和一些時間)。
pv
不知道系統電源狀態。它所看到的只是時鐘在某個時刻發生了很大的變化。我的猜測是,
pv
它並不關心兩個時鐘讀數之間的時間是否突然變大,只是根據時間間隔計算吞吐量。由於間隔非常大,因此吞吐量似乎非常低。吞吐量計算是多次時鐘讀取的平均值(在您的觀察中大約 5 分鐘)。只要考慮的時間間隔包括暫停所花費的時間,計算的吞吐量值就會非常低。一旦間隔再次僅包含清醒時間,吞吐量將恢復到預期的水平。
例如,假設您暫停了 5 分鐘。然後在恢復之後,
pv
計算在最後 5 分鐘內傳輸了 500kB,這意味著吞吐量只有大約 1.7kB/s。這遠低於 500kB 的門檻值,因此pv
需要在一段時間內傳輸更多數據以進行補償。最終吞吐量計算將再次穩定下來。暫停系統與暫停
pv
程序不同。暫停系統對程序來說是透明的。當程序喚醒時,暫停程序會向它發送一個 SIGCONT 信號。pv
有一個用於 SIGCONT 的信號處理程序,這會導致它或多或少地減去它所花費的暫停時間(如果它被一個無法擷取的 SIGSTOP 信號暫停,我還沒有檢查它到底做了什麼,但它不應該造成太大的擾動,與系統暫停不同)。