Quando a troca é retornada à memória física?

8

Quando a troca é retornada à memória física no Linux? É apenas sob demanda, ou seja. quando é necessário? Ou a troca é transferida lentamente para a memória física quando o computador não está com carga alta?

Ztyx
fonte

Respostas:

7

Sob demanda. De fato, o Linux transferirá lentamente a memória física para trocar quando estiver ociosa (consulte: "troca").

Ignacio Vazquez-Abrams
fonte
Obrigado. Uma resposta curta e concisa. Eu gosto disso (mesmo que aprecie o esforço de todos os outros em suas respostas)!
Ztyx
Esta resposta está errada. A questão é quando a memória é paginada e não paginada. Isto é o oposto. Em uma falha de página, o kernel recarregará a página do disco / swap. Então, principalmente sob demanda. Você pode acessar toda a memória virtual de um processo para acionar falhas de página. Como resultado, as páginas seriam copiadas de volta para a RAM.
user228505
7

Durante a operação regular, os dados do swap são carregados na memória sob demanda, como outros responderam, mas há mais um caso quando isso acontece: é quando o espaço do swap é desativado, desde que haja memória física suficiente para carregar todo o conteúdo do swap.

Apenas faça:

swapoff -a

… E todos os seus dados de troca voltarão à memória. O efeito colateral é que os buffers / caches de disco podem ser liberados.

Às vezes, pode ser desejável swapoff -a ; swapon -a, por exemplo, depois de algum processo de vazamento de memória com erros, antes de travar, varrer processos mais importantes - para garantir que qualquer processo em execução no sistema seja carregado na memória e não espere a troca no alguns minutos.

Jacek Konieczny
fonte
Ah, você aprende algo de bom todos os dias! Btw, 'swap -a' falhará não há memória física suficiente? Existe um risco envolvido na chamada de troca?
Ztyx 24/06/10
Ele falhará se não houver memória física suficiente. Esse ainda é um risco swapoffque não falhará, mas o sistema ficará sem memória logo após o processo swapoffe o OOM interromperá o processo aleatório (no pior caso, o shell prestes a chamar swaponou o swaponcomando). Na prática, é muito improvável - muita memória é usada pelos caches antes de swapoffser chamada, portanto deve haver RAM suficiente para que ambos os comandos sejam executados.
Jacek Konieczny
7

Como outros já apontaram, as páginas só serão copiadas de volta para a RAM quando necessário (sob demanda) em vez de ocupar a RAM que seria melhor deixar disponível para cache / buffers.

O fato de as páginas serem copiadas de volta para a RAM, não movidas, é importante e pode causar confusão se você não estiver ciente disso. A página não será desalocada do swap, a menos que não seja mais necessária (isto é, a página seja desalocada completamente), seja alterada na RAM (portanto, a cópia no swap não está mais correta) ou o swap estiver acabando (e o são necessários blocos de disco para trocar algumas outras páginas). Dessa forma, se a página precisar ser trocada novamente no futuro, nenhuma gravação no disco será necessária, pois o kernel sabe que já existe uma boa cópia no disco - isso pode reduzir muito o "thrashing" quando a RAM disponível fica criticamente baixa, mas o espaço de troca também não é necessário. congestionado.

Você pode ver quantas páginas estão atualmente na RAM e nas quais são trocadas cat /proc/meminfo- a SwapCachedlinha é a quantidade de dados que estão nas páginas que estão atualmente na RAM e no disco. Se você acha que seu swap atual o usa mais do que o esperado, verifique o valor SwapCached, pois isso pode explicar a discrepância.

David Spillett
fonte
Houve discussões em torno de questões semelhantes antes. No entanto, não esta questão específica. Consulte também serverfault.com/questions/100448/…, que trata do SwapCached.
Ztyx
Eu nem me lembro de escrever essa resposta ... eu poderia ter, provavelmente, apenas ligado a (ou cópia + colado) em vez de digitar o acima ...
David Spillett
0

Isso normalmente está vinculado ao hardware que você está usando. Na maioria dos hardwares (incluindo intel), a MMU controla todo o processo.

Quando um programa aloca memória, solicita-o à MMU e recupera um endereço virtual. Por sua vez, o MMU registrará essa página como "em uso" no mapa do espaço de endereço global.

Quando o programa realmente acessar esse espaço de memória, a MMU pesquisará a página no mapa de endereços. Se essa página estiver na memória "ao vivo", ela retornará um ponteiro "ao vivo" ao sistema operacional, que manipulará a leitura / gravação na memória em nome do programa. Se a memória não estiver alocada no momento, ela provocará uma falha na página. Essa exceção do processador é capturada pelo sistema operacional, que é responsável por descobrir onde os dados estão no arquivo de permuta, carregá-los na memória física e devolver a página à MMU para que o processo inicial possa continuar.

Isso significa que, a menos que a página de memória seja acessada, ela nunca voltará à memória "ao vivo" depois de trocada. É por isso que geralmente existe uma API do sistema operacional que permite aos programas especificar que um bloco de memória específico NÃO deve ser trocado para o disco e deve ser mantido na memória (não sei sobre o Linux, mas no Windows, é a função VirtualLock) .

Stephane
fonte
mlock(2) linux.die.net/man/2/mlock
Ignacio Vazquez-Abrams