Process
程序可以與其他程序共享未使用的記憶體嗎?
我想在我的實驗中執行大約 200 個程序。他們每個人真的需要不到一個 GB:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24688 rinkman 20 0 6082416 335536 15680 S 116.9 0.3 77:32.92 java 25314 rinkman 20 0 6614936 379040 15700 S 116.6 0.4 73:43.02 java 25780 rinkman 20 0 6082408 348140 15664 S 116.6 0.4 72:12.34 java 25994 rinkman 20 0 6082408 350592 15656 S 114.6 0.4 71:42.34 java 30472 rinkman 20 0 6749092 441492 15664 S 108.6 0.4 64:54.38 java 27052 rinkman 20 0 6548364 403040 15692 S 106.3 0.4 66:38.30 java 29314 rinkman 20 0 6022012 393656 15660 S 105.0 0.4 65:57.09 java 28173 rinkman 20 0 6681492 427816 15660 S 104.3 0.4 66:17.47 java
我可以訪問 6 個節點,每個節點都有100 GB的 RAM。因此,如果他們只佔用GB,則沒有問題。但是,正如您在上面看到的,每個都需要超過6 GB。
當我查看以下輸出時,我感到非常驚訝
free -m
:total used free shared buff/cache available Mem: 96481 15396 326 75 80758 80448 Swap: 16383 2336 14047
它顯示僅使用了15.4 GB。這讓我想到,程序可以共享未使用的記憶體嗎?80.4 GB真的可用嗎?不幸的是,我無法Google搜尋有趣的資訊。我只是偶然發現了有關多處理/執行緒與數據交換、通用記憶體等的文章。拜託,你能幫我解釋一下這個問題嗎?
PS如果這是不可能的,有什麼辦法可以減少這些程序的分配記憶體(我只從200個執行了8個)?問題在於 bash 腳本僅為java提供了2 GB(這是其中的一部分):
java -Xms64m -Xmx2048m -Djava.library.path="$BEAST_LIB:/usr/local/lib:$LD_LIBRARY_PATH" -cp "$BEAST_LIB/beast.jar:$BEAST_LIB/beast-beagle.jar" dr.app.beast.BeastMain $*
所以我無法理解為什麼它總是需要多4-5 GB。我對其他 Java 程序也有同樣的現象,例如BEAST 2或treeannotator。
你似乎讀錯了。
第一列是
VIRT
,它無關緊要,在絕對大多數情況下應該完全忽略。您感興趣的是
RSS
,您的每個程序都不到半 GB 的 RAM。你做的不錯。現在回答你的問題。
沒有共享“未使用”記憶體之類的東西,它要麼已使用,要麼未使用。一些記憶體確實是共享的,這是第三列稱為
SHR
. 那就是共享庫的記憶體。如果我沒記錯的話,Linux 核心早就停止計算/顯示正確的值了,因為它非常複雜。PS 老實說,我不知道為什麼 Linux RAM 實用程序(
top
、htop
、free
等)會顯示 VIRT 列。我從未使用或關注過它,也從未見過有人這樣做。