Power-Management

為什麼當我從掛起到記憶體時,它暫時看起來不再強制執行 pv 命令傳輸限制?

  • June 5, 2014

我有這個perl 腳本,我發現了這個pv命令,並決定用它來獲得一些關於吞吐量方面隨機性的回饋。經過幾次測試1我決定限制命令,如下所示:

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

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

我暫停使用systemctl suspendArchbang)進行撞擊。當我恢復時,該命令仍然執行並在其對話框中包含自掛起以來經過的時間,但看起來我設置的限制不再強制執行,吞吐量為 2-3MiB/s 並且 CPU 更高 - 就像沒有限制一樣。一段時間後,這種情況會消退,我可以看到限制仍在執行。

例如,如果我只執行該命令幾秒鐘,則吞吐量需要幾秒鐘才能恢復到其設置的限制。另一方面,在一小時內生成 815Mb 的數據,然後暫停 30 分鐘,然後命令需要大約 5 分鐘才能返回到我設置的限制 - 並且 CPU 使用率在此期間就像沒有節流一樣。

因此,並不是沒有強制執行限制,而是在這種情況下,從掛起到記憶體似乎會影響吞吐量。為什麼以及可以改變這種行為?


  1. 該命令在未限制時使用一個 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 信號暫停,我還沒有檢查它到底做了什麼,但它不應該造成太大的擾動,與系統暫停不同)。

引用自:https://unix.stackexchange.com/questions/134334