por que parte do meu espaço de troca está sendo usada quando ainda tenho RAM não utilizada?


9

Mais uma curiosidade do que um problema; e, admito, uma pergunta embaraçosamente básica:

Percebi que em muitas ocasiões, na minha máquina Linux, tenho ~ 500 MB de espaço de troca em uso, mesmo que eu tenha ~ 600 MB de RAM não utilizada.

Meu entendimento ingênuo de alto nível era que o espaço de troca não entra em ação até que a RAM esteja esgotada.

Fui mais longe e assumi que essa situação deve estar ocorrendo no kernel do Linux, porque um processo do usuário que solicita memória o faz apenas logicamente e não faz ideia de se essa memória é fisicamente suportada pela RAM ou pelo espaço de troca.

O que leva à pergunta: por que o kernel usaria preventivamente o espaço de troca? Isso faz parte de algum algoritmo de ajuste de desempenho? Ele está trocando para partes do disco da memória que considera menos prováveis ​​de serem acessadas (um esquema LRU, talvez)? Nesse caso, não faria sentido deixar tudo na RAM e somente quando estiver quase esgotado, e somente então troque as partes LRU da RAM para o espaço de troca?

Devo esclarecer, meu servidor Linux tem 2 GB de RAM e 2 GB de espaço de troca.


1
por que os 4 votos para encerrar esta pergunta?

2
@ Aaron: Não é que você tenha uma pergunta ruim. Você o formulou em termos de gerenciamento do sistema, para que ele se encaixe melhor com usuários avançados ou administradores de servidores. O fato de você pensar nisso como curiosidade parece mais um POV de usuário avançado.

Respostas:


11

A parte não utilizada da RAM é de fato usada como cache do disco rígido. Se você pensar bem, na verdade você lê partes do seu disco com mais frequência que acessa algumas partes da RAM. O que faz sentido colocar essa RAM no disco enquanto estiver usando a RAM para armazenar em cache os dados do disco rígido.


7

Faz sentido trocar as coisas com antecedência, pois quando você realmente precisa da memória, não precisará esperar até que o kernel termine com o acesso ao disco.

Por exemplo, digamos que você queira abrir uma imagem grande. Quando a imagem é carregada, são necessários 300 MB de RAM. Se o kernel usa toda a RAM possível, o carregamento da sua imagem exige que o kernel transfira 200 MB da RAM para o disco. Se ele esvaziou a RAM de maneira proativa, economize alguns milissegundos.


7

2 razões:

  1. (@dtrosset) O Linux trocará bits de programas não utilizados para fornecer mais cache e buffers.
  2. Você pode ter usado mais memória no passado e trocado algumas coisas, e elas não foram trocadas porque não foram usadas, mesmo que o que a forçou a sair agora.

1

Além das outras respostas, você pode configurar o Linux para exigir o backup de qualquer memória alocada, mesmo que os programas não o usem.

Supercomprimir memória e temer o OOM killer não são partes necessárias da experiência do Linux, no entanto. Simplesmente definir o parâmetro sysctl vm / overcommit_memory como 2 desativa o comportamento de supercomprometimento e mantém o killer do OOM para sempre à distância. A maioria dos sistemas modernos deve ter espaço em disco suficiente para fornecer um amplo arquivo de troca para a maioria das situações. Em vez de tentar impedir que processos de estimação sejam eliminados quando a memória supercomprometida acabar, pode ser mais fácil evitar a situação completamente. [ Respite do assassino de OOM ]

Se um programa alocar memória, o kernel pode simplesmente marcar mais páginas de troca como confirmadas. Essa indicação é armazenada no gerenciador de memória do kernel, o espaço em disco real ainda não foi tocado. Até que essa memória seja usada, nada precisa ser trocado dentro ou fora. Se eles nunca forem usados, o uso de swap flutuará sem afetar o desempenho.

Como os processos são apresentados com seu próprio espaço de endereço ou "visualização" (é assim que a troca funciona em primeiro lugar), o kernel tem muita margem de manobra na maneira como gerencia isso. Usando um exemplo de fork também do artigo vinculado acima, como é muito mais provável que você tenha páginas de memória compartilhada do que alocar recentemente uma grande quantidade de memória não utilizada, a memória pode ser alocada cópia-na-gravação, aumentando a contagem de uso de troca. Quando realmente é gravado (o que pode não acontecer), a "troca confirmada" pode ser substituída por qualquer RAM não utilizada (aumentando o uso da RAM e diminuindo o uso da troca). Imagine um processo com 500 MB alocados que garfos em uma máquina com toda ou quase toda a RAM em uso. Se houver 500 MB disponíveis no swap (e o espaço em disco for barato, qual o tamanho de 1% das unidades de TB atuais?: P), nenhuma memória precisará ser copiada (ainda,

Assim, é evitada a possibilidade do killer OOM, e é muito mais simples projetar a maioria dos softwares com o pressuposto de que as alocações de memória (incluindo alocações "implícitas" por meio de algo como fork) são bem-sucedidas ou falham imediatamente, com a constatação prática de que se a memória deve ser trocado, isso pode afetar o desempenho. Esse impacto é quase sempre leve, mas, na pior das hipóteses, leva à troca de thrashing (ainda às vezes preferível a uma falha total do kernel ou a um OOM killer).

Embora eu não conheça os detalhes exatos de como o gerenciador de memória do Linux funciona, essa resposta é meu próprio entendimento generalizado e o que eu lembro de ler ao longo dos anos. Tentei reeditar esta resposta para que seja necessária uma compreensão mínima do design do sistema operacional (é consideravelmente complexo e não é algo que me interessa muito), mas parece divagar um pouco; entre em contato se você ver como isso poderia ser melhorado. Por outro lado, pode não ser uma pergunta tão embaraçosamente básica.

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.