到目前為止,我能找到的與該主題相近的主題(比如這個)都沒有幫助我。
我有一個 C 程式,它從檔案中讀取一些資料,運行相當復雜和密集的操作,然后將輸出寫入新檔案。當我讓行程運行幾個小時時,我注意到以下行為:
- CPU 使用率非常穩定,但 RAM 會緩慢增加,直到達到某種上限,然后它也變得恒定。
- RAM 使用“上限”似乎會增加,具體取決于計算機的 RAM 配置。例如,在 16GB RAM 的計算機上為 3~4GB,但在 64GB 的計算機上為 10~11GB)。
- 生成具有相似復雜性的檔案的平均時間會隨著時間的推移而增加,并且在某些時候變得很長(給人的印象是程式不再運行)。
- 當它開始以這種方式變慢時,我終止行程并重新運行程式重新生成相同的檔案(從頭開始),之前花費 3 小時的作業在大約 5 分鐘內完成。
會是什么?我懷疑記憶體泄漏,但是RAM不會無限增加嗎?即使有可用資源(CPU、RAM、磁盤空間等),還有什么會導致程式逐漸變慢?
uj5u.com熱心網友回復:
我懷疑記憶體泄漏,但是RAM不會無限增加嗎?
它無限地增加,您只是在您正在查看的 RAM 使用統計資訊中看不到它。
發生的情況是作業系統將繼續分配新的物理 RAM 頁面,直到觀察到的上限點。那時,每當您的程式請求新記憶體時,它會將一些已分配的記憶體換出到磁盤,然后再在 RAM 中分配新的物理記憶體。因此,您可以通過與由于泄漏而分配虛擬記憶體的速度大致相同的速度交換到磁盤來釋放物理 RAM。由于換出的記憶體可能只包含泄漏的資料,因此您的程式不太可能再次觸及它,因此它只是無限期地保留在磁盤上。如果您讓程式運行足夠長的時間,最終您也會耗盡磁盤上的交換空間。
交換導致的磁盤持續 I/O 可能是觀察到的減速的根本原因。
使用LeakSanitizer或Valgrind等記憶體分析工具來檢測記憶體泄漏。一旦程式的記憶體消耗停止不斷增長,性能問題就會消失。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481544.html
