我想在我的实验中运行大约 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真的可用吗?不幸的是,我无法谷歌搜索有趣的信息。我只是偶然发现了有关多处理/线程与数据交换、通用缓存等的文章。拜托,你能帮我解释一下这个问题吗?
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 列。我从未使用或关注过它,也从未见过有人这样做。