Sua conclusão está de fato correta. Os tamanhos de memória estão em KB, ambos vsz e rss, como você pode verificar a si mesmo olhando a página Man para ps, na seção ESPECIFICADORES DE FORMATO PADRÃO .
Há também outra verificação que você pode realizar: o rss (tamanho do conjunto de residentes, isto é, a memória não trocada usada por cada processo) é de aproximadamente 700 MB por processo. Se você tem 23 processos desse tipo, isso é bom para os 15 GB de memória usada (não para swap).
Além disso, o tamanho total de sua memória física + troca é muito menor do que o requerido pela execução simultânea dessas 23 tarefas, 16 GB vs. 144 GB. Portanto, parece que nem mesmo um único processo recebe a quantidade necessária de memória neste momento.
Então, quais são suas opções? Basta executar dois processos de cada vez, já que seu tamanho é tal que você pode mantê-los completamente em sua memória, sem trocar. Quando terminarem, carregue mais dois. Isso pode ser facilmente realizado com um script bash, com o comando wait :
my_job < file1.txt &
my_job < file2.txt &
wait 1 2
my_job < file3.txt
my_job < file4.txt
wait 3 4....
Isso também lhe deixará algum espaço na memória para manter o / tmp, / run e assim por diante, o que significa que a capacidade do seu sistema de executar interativamente será pouco afetada.
A segunda opção (talvez a primeira), seria perguntar a si mesmo como você acabou com um código java de 7GB ... mas essa é uma pergunta para o StackOverflow
Editar:
Estou respondendo aqui ao comentário de Marcus Thornton:
If I can fix the memory issue, ..., is it good to dispatch all the tasks at one time?
Sim e não. Se você corrigir o problema de memória, certamente poderá executar mais de dois trabalhos simultaneamente. Mas você consegue executar 23? Eu acho que você está superestimando a utilidade do Multi-threading . O multiencadeamento é um processador único, com dois contextos de execução, o que permite o uso paralelo de diferentes unidades funcionais no mesmo processador. Mas se as tarefas são similares , como elas são no seu caso, elas provavelmente usarão as mesmas unidades funcionais, assim elas serão enfileiradas como se não houvesse multi-threading . Multi-threading não é a mesma coisa que ter processadores independentes, e permite ganhos de velocidade marginais, na melhor das hipóteses.
BTW, como você pode usar o cpus? Você disse processadores, não cpu. O seguinte comando
/bin/cat /proc/cpuinfo | /bin/egrep 'processor|model name|cache size|core|sibling|physical'
irá ajudá-lo.