Linux: como desassociar explicitamente tudo o que é possível?

59

Lancei algo que levou muita memória e agora tudo fica muito. Eu acho que a memória de todos os aplicativos foi trocada para liberar espaço para o processo intensivo de memória e agora tudo está retornando lentamente à RAM quando acessado.

Existe uma maneira de mover explicitamente todo o possível da troca de volta para a RAM? Ou talvez não tudo, mas apenas alguns dados de processos específicos?

Kolypto
fonte

Respostas:

59

Eu recomendaria permitir a troca normal do controle de memória do Linux nas coisas que são realmente usadas, à medida que são usadas.

A única coisa que consigo pensar é desligar a troca e ligá-la novamente

sudo swapoff -a
sudo swapon -a

Isso pressupõe que você tenha memória física disponível suficiente para conter tudo em troca ...

Douglas Leeder
fonte
4
Funciona muito devagar :) Obrigado! Mas eu ainda acredito que há uma solução mais elegante :)
kolypto
7
Cuidado com esta solução, tirará tudo da troca à força ... se não couber na memória física, o kernel iniciará o mortal OOM killer. Não conheço nenhum comando "tente mover tudo para a RAM, mas falhe normalmente, se não for possível".
Juliano
1
Eu tentei e descobri que funciona muito lentamente. Portanto, é possível monitorar a RAM livre e matar swapoffse a memória vai baixa: neste caso, o espaço de troca permanecerá funcional :)
kolypto
2
Não tenho certeza se matar o swapoff realmente interromperá a operação. Depende de como é implementado.
Douglas Leeder
3
Parece que o comando swapoff faz algo como "não permitir que novas gravações sejam trocadas" enquanto qualquer outro processo em execução (que estava / está usando a troca) ainda pode "liberar a troca". Talvez por isso pareça ir tão devagar. Parece não causar OOMs como outra pessoa disse (estou usando o Ubuntu Bionic) - provavelmente isso seria o caso se "processos adicionais (ou existentes) começarem a usar nova memória" (ou seja, OOMs reais). Portanto, no geral, o swapoff / swapon é uma ótima solução. Suave / estável. Isso pressupõe que você não inicia mais memória usando processos (ou aumenta o consumo nos processos em execução).
Roel Van de Paar
13

Você pode sintonizar o eco de algum número entre 0 e 100 /proc/sys/vm/swappiness.

Este controle é usado para definir quão agressivo o kernel trocará as páginas de memória. Valores mais altos aumentam a agressividade, valores mais baixos diminuem a quantidade de swap . Um valor 0 instrui o kernel a não iniciar a troca até que a quantidade de páginas gratuitas e com backup de arquivo seja menor que a marca d'água alta em uma zona.

O valor padrão é 60.

sntg
fonte
13
Não use / proc / sys diretamente, use o sysctlcomando. Nesse caso, é sysctl vm.swappiness=x.
Juliano
7
Eu não acho que mesmo uma troca de zero faça com que as páginas já trocadas sejam explicitamente trazidas para a memória principal?
Douglas Leeder
1
@Douglas está certo. O vm.swappiness controlará principalmente a decisão de mover coisas para trocar ou reduzir a quantidade de caches e buffers quando a memória for exigida.
Juliano
@ Juliano, por que o / proc / sys não deve ser usado?
James
@James Porque / proc / sys é a interface de nível inferior usada para alterar e consultar a configuração do kernel (é "detalhe da implementação"). O Linux fornece o sysctlcomando de nível superior para a interação do usuário. O resultado final é o mesmo, mas geralmente as interfaces de nível superior são preferidas para o usuário interagir diretamente. É como ligar o motor em curto-circuito nos fios de ignição (nível inferior) em vez de apenas girar a chave (nível superior).
Juliano
5

O Linux faz um bom trabalho no gerenciamento de memória e você não deve ficar no caminho. A configuração vm.swappiness (mencionada anteriormente) não atrapalha. É mais provável que você tenha problemas estranhos ao fazer as coisas de outra maneira.

O que você lançou com tanta memória? Pode ser sintonizado? Se ele não possui suas próprias diretivas de limite de memória, você também pode examinar o ulimit.

Aproveite a noite
fonte
No meu caso, foi convert -density 200 file.pdf jpegs/file.jpg. Por alguma razão, ele usa muita memória, mas você está certo: pode ser ajustado. De qualquer forma, a situação é possível com qualquer aplicação :)
kolypto
1
Concordo com esta resposta - você provavelmente deve deixar as operações normais na máquina para trocar o que é realmente necessário.
Douglas Leeder
converttem o -limitargumento para controlar a memória versus o uso do disco, e você deve ler sobre eles. Cenário -limit memory 512MBou similar seria bom. Provavelmente também seria bom especificar um MAGICK_TEMPORARY_PATH explícito e limpá-lo após a conclusão do comando.
slacy
3

