Eu tenho um processo que está relatando na parte superior que possui 6 GB de memória residente e 70 GB de memória virtual alocada. O estranho é que esse servidor específico possui apenas 8 GB de espaço físico e 35 GB de espaço de troca disponível.
No manual 'top':
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes
all code, data and shared libraries plus pages that have been
swapped out. (Note: you can define the STATSIZE=1 environment vari-
able and the VIRT will be calculated from the /proc/#/state VmSize
field.)
VIRT = SWAP + RES.
Dada essa explicação, eu esperaria que a alocação de memória virutal de um processo seja limitada à minha troca + memória física disponível.
De acordo com o 'pmap', o código, a biblioteca compartilhada e as seções de memória compartilhada desse processo são mínimas - não mais que 300 milhões ou mais.
Obviamente, a máquina e o processo ainda estão funcionando corretamente (embora lentamente), então o que estou perdendo aqui?
fonte
Aqui está uma discussão entre virt vs. memória residente:
/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
A discussão refere-se a processos Java, mas é aplicável a qualquer coisa em execução no Linux. O ponto principal em relação à virtude é que o total inclui um monte de coisas que nunca podem ser usadas. O Virt é algo para se olhar para sistemas operacionais de 32 bits (já que os processos atingirão limites no espaço endereçável), mas, em grande parte, não é útil. Como observado, o ponto a ser observado é a memória residente, que será limitada à RAM física disponível e à sua troca.
fonte
Provavelmente, porque o espaço de endereço do processo é do tamanho que você especificou, mas não é realmente alocado pelo sistema operacional.
De: http://lwn.net/Articles/428100/
Portanto, às vezes é assim que o gerenciamento de memória é deselegante - ter um espaço de endereço contínuo simplifica a liberação de mem não utilizado.
fonte
A resposta provavelmente é MMAP - os dados estão no disco, mas estão "fora" da troca e não podem ser vistos com o comando "free" ou "top".
Se o processo java não for muito complicado, tente jogar com "lsof" para descobrir onde está o arquivo MMAP. No entanto, se esse processo java for complicado, será difícil ver isso.
fonte
Também fiquei surpreso que o Linux permita que você aloque mais memória virtual do que a memória física + o espaço de troca, mas aparentemente ajuda no desempenho em situações típicas.
http://www.linuxjournal.com/article/10678
fonte