linux - 如何測量應用程序或進程的實際內存使用情況?




15 Answers

試試pmap命令:

sudo pmap -x <process pid>
linux memory process

這個問題here詳細介紹。

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

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

為什麼ps是“錯誤的”

根據你如何看待它, ps不報告進程的實際內存使用情況。 它真正在做的是顯示每個進程如果是唯一進程運行時會佔用多少實際內存。 當然,典型的Linux機器在任何時候都有數十個進程在運行,這意味著由ps報告的VSZ和RSS數字幾乎肯定是錯誤的




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

cat /proc/1234/smaps

它會告訴你到底有多少內存在使用。 更重要的是,它會將內存分為私有的和共享的,這樣你就可以知道你的程序實例正在使用多少內存,而不包括程序的多個實例之間共享的內存。




使用smemps的替代方法,它可以計算每個進程的USS和PSS。 你想要的可能是PSS。

  • USS - 獨特的大小。 這是該進程獨有的非共享內存量(將其視為唯一內存的U )。 它不包含共享內存。 因此,這將報告進程使用的內存量,但在您要忽略共享內存時會有幫助。

  • PSS - 比例組大小。 這是你想要的。 它將獨特內存(USS)以及共享內存的一部分除以共享該內存的其他進程的數量。 因此它會準確地表示每個進程使用多少實際物理內存 - 共享內存真正表示為共享。 想想P代表物理記憶。

這與ps和其他utils報告的RSS相比如何:

  • RSS - 居民組大小。 這是每個進程使用的共享內存加上非共享內存的數量。 如果有任何進程共享內存,這將超出實際使用的內存量,因為相同的共享內存將被計數多次 - 在共享相同內存的每個其他進程中再次出現。 因此它是相當不可靠的,特別是當高內存進程有很多分支時 - 這在服務器中很常見,例如Apache或PHP(fastcgi / FPM)進程。

注意:smem也可以(可選)輸出圖形,如餅圖等。 國際海事組織,你不需要任何。 如果你只是想從命令行使用它,就像你可能使用ps -A v一樣,那麼你不需要安裝python-matplotlib建議的依賴關係。




這是一個很好的工具和問題總結: archive.org鏈接

我會引用它,以便更多的開發人員實際閱讀它。

如果你想分析整個系統的內存使用情況,或者徹底分析一個應用程序的內存使用情況(不僅僅是它的堆使用情況),請使用exmap 。 對於整個系統分析來說,找到具有最高有效使用率的進程,在實踐中佔用大量內存,找到最高可寫用法的進程,創建最多的數據(因此可能會洩漏或者在數據使用方面效率非常低)。 選擇這樣的應用程序並在第二個列表視圖中分析它的映射。 有關更多詳細信息,請參閱exmap部分 還可以使用xrestop檢查X資源的高使用率,尤其是在X服務器的進程佔用大量內存的情況下。 詳情請參閱xrestop部分。

如果你想檢測洩漏,使用valgrind或可能kmtrace

如果您想分析應用程序的堆(malloc等)使用情況,請在memprofkmtrace中運行它,分析應用程序並蒐索函數調用樹以獲取最大分配。 查看他們的部分了解更多詳情。




除了答案中列出的解決方案之外,您可以使用Linux命令“top”; 它提供了正在運行的系統的動態實時視圖,它為整個系統提供了CPU和內存的使用情況,並為每個程序提供了百分比:

top

通過程序pid進行過濾:

top -p <PID>

按程序名稱過濾:

top | grep <PROCESS NAME>

“頂部”還提供了一些領域,例如:

VIRT - 虛擬映像(kb):該任務使用的虛擬內存總量

RES - 常駐大小(kb):任務已使用的未交換物理內存; RES = CODE + DATA。

DATA - 數據+堆棧大小(kb):專用於非可執行代碼的物理內存量,也稱為“數據駐留集”大小或DRS。

SHR - 共享內存大小(kb):任務使用的共享內存量。 它只是反映了可能與其他進程共享的內存。

here引用。




如果你的代碼是C或C ++,你可以使用getrusage() ,它會返回關於你的進程的內存和時間使用情況的各種統計信息。

不是所有的平台都支持這個,並且會為內存使用選項返回0值。

相反,你可以看看/proc/[pid]/statm創建的虛擬文件(其中[pid]被你的進程ID取代。你可以從getpid()獲得這個文件。

這個文件看起來像一個有7個整數的文本文件。 您可能最感興趣的是該文件中的第一個(所有內存使用)和第六個(數據內存使用)數字。




如果你有足夠的時間來運行它,Valgrind是非常棒的。 valgrind --tool=massif是正確的解決方案。

但是,我開始運行更大的示例,並且使用valgrind不再實用。 有沒有一種方法可以告訴程序的最大內存使用量(模數頁面大小和共享頁面)?

在真正的Unix系統上, /usr/bin/time -v可以工作。 但是,在Linux上,這不起作用。




我使用htop ; 這是一個類似於Windows任務管理器的非常好的控制台程序。




在命令行下面會給你在Linux機器上運行的各種進程使用的總內存(MB)

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'



Get valgrind. give it your program to run, and it'll tell you plenty about its memory usage.

This would apply only for the case of a program that runs for some time and stops. I don't know if valgrind can get its hands on an already-running process or shouldn't-stop processes such as daemons.




Edit: this works 100% well only when memory consumption increases

If you want to monitor memory usage by given process (or group of processed sharing common name, eg google-chrome , you can use my bash-script:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

this will continously look for changes and print them.







雖然這個問題似乎是關於檢查當前正在運行的進程,但我希望從頭到尾都能看到應用程序使用的峰值內存。除了valgrind,你可以使用tstime,這更簡單。它衡量“高水位”內存使用情況(RSS和虛擬)。從這個答案




Use the in-built ' system monitor ' GUI tool available in ubuntu




/prox/xxx/numa_maps gives some info there: N0=??? N1=???. But this result might be lower than the actual result, as it only count those which have been touched.




Related