Linux

Linux 中的記憶體使用情況如何報告?

  • September 5, 2017

使用 ps,我可以看到大小、vsize(與 top 的 VIRT 相同?)和 rss(與 top 的 RES 相同?)。(我在頂部看到的另一個是 SHR。)

有人可以為我總結一下這些不同領域的含義嗎?

簡而言之:

  • **虛擬大小:**是程序正在管理的地址空間量。虛擬地址空間包含程序可以通過指針訪問的所有內容(記憶體地址引用)。例如,如果您的程序可以訪問影片卡的幀緩衝區,則該記憶體將映射到程序虛擬空間並接收儲存到指針的地址。記憶體映射文件和匿名映射也計入虛擬地址空間大小。幾乎所有東西都是虛擬大小。如果將 中列出的所有地址範圍的大小相加/proc/<pid>/maps,它應該會返回與虛擬大小大致相同的值。
  • **駐留大小:**是專門屬於目前駐留在記憶體中的該程序的記憶體量。這意味著,不在交換中的記憶體量。請注意,即使程序正在執行,部分程序也可能位於交換記憶體中。當程序試圖訪問它們時,作業系統將從交換中提取這些區域。這應該包括堆、所有執行緒的堆棧和其他私有映射。如果您查看/proc/<pid>/maps[stack][heap]其他匿名映射(那些沒有文件路徑的)要麼被交換,要麼被計入駐留大小。
  • **共享大小:**是可能屬於多個程序的記憶體量。例如,如果您在記憶體中載入了同一個應用程序的四個實例,那麼您將有四個堆實例和至少四個堆棧,每個程序一個(這是常駐記憶體),但您將只有一個程序及其庫的二進制程式碼。這是共享空間。它不僅包括程序二進制程式碼及其庫,還包括本地化文件、只讀程序數據、SysV 和 POSIX 共享記憶體段、信號量等……如果您查看/proc/<pid>/maps,大多數與庫和程序文件相關的映射是共享。

請注意,VIRT 包含 RSS 和 SHR 的並集,並且總是大於其中任何一個。可能有區域同時計為 RSS 和 SHR。

引用自:https://serverfault.com/questions/48582