Eu quero executar cerca de 200 processos com meus experimentos. Cada um deles realmente precisa de menos de um 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
Eu tenho acesso a 6 nós com 100 GB de RAM por cada um deles. Então, se eles levarem apenas um GB , não houve problemas. Mas, como você vê acima, cada um ocupa mais de 6 GB .
Fiquei muito surpreso quando olhei para a saída de free -m
:
total used free shared buff/cache available
Mem: 96481 15396 326 75 80758 80448
Swap: 16383 2336 14047
Ele mostra apenas 15,4 GB usados. Isso me levou a um pensamento, os processos podem compartilhar memória não utilizada? 80,4 GB estão realmente disponíveis? Infelizmente, não consegui pesquisar no Google informações interessantes. Eu só encontrei artigos sobre multiprocessamento/threading com troca de dados, cache comum etc. Por favor, poderia me esclarecer essa dúvida?
PS Se isso for impossível, existe alguma maneira de diminuir a memória alocada para esses processos (acabei de executar apenas 8 de 200)? O problema está no fato de que o script bash fornece apenas 2 GB para java (isso faz parte de):
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 $*
Portanto, não consigo entender o motivo pelo qual sempre leva de 4 a 5 GB a mais. Eu tenho o mesmo fenômeno com outros programas Java, por exemplo, BEAST 2 ou treeannotator .