Memory

確定共享大記憶體段的多個程序的實際記憶體使用情況

  • January 12, 2016

我只是看了一下 top 的輸出,它向我展示了(在其他程序中)以下內容:

從頂部輸出

正如曾經看到的那樣,我有十個程序,每個程序消耗大約 10GB,總共 100GB。然而,這台電腦只有 64GB 的記憶體,從頂部的第二行可以看出。其中目前使用了大約 22GB。

現在解決這個難題:test_mpi.out 程序彼此之間使用大量共享記憶體。由於我有原始碼,我知道實際記憶體消耗約為 10GB。

電腦在空閒時消耗大約 12GB 的記憶體,因此這總計為報告的 22GB。

我不明白的是top是怎麼知道實際只使用了22GB的記憶體。根據顯示的所有列(VIRT、RES 和 SHR),頂部應該無法弄清楚這一點。如果有人能對此有所了解,那就太棒了。

編輯:在redhat linux上執行

編輯:感謝 Michael Homer,我現在知道 top 從 /proc/meminfo 獲取這些資訊。但我更希望得到一個答案來解釋我如何確定所有 test_mpi.out 程序總共只消耗 10GB(而不是天真地添加 top 的輸出所建議的 100gb)。我嘗試查看 /proc/PID/status 但我沒有找到任何線索來確定如何確定共享大記憶體段的多個程序的實際記憶體使用情況(如果我沒有原始碼)。

您可以看到該SHR列顯示的記憶體量與RES- 這意味著該特定任務的駐留記憶體幾乎 100% 由共享記憶體段組成。儘管如此,即使這樣也不能讓您充分了解,因為RES只是沒有分頁的記憶體量。

要弄清楚程序的實際記憶體消耗是多少,請嘗試使用更智能的方法,例如ps(1)使用選擇欄位(查看-o選項和STANDARD FORMAT SPECIFIERS手冊部分)。

請注意,除了size欄位(這是一個非常粗略的估計)之外,程序在記憶體方面的總大小很難準確評估其表面值,因為它的一些記憶體可能與其他程序共享,我們不能真的直接告訴有多少這些頁面是臟的(請參閱手冊頁上的部分NOTES段落)。SIZE``RSS

為了能夠判斷這些程序實際上正在使用相同的共享記憶體段,您需要查看ipcs(1)命令的輸出並查看具有可疑nattch程序數量的共享記憶體段。

然後,您需要查看這些細分的詳細資訊ipcs -m -i <id>,以顯示附加的實際流程。

如果這聽起來太複雜,請將其視為一項挑戰練習 - 編寫一個腳本,在給定程序 ID 的情況下,列印該程序附加到的 SHM ID 列表,以及與它共享這些 SHM ID 的 PID 列表。;)

引用自:https://unix.stackexchange.com/questions/254752