Entendendo o uso de memória virtual> swap + físico no Linux


9

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?

Respostas:


9

Pode ser que exija zero de memória que não esteja na memória RAM física ou no arquivo de paginação.

Alguns recursos que você pode querer considerar:

Seu aplicativo cria muitas páginas de memória vazias? Nesse caso, seu aplicativo pode se beneficiar muito de:

Permite compactar e descomprimir em páginas de memória em tempo real. Por sua vez, você é capaz de manter tudo na RAM, em vez de trocar para o disco ( muito lento ).


Sim, o aplicativo está fazendo muitas correlações no espaço IPV4, portanto, ele pode ter muitas páginas vazias, dependendo da distribuição do tráfego. Teremos que tomar cuidado com isso. Obrigado!
umbigo

feliz em ajudar, espero que outro usuário me marque. I encontrar respostas assassino, mas eu tenho uma classificação de 1.266 :-( Eu não acho que os usuários de falhas do servidor como eu hahhah.
O Unix zelador

1
Algumas razões pelas quais as pessoas podem não votar em você: 1. Formatação da sua resposta --- use a marcação. 2. Seu nome de usuário parece genérico. 3. Mais importante: o fato de você achar importante o suficiente para comentar sobre isso. Deixa um gosto amargo na boca das pessoas.
Belmin Fernandez

@ user37899 Os upvotes tendem a se dividir em três categorias: quão informativa é a resposta, quão bem formatada e fácil de ler, e quão popular é a pergunta. Eu trabalhava na sua formatação, mas você também precisa ter um zen e perceber que algumas respostas fantásticas ficam no site com apenas um voto positivo - a popularidade de uma pergunta é o fator de maior efeito.
precisa

1
Fiz alguma formatação. Espero que ajude heh.
Belmin Fernandez

2

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.


na verdade ele perguntou por que a memória virtual alocada era maior que o espaço de memória + permuta física ..
O Unix zelador

Sim, e a discussão em Stackoverflow fala sobre como isso é possível.
CJC

1

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/

No processo de tentar atingir esse objetivo de "sobrecarga baixa o suficiente e sem latência significativa", os desenvolvedores do Go fizeram algumas suposições simplificadoras, uma das quais é que a memória que está sendo gerenciada para um aplicativo em execução provém de uma única e praticamente contígua intervalo de endereços. Essas suposições podem ter o mesmo problema que seu editor encontrou com vi - outro código pode alocar partes no meio do intervalo - então os desenvolvedores do Go adotaram a mesma solução: eles simplesmente alocam toda a memória que acham que podem precisar (eles imaginaram, razoavelmente, que 16 GB devem ser suficientes em um sistema de 64 bits) no momento da inicialização.

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.


0

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.


-1

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.

Felizmente, existe um parâmetro de ajuste do kernel que pode ser usado para alternar o modo de contabilidade da memória. Este parâmetro é vm.overcommit_memory e indica qual algoritmo é usado para rastrear a memória disponível. O padrão (0), usa o método heurístico e supercompromete o sistema de memória virtual. Se você deseja que seus programas recebam erros de falta de memória apropriados na alocação, em vez de sujeitar seus processos a mortes aleatórias, defina esse parâmetro como 2.

http://www.linuxjournal.com/article/10678


Isso é totalmente confuso. Overcommit não é o que permite alocar mais memória virtual do que memória física mais espaço de troca. Você poderia fazer isso mesmo sem comprometer demais. (Por exemplo, em uma máquina com 2 GB de RAM, não swap, e nenhum overcommit, você ainda pode memória mapear um arquivo de 4GB somente leitura, usando 4GB de memória virtual.)
David Schwartz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.