Se você tiver memória disponível para todos os seus aplicativos, não há problema em definir o swappiness como 0 para que as coisas não sejam trocadas. Por exemplo, qemu-kvm é um grande alvo para o VMM ser trocado, porque "parece" ficar ocioso na maior parte do tempo. Eu vejo até 80% da memória de uma memória qemu-kvm ser gravada para trocar. As VMs em execução no qemu-kvm ficarão quase sem resposta porque estão ficando sem troca (embora o convidado não tenha ideia de que isso está acontecendo). A VM convidada pensará que está apresentando um desempenho excelente, embora na verdade esteja se arrastando terrivelmente. Quando várias VMs "acordam" e começam a fazer as coisas, elas podem aumentar a carga média em mais de 30, mesmo em hardware de nível empresarial com memória e disco rápidos e amplos. Eu acho que isso é uma falha no design qemu-kvm pronto para uso.

Espero que isso ajude alguém.

Gruic
fonte
Receio que isso não seja muito preciso.
precisa saber é o seguinte
2

Eu desaconselharia a tentativa de superar o subsistema VM no kernel. É EXTREMAMENTE improvável que você realmente tenha informações suficientes para tomar decisões melhores do que elas. E se você forçar de alguma maneira a fazer a coisa errada, acabará tornando as coisas ainda mais lentas.

Michael Kohne
fonte
9
Existem alguns casos em que eu quero fazer o que o OP quer. Se eu acidentalmente deixar um processo correr tumultuado e ocupar toda a minha RAM + swap, posso esperar 15 segundos toda vez que troco de aplicativo para que a memória saia da troca ou apenas forçá-lo e executar tudo o mais rápido possível.
Alex #
Bem ... quero que a "troca" ocorra durante o meu café, nem sempre quando tento mudar de aplicativo. É "ultrapassar o subsistema VM" quando quero informá-lo de uma pausa para o café?
Klaws
1

Se você é capaz de reiniciar o sistema que deve fazê-lo (e pode levar muito menos tempo do que tentar qualquer outra solução).

Maximus Minimus
fonte
1

Para copiar parte da minha resposta desta pergunta .

Para que você saiba como o ajuste do swappiness funciona. Isso funciona dizendo ao subsistema da VM que procure páginas para trocar quando a% de memória mapeada para processar tabelas de páginas + valor de swappiness for> 100. Portanto, uma configuração de 60 fará com que o sistema comece a paginar páginas antigas da tabela de páginas do processo quando estiver usando mais de 40% da memória do seu sistema. Se você deseja permitir que seus programas usem mais memória às custas do cache, diminua o valor da troca.

3dinfluence
fonte
Não acho que a memória do programa x o cache seja o problema aqui - acho que é a memória do aplicativo vs. a memória não utilizada. E não acho que a troca afetará isso.
Douglas Leeder
0

O processo ainda está em execução? Abra um terminal e veja se consegue identificar o (s) processo (s) iniciado (s). (ps aux | grep nome do processo pode facilitar um pouco) Use kill -9 PID para eliminá-los se eles ainda estiverem em execução. Tenha cuidado com o que você mata. Se você não sabe qual é o processo, não o mate! Além disso, publique a saída do free -m para que possamos ver se você ainda está usando muito swap.

Se as coisas ainda estiverem lentas, você ainda pode ter o que lançou ainda em execução. Eu nunca desligaria a troca, a menos que você realmente saiba o que está fazendo ou gosta de viver no limite. =)

jdoss
fonte
0

Acredito que não existe uma maneira realmente boa de forçar o Linux a desassociar dados do disco para a memória. Quando swapoff / swapon é uma solução funcional, mas está suja e pode facilmente tornar seu sistema instável. Nos casos em que há mais dados no swap do que memória livre, será difícil imaginar qualquer política eficiente que o Linux possa empregar para decidir quais partes dos dados serão transferidas para a memória e quais serão mantidas no disco.

Resumo: Apenas deixe o Linux gradualmente restaurar seu desempenho da maneira normal. Seu subsistema de VM é organizado de tal maneira que se esforça e se move constantemente para um estado equilibrado ideal.

ZarathustrA
fonte
-2

Esvaziando o cache de buffers

Se você quiser esvaziá-los, poderá usar esta cadeia de comandos.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Você pode sinalizar ao Kernel do Linux para descartar vários aspectos dos itens em cache, alterando o argumento numérico para o comando acima.

NOTA: limpe a memória de coisas desnecessárias (Kernel 2.6.16 ou mais recente). Sempre execute a sincronização primeiro para liberar coisas úteis para o disco !!!

  • Para liberar pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Para liberar dentries e inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Para liberar pagecache, dentries e inodes:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Os itens acima devem ser executados como root. Se você estiver tentando fazê-los usando o sudo, precisará alterar a sintaxe ligeiramente para algo como estes:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
slm
fonte