
我正在容器內的 *nix 上運行一些程序,並嘗試仔細計算我的進程正在使用的 RAM 量。據我了解,該資訊應位於/proc/#{pid}/smaps
.我嘗試smaps
使用以下 Ruby 腳本對系統上所有檔案的所有 PSS 進行求和:https://gist.github.com/schneems/10025798
但是,我發現報告的記憶體使用量低於我的容器報告的記憶體使用量。如果我改用 RSS,那麼該值會變得更高(遠遠超過我的容器報告的值)。我相當確定我需要的所有資訊都可以在 中找到/proc
,我只是不知道如何報告它以獲得準確的測量結果。我的問題是:smaps
我應該總結哪些數值,因為單獨的 PSS 並不是一個好的指標?有沒有更好或更準確的方法來從 Linux 機器中獲取此資訊?
答案1
RSS 是駐留集大小,換句話說,進程使用的全域內存,包括運行時加載的每個庫。單一庫可能會使用多次(例如,考慮 apache 進程分支,每個子進程可能使用相同的庫)。根據虛擬記憶體模型,每個進程都將該記憶體視為自己正在使用。實際上,核心將虛擬記憶體位址映射到庫的唯一記憶體位址。
另一方面,PSS 對進程的每個 USS(非共享集大小)進行求和。將其視為如果我們殺死某個進程,該進程將立即釋放的記憶體。它不考慮共享內存,而只考慮進程唯一使用的內存。
因此,RSS 值高估了所使用的有效記憶體。如果您確保考慮到已載入的庫記憶體大小,PSS 會更準確。
更多細節這裡,特別是最後一段。