Liberando espaço de troca

10

Às vezes, o kernel parece ter a intenção de manter, e. firefox no swap, 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 descartar o espaço de troca e usar a memória livre disponível?

Atualização : embora no curto prazo eu usei swapon / swapoff, eu agora defini

sudo sysctl vm.swappiness=30

como sugerido em outra resposta, e obtenha resultados muito bons.

    
por Robert Munteanu 11.08.2009 / 09:10

4 respostas

2

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

    
por 11.08.2009 / 09:21
15

Você pode fazer o que o nik sugeriu e usar o swapoff . No entanto, existe outra maneira mais elegante de ajustar o "swappiness", ou quão agressivamente o kernel troca os programas no disco em sistemas que executam 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 nos kernels 2.6 que nos permite ajustar este comportamento em grande medida.

Note que você precisa de privilégios de root para fazer isso, como você executaria 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 "swappiness" podem variar de 0 (sem troca) a 100 (swap para disco tanto quanto possível). O Ubuntu vem com o swappiness padrão configurado para 60.

Para mudar isto para uma sessão, chame sysctl novamente e passe um valor swappiness para usar:

sudo sysctl vm.swappiness=30

Além de free , você pode monitorar os efeitos de fazer isso através dos excelentes utilitários htop ou iotop .

Se você gostar do que vê e quiser manter esse valor entre as reinicializações, coloque "vm.swappiness = 30" no /etc/sysctl.conf arquivo.

$ 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 diferentes valores até encontrar um que implique um nível aceitável de troca em sua máquina.

    
por 11.08.2009 / 09:58
6

Lembre-se de que as coisas trocadas foram colocadas lá em um horário mais ocupado do que agora.

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

Isso é gerenciado com base em delete-on-write, portanto, se a cópia na RAM for atualizada, os blocos na troca serão liberados.

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

Você não pode ver quantos dados estão nesse estado (de estar nas páginas baseadas em disco nas áreas de troca e na RAM) na saída de free . Você pode vê-lo através do sistema de arquivos /proc especial. Veja a saída de cat /proc/meminfo para a contagem SwapCached .

Outras duas razões para que haja swap em uso quando aparentemente há memória sobressalente são

  • quando sob carga pesada de E / S, o kernel decidiu que as páginas que não foram usadas há muito tempo são trocadas para que ele possa usar a RAM para cache / buffers, apesar de olhar para a saída free que é provavelmente não é o caso aqui, já que você tem um pedaço de RAM não alocado, bem como aquele usado pelo cache / buffer de IO.
  • as páginas foram trocadas por algum motivo antes, e só não foram necessárias novamente desde - talvez seja a memória em uso por um processo que está inativo há algum tempo. Nesse caso, liberar a troca (carregando as páginas de volta na RAM) pode melhorar o tempo de resposta desse processo na próxima vez em que for necessário fazer algo diferente de dormir, mas se ele estiver inativo por algum tempo, talvez não seja necessário a qualquer momento no futuro próximo de qualquer maneira.
por 11.08.2009 / 11:11
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 ficando sem RAM, então trocava o material residente na RAM. Desde então, a RAM tornou-se livre, mas o material em swap não foi requerido, portanto, ainda é mantido em swap, em vez de apenas sobrecarregar a RAM. Se for esse o caso, desligar o swap seria uma má ideia. Há algum processo que possa exigir uma quantidade tão grande de RAM desde a última recarga?

Além disso, você pode querer verificar se você não tem uma restrição no tamanho máximo de residentes configurado via ulimit (geralmente em / etc / profile, mas talvez varie com distribuições e possa ser definido por processo (por exemplo, em um script de lançamento)).

Por fim, no Microsoft Windows, há relatos de problemas específicos com o Firefox sendo colocado em disco, por exemplo, quando minimizado (por exemplo, link ). Eu não ouvi falar disso em sistemas GNU / Linux, mas pode valer a pena explorar.

    
por 11.08.2009 / 09:55