Process

程序可以與其他程序共享未使用的記憶體嗎?

  • May 18, 2022

我想在我的實驗中執行大約 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 2treeannotator

你似乎讀錯了。

第一列是VIRT,它無關緊要,在絕對大多數情況下應該完全忽略。

您感興趣的是RSS,您的每個程序都不到半 GB 的 RAM。你做的不錯。

現在回答你的問題。

沒有共享“未使用”記憶體之類的東西,它要麼已使用,要麼未使用。一些記憶體確實是共享的,這是第三列稱為SHR. 那就是共享庫的記憶體。如果我沒記錯的話,Linux 核心早就停止計算/顯示正確的值了,因為它非常複雜。

PS 老實說,我不知道為什麼 Linux RAM 實用程序(tophtopfree等)會顯示 VIRT 列。我從未使用或關注過它,也從未見過有人這樣做。

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