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.
Respostas:
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.
fonte
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.
fonte
2 razões:
fonte
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.
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.
fonte