這個問題在這裏詳細介紹。 linux
您如何衡量Linux中應用程序或進程的內存使用狀況? git
從瞭解Linux上的內存使用的博客文章中, ps
不是用於此目的的準確工具。 github
爲何
ps
是「錯誤的」 工具根據您的見解,
ps
不會報告進程的實際內存使用狀況。 它的真正做用是顯示若是每一個進程是惟一運行的進程 , 則每一個進程將佔用多少實際內存。 固然,一臺典型的Linux計算機在任何給定時間都運行着幾十個進程,這意味着ps
報告的VSZ和RSS編號幾乎確定是錯誤的 。 性能
若是您有時間運行,Valgrind會很棒。 valgrind --tool=massif
是正確的解決方案。 spa
可是,我開始運行更大的示例,而且使用valgrind再也不可行。 有沒有辦法肯定程序的最大內存使用量(模數頁面大小和共享頁面)? 線程
在實際的UNIX系統上, /usr/bin/time -v
能夠工做。 在Linux上,可是,這是行不通的。 code
在最新版本的linux中,使用smaps子系統。 例如,對於PID爲1234的進程: 進程
cat /proc/1234/smaps
它會準確告訴您當時它正在使用多少內存。 更重要的是,它將內存劃分爲私有內存和共享內存,所以您能夠知道程序實例正在使用多少內存,而無需包括程序多個實例之間共享的內存。 內存
若是您想要比使用Valgrind進行性能分析更快的速度而且您的內核更舊而且不能使用smaps,則帶有選項以顯示進程駐留集的ps -o rss,command
(使用ps -o rss,command
)能夠爲您提供快速且使用的非交換內存的實際數量的合理_aproximation_
。
我正在使用htop
; 這是一個很是好的控制檯程序,相似於Windows Task Manager。
使用ps
或相似工具,您將只得到該進程分配的內存頁面數量。 該數字是正確的,可是:
不反映應用程序實際使用的內存量,僅反映爲其保留的內存量
若是頁面被共享(例如由多個線程共享或經過使用動態連接的庫)可能會產生誤導
若是您確實想知道應用程序實際使用的內存量,則須要在分析器中運行它。 例如, valgrind
能夠爲您提供有關已用內存量的信息,更重要的是,您能夠了解程序中可能的內存泄漏。 valgrind的堆分析器工具稱爲「 massif」:
Massif是堆分析器。 它經過對程序堆進行按期快照來執行詳細的堆分析。 它生成一個圖表,顯示隨時間推移的堆使用狀況,包括有關程序的哪些部分負責最多內存分配的信息。 該圖由文本或HTML文件補充,該文本或HTML文件包含更多信息,用於肯定分配最大內存的位置。 Massif運行的程序比正常運行慢約20倍。
如valgrind文檔中所述,您須要經過valgrind運行程序:
valgrind --tool=massif <executable> <arguments>
Massif寫入內存使用狀況快照的轉儲(例如massif.out.12345
)。 這些提供了(1)內存使用的時間表,(2)每一個快照,記錄了程序存儲器中的分配位置。 massif-visualizer是分析這些文件的一種出色的圖形工具。 可是我發現ms_print
這個由valgrind附帶的簡單的基於文本的工具已經ms_print
了。
要查找內存泄漏,請使用valgrind的(默認) memcheck
工具。