Quando a troca é esvaziada depois de ser usada?

2

Acabei de executar 4 instâncias de uma tarefa intensiva de memória (e CPU), que praticamente consumiu todos os 16 GB de memória e deu uma grande mordida na troca (2GB) também. Agora que o programa foi concluído, notei (via conky) que a RAM está liberada, os processadores estão quase em marcha lenta, mas a partição swap ainda está quase cheia.

O que me leva à minha pergunta, quando o kernel esvazia a troca? Corolário disso, o que acontece é que eu deveria executar outro lote desses processos intensivos, e eles precisavam obter algum espaço de swap também; a troca será esvaziada de informações não relevantes ou simplesmente falhará?

    
por posdef 03.08.2016 / 15:07

1 resposta

4

Vou usar as palavras "memória rápida" e "memória lenta" nesta resposta. Eles são descrições muito ruins do que realmente acontece, mas acho que isso ajuda a explicar o que está acontecendo.

Sua máquina possui uma "memória virtual" composta de memória rápida e lenta. Seu espaço total de memória é a memória rápida + lenta adicionada. Agora o computador só pode trabalhar diretamente na memória rápida para que o sistema operacional use isso primeiro. Quando a memória rápida estiver cheia, o sistema operacional tentará mover partes dela para a memória lenta. Isso libera memória rápida para uso. Agora, se o programa precisar usar alguns dados que estão na memória lenta, o sistema operacional moverá esses dados da memória lenta de volta para a memória rápida (pode ser necessário mover alguns dados da memória rápida para a memória lenta primeiro para liberar espaço).

Este processo é "paging" porque o sistema é inteligente o suficiente para que precise apenas mover páginas de memória e não programas inteiros. Um programa pode viver em memória rápida e lenta ao mesmo tempo. A única diferença, da sua perspectiva, é que a memória lenta é lenta .

Agora, quando o programa que consumiu toda a memória rápida tiver sido concluído, haverá muita memória rápida e o material ainda estará na memória lenta. Mas isso é um problema? Você tem a mesma quantidade de memória virtual livre e o sistema moverá essas páginas de volta para a memória rápida se elas forem necessárias. Se ninguém quiser essas páginas, você pode deixá-las na memória lenta; não faz mal!

Obviamente, nesta história, "memória rápida" é RAM, "memória lenta" é swap.

OK, então essa é uma história simplista na conversa "boba".

Mas é perto do que acontece.

O Linux não troca programas; swap implica que o programa inteiro e os segmentos de dados são para o dispositivo de swap de uma só vez. Em vez disso Linux páginas ; ele envia páginas de memória para o dispositivo de troca. Isso significa que um programa pode ter algumas páginas na RAM e algumas na troca. As páginas na troca serão "paginadas" sob demanda se forem acessadas; páginas na RAM serão "paginadas" para trocar para criar espaço livre na RAM.

Então, se você executou um programa que usou 16 GB de RAM e 2 GB de swap e, em seguida, os programas terminam, você pode acabar páginas em swap. Mas apenas páginas que ainda estão alocadas para programas estarão lá. Se free mostra 1G de swap em uso, então você ainda está usando essa quantidade de memória virtual em algum lugar. Mas as páginas em troca não foram acessadas recentemente e podem ser deixadas lá.

Agora, dependendo de suas cargas de trabalho, você pode obter um desempenho melhor deixando as páginas no dispositivo de troca ou para obter um melhor desempenho pró-ativamente, trazendo-as de volta para a RAM. Mas, em ambos os casos, você tem exatamente a mesma quantidade de memória virtual livre.

(As coisas ficam mais complicadas devido ao Linux permitir overcommit e outras coisas, mas essa é a idéia básica).

Há muitos parâmetros de ajuste em torno do gerenciamento de memória virtual ( link ), mas a menos que você realmente precisa ajustar as coisas que você pode querer apenas deixar os padrões. O link pode ser o único que vale a pena olhar.

    
por 03.08.2016 / 15:47

Tags