Liberando espaço de troca

10

Às vezes, o kernel parece ter a intenção de manter, por exemplo, o firefox em troca, mesmo que haja memória física suficiente disponível e eu esteja usando o firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

Existe um comando para instruir o kernel a liberar espaço de troca e usar a memória livre disponível?


Atualização : embora, a curto prazo, eu usei swapon / swapoff, agora defino

sudo sysctl vm.swappiness=30

conforme sugerido em outra resposta e obtenha resultados muito bons.

Robert Munteanu
fonte

Respostas:

2

Você pode fazer umswapoff - precisará de privilégios de root,
mas acho que isso não é um problema para você.

nik
fonte
15

Você pode fazer o que o nik sugeriu e usar o swapoff . No entanto, existe outra maneira mais elegante de ajustar a "troca" ou a agressividade com que o kernel troca os programas para o disco em sistemas executando os kernels 2.6.

Houve debates acalorados nas listas de discussão do kernel do linux sobre a política que o kernel deve seguir em relação ao comportamento de troca . O resultado é que agora temos um patch no kernels 2.6 que nos permite ajustar esse comportamento em grande parte.

Observe que você precisa de privilégios de root para fazer isso, como faria para executar os comandos swapoff / swapon.

O valor atual de "swappiness" pode ser inspecionado no arquivo / proc / sys / vm / swappiness ou executando este comando sysctl :

sudo sysctl vm.swappiness

Os valores de "troca" podem variar de 0 (sem troca) a 100 (troca para disco o máximo possível). O Ubuntu é fornecido com o swappiness padrão definido como 60.

Para alterar isso para uma sessão, chame o sysctl novamente e passe um valor de troca para usar:

sudo sysctl vm.swappiness=30

Além livre , você pode, naturalmente, monitorar os efeitos de se fazer isso através do excelente htop ou iotop utilitários.

Se você gosta do que vê e deseja reter esse valor nas reinicializações, basta colocar "vm.swappiness = 30" no arquivo /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

Você pode jogar com valores diferentes até encontrar um que implique um nível aceitável de troca na sua máquina.


fonte
+1 para sysctl. Ao experimentar diferentes valores de troca, você pode gravar diretamente no arquivo proc (eco "30"> / proc / sys / vm / swappiness). Essas alterações são temporárias e não serão gravadas no /etc/sysctl.conf. Quando estiver satisfeito com as configurações, use o sysctl para fazer uma alteração 'permanente'.
Shawn Chin
6

Lembre-se de que o material em troca foi colocado lá em um momento mais movimentado do que agora.

Você pode achar que os dados também estão na RAM - tendo sido carregados novamente para uso, mas não apagados do swap. O kernel faz isso para economizar tempo no próximo período ocupado - se os dados já estiverem copiados, ele poderá liberar a RAM que está usando, em vez de ter que gravar primeiro o disco. Portanto, a menos que você saiba que a máquina não precisará trocar novamente em um futuro próximo, forçar a liberação do espaço de troca pode não conseguir nada, exceto para diminuir as coisas um pouco mais na próxima vez que a troca for necessária.

Isso é gerenciado com base na exclusão na gravação, portanto, se a cópia na RAM for atualizada, os blocos no swap serão liberados.

Se o espaço de troca for necessário para outra coisa, que não será no momento, pois você tem bastante espaço livre, ele será liberado para esse uso.

Você não pode ver a quantidade de dados nesse estado (tanto em páginas baseadas em disco em áreas de troca quanto em RAM) na saída de free. Você pode vê-lo através do /procsistema de arquivos especial. Veja a saída de cat /proc/meminfopara a SwapCachedcontagem.

Outras duas razões para haver troca em uso quando há memória aparentemente disponível são

  • quando sob carga de E / S pesada, o kernel decidiu que as páginas que não são usadas há muito tempo são melhor trocadas para que ele possa usar a RAM para cache / buffers, apesar de observar a sua freesaída que provavelmente não é o caso aqui. ter um pedaço de RAM verdadeiramente não alocada, bem como a usada pelos buffers / cache de E / S.
  • as páginas foram trocadas por algum motivo anteriormente e não são mais necessárias desde então - talvez seja a memória em uso por um processo que está inativo há algum tempo. Nesse caso, liberar a troca (portanto, carregar as páginas de volta na RAM) pode melhorar o tempo de resposta desse processo na próxima vez que for necessário fazer algo diferente de suspensão, mas se já estiver inativo por algum tempo, talvez não seja necessário. a qualquer momento no futuro próximo de qualquer maneira.
David Spillett
fonte
1
+1 para uma excelente explicação. Para sua informação, o vmstat permite que você veja / proc / meminfo dados através de nem todos.
1

Lembre-se de que freeé apenas um instantâneo do uso da memória. O resultado que você está vendo pode implicar que, em algum momento no passado, o sistema estava com pouca memória RAM, então o material residente na RAM foi trocado. Desde então, a RAM tornou-se livre, mas o material da troca não foi necessário, portanto ainda é mantido na troca, em vez de apenas sobrecarregar a RAM. Se for esse o caso, desativar a troca seria uma má ideia. Existem processos que podem exigir uma quantidade tão grande de RAM desde a última recarga?

Além disso, convém verificar se você não tem uma restrição no tamanho máximo de residente definido via ulimit (geralmente em / etc / profile, mas talvez isso varie com as distribuições e pode ser definido por processo (por exemplo, em um script de inicialização) )

Finalmente, no Microsoft Windows, há relatos de problemas específicos com o Firefox sendo trocados para o disco, por exemplo, quando minimizados (por exemplo, http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). Eu nunca ouvi falar disso nos sistemas GNU / Linux, mas pode valer a pena explorar.

mas
fonte
Obrigado pela resposta. Meu problema não é que o swap esteja sendo usado, mas que agora ele seja usado para programas ativos, como Firefox e Thunderbird, que parecem lentos. Uma troca / troca os fez sentir-se instáveis ​​novamente.
1111 Robert Munteanu