如何衡量應用程序或進程的實際內存使用狀況?

這個問題在這裏詳細介紹。 linux

您如何衡量Linux中應用程序或進程的內存使用狀況? git

瞭解Linux上的內存使用的博客文章中, ps不是用於此目的的準確工具。 github

爲何ps是「錯誤的」 工具

根據您的見解, ps不會報告進程的實際內存使用狀況。 它的真正做用是顯示若是每一個進程是惟一運行的進程每一個進程將佔用多少實際內存。 固然,一臺典型的Linux計算機在任何給定時間都運行着幾十個進程,這意味着ps報告的VSZ和RSS編號幾乎確定是錯誤的性能


#1樓

若是您有時間運行,Valgrind會很棒。 valgrind --tool=massif是正確的解決方案。 spa

可是,我開始運行更大的示例,而且使用valgrind再也不可行。 有沒有辦法肯定程序的最大內存使用量(模數頁面大小和共享頁面)? 線程

在實際的UNIX系統上, /usr/bin/time -v能夠工做。 在Linux上,可是,這行不通的。 code


#2樓

在最新版本的linux中,使用smaps子系統。 例如,對於PID爲1234的進程: 進程

cat /proc/1234/smaps

它會準確告訴您當時它正在使用多少內存。 更重要的是,它將內存劃分爲私有內存和共享內存,所以您能夠知道程序實例正在使用多少內存,而無需包括程序多個實例之間共享的內存。 內存


#3樓

若是您想要比使用Valgrind進行性能分析更快的速度而且您的內核更舊而且不能使用smaps,則帶有選項以顯示進程駐留集的ps -o rss,command (使用ps -o rss,command )能夠爲您提供快速且使用的非交換內存的實際數量的合理_aproximation_


#4樓

我正在使用htop ; 這是一個很是好的控制檯程序,相似於Windows Task Manager。


#5樓

使用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工具。

相關文章
相關標籤/搜索