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.