Por que a troca está sendo usada mesmo que eu tenha bastante RAM livre?

179

Eu achei que toda a essência do swap era atuar como uma rede temporária de segurança de armazenamento quando a RAM estava cheia, mas minha partição swap é usada constantemente, embora às vezes eu tenha até 3GB de RAM livre. Isso é normal?

    
por Mysterio 30.06.2012 / 00:16
fonte

6 respostas

156

Você pode tentar alterar seu valor "swappiness":

A partir do FAQ de troca do Ubuntu :

  

O que é swappiness e como posso alterá-lo?

     

O parâmetro swappiness controla a tendência do kernel de mover os processos da memória física para o disco de troca. Como os discos são muito mais lentos que a RAM, isso pode levar a tempos de resposta mais lentos para o sistema e os aplicativos, caso os processos sejam muito agressivamente removidos da memória.

     
    O
  1. swappiness pode ter um valor entre 0 e 100

  2.   
  3. swappiness = 0 diz ao kernel para evitar trocar os processos da memória física pelo maior tempo possível

  4.   
  5. swappiness = 100 diz ao kernel para trocar agressivamente os processos da memória física e movê-los para o cache de troca

  6.   

A configuração padrão no Ubuntu é swappiness = 60. Reduzir o valor padrão de swappiness provavelmente melhorará o desempenho geral de uma instalação de desktop típica do Ubuntu. Um valor de swappiness = 10 é recomendado, mas fique à vontade para experimentar. Nota: As instalações do servidor Ubuntu possuem diferentes requisitos de desempenho para sistemas desktop, e o valor padrão de 60 é provavelmente mais adequado.

     

Para verificar o valor do swappiness

     

cat /proc/sys/vm/swappiness

     

Para alterar o valor do swappiness Uma alteração temporária (perdida na reinicialização) com um valor swappiness de 10 pode ser feita com

     

sudo sysctl vm.swappiness=10

     

Para tornar uma alteração permanente , edite o arquivo de configuração com seu editor favorito:

     

gksudo gedit /etc/sysctl.conf

     

Pesquise por vm.swappiness e altere seu valor conforme desejado. Se vm.swappiness não existir, adicione-o ao final do arquivo da seguinte forma:

     

vm.swappiness=10

     

Salve o arquivo e reinicie.

Além disso, você pode conferir: link

    
por jpetersen 30.06.2012 / 01:10
fonte
82

Existem alguns aspectos diferentes para a sua pergunta.

Em primeiro lugar, qual é a sua definição de "livre". Na verdade, não é tão simples quanto parece no Linux (ou em qualquer sistema operacional moderno).

Como o Linux usa RAM (muito simplificado)

Cada aplicativo pode usar parte de sua memória. O Linux usa todas as outras memórias não ocupadas (exceto nos últimos Mb) como "cache". Isso inclui o cache de páginas, caches de inode, etc. Isso é bom - ajuda a agilizar as coisas. Tanto a gravação em disco quanto a leitura em disco podem ser aceleradas imensamente pelo cache.

O ideal é que você tenha memória suficiente para todos os seus aplicativos e ainda tenha várias centenas de Mb restantes para o cache. Nessa situação, desde que seus aplicativos não aumentem o uso de memória e o sistema não esteja lutando para obter espaço suficiente para o cache, não há necessidade de qualquer troca.

Uma vez que os aplicativos reivindicam mais RAM, ele simplesmente entra em algum espaço usado pelo cache, encolhendo o cache. A alocação de cache é barata e fácil o bastante para ser feita em tempo real - tudo o que fica no cache é apenas uma segunda cópia de algo que já está no disco, então pode ser desalocada instantaneamente, ou é algo que gostaríamos tiveram que descarregar para o disco dentro dos próximos segundos de qualquer maneira .

Esta não é uma situação específica do Linux - todos os sistemas operacionais modernos funcionam dessa maneira. Os diferentes sistemas operacionais podem relatar a RAM livre de forma diferente: alguns incluem o cache como parte do que consideram "livre" e outros não.

Quando você fala sobre RAM livre, é muito mais significativo incluir o cache , porque é praticamente gratuito - ele está disponível em qualquer aplicativo que o solicite. No Linux, o comando free relata as duas formas - a primeira linha inclui o cache na coluna RAM usada e a segunda linha inclui o cache (e os buffers) na coluna livre.

Como o Linux usa swap (ainda mais simplificado)

Depois de ter usado memória suficiente para que não haja espaço suficiente para um cache de execução suave, o Linux pode decidir realocar algumas memórias de aplicativos não utilizadas da RAM para trocar.

Não faz isso de acordo com um limite definido. Não é como se você alcançasse uma certa porcentagem de alocação, então o Linux começa a trocar. Tem um algoritmo bastante "fuzzy". São necessárias muitas coisas, que podem ser melhor descritas por "quanta pressão existe para alocação de memória". Se houver muita "pressão" para alocar nova memória, aumentará as chances de que alguns sejam trocados para ganhar mais espaço. Se houver menos "pressão", diminuirá essas chances.

Seu sistema tem uma configuração "swappiness" que ajuda a ajustar como essa "pressão" é calculada. Normalmente não é recomendado alterar isso, e eu não recomendaria que você alterasse isso. A troca é, em geral, uma coisa muito boa - embora existam alguns casos extremos em que isso prejudica o desempenho, se você observar o desempenho geral do sistema, isso é um benefício para uma ampla gama de tarefas. Se você reduzir o swappiness, você deixará a quantidade de memória cache encolher um pouco mais do que seria de outra forma, mesmo quando realmente for útil. Se esta é uma troca boa o suficiente para qualquer problema que você está tendo com a troca é com você. Você deveria saber o que está fazendo, só isso.

Existe uma situação bem conhecida em que o swap prejudica o desempenho percebido em um sistema de desktop, e está na rapidez com que aplicativos podem responder à entrada do usuário novamente depois de ficar ocioso por um longo tempo e ter processos em segundo plano pesados em IO ( como um backup noturno) executado. Esta é uma lentidão muito visível, mas não o suficiente para justificar a desativação do swap e a prevenção de qualquer sistema operacional. Desligue o swap e essa lentidão inicial após o backup / verificação de vírus pode não acontecer, mas o sistema pode ficar um pouco mais lento durante todo o dia. Esta não é uma situação limitada ao Linux.

Ao escolher o que deve ser trocado para o disco, o sistema tenta escolher a memória que não está sendo usada - ler ou gravar de. Tem um algoritmo bastante simples para calcular isso que escolhe bem na maioria das vezes.

Se você tem um sistema onde você tem uma quantidade enorme de RAM (no momento da escrita, 8GB é uma quantia enorme para uma distro típica do Linux), então você raramente atingirá uma situação em que a troca é necessária. Você pode até tentar desativar a troca. Eu nunca recomendo fazer isso, mas apenas porque você nunca sabe quando mais RAM pode salvá-lo de alguma falha do aplicativo. Mas se você sabe que não vai precisar, você pode fazer isso.

Mas como pode a troca acelerar o meu sistema? Não troca coisas lentas?

O ato de transferir dados da memória RAM para a troca é uma operação lenta, mas só é tomada quando o kernel tem certeza de que o benefício geral superará isso. Por exemplo, se a memória da sua aplicação subiu a tal ponto que você quase não tem cache e sua E / S é muito ineficiente por causa disso, você pode obter muito mais velocidade do seu sistema liberando alguma memória, mesmo após o gasto inicial de trocar dados para liberá-lo.

Também é um último recurso, caso seus aplicativos realmente solicitem mais memória do que você realmente tem. Nesse caso, a troca é necessária para evitar uma situação de falta de memória, que muitas vezes resultará na queda de um aplicativo ou na necessidade de ser morto à força.

Troca é apenas associada a momentos em que seu sistema está tendo um desempenho ruim, porque acontece quando você está ficando sem memória RAM utilizável, o que tornaria seu sistema mais lento (ou instável) mesmo se você não trocou. Então, para simplificar as coisas, a troca acontece porque o seu sistema está ficando sobrecarregado, e não o contrário.

Quando os dados estão em swap, quando são lançados novamente?

A transferência de dados para fora da troca é (pelo menos para discos rígidos tradicionais) tão demorada quanto colocá-lo lá. Então, compreensivelmente, seu kernel ficará relutante em remover dados de swap, especialmente se não estiver sendo usado (por exemplo, lido ou gravado). Se você tem dados em swap e não está sendo usado, então é realmente bom que ele permaneça em swap, já que ele deixa mais memória para outras coisas que estão sendo usadas, potencialmente acelerando seu sistema.

    
por thomasrutter 04.07.2012 / 05:50
fonte
21

Definir o valor do swappiness não funciona em todas as situações. Se isso funciona para você, ótimo. Se não, escrevi um script para periodicamente limpar o swap, desligando-o e ligando novamente.

Trocar o swap é um pouco arriscado se você não for cuidadoso. Se você não tem RAM livre o suficiente para armazenar tudo em RAM mais tudo em troca, tentar desabilitar a troca fará com que seu sistema pare de responder. Meu script primeiro verifica se há RAM livre suficiente (o que é um pouco trabalhoso, já que a quantidade real de RAM livre é diferente da que o free reporta como livre), então somente alterna swap em caso afirmativo. Mas, se você estiver com pouca memória RAM, não inicie outro processo importante enquanto o script estiver sendo executado. Aqui está:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Você deve executar esse script como raiz (por exemplo, com sudo ). Este script não deixará seu sistema sem resposta; se você tiver RAM insuficiente, ele se recusará a alternar a troca. Eu usei este script sem problemas por quase cinco anos agora.

    
por Scott Severance 04.07.2012 / 04:38
fonte
4

Geralmente, o swap permanece não utilizado nos sistemas atuais. Na minha experiência, os processos que estão em execução por um longo tempo sem operações intensivas são deslocados para swap pelo linux.
Isso faz com que alguns programas afetados sejam lentos.
Se você tem muito ram livre, você pode desligar o swap executando o comando:
swapoff -av (você precisará de sudo direitos para isso.)
Se você não gostar da troca, você pode ativá-la usando o comando simétrico: swapon -av (novamente sudo obrigatório).

    
por drake01 30.06.2012 / 00:24
fonte
3

Uma vez que a troca tenha sido usada para um programa, ela tende a permanecer mapeada durante a vida do programa. Muitos programas têm código (e dados) que raramente é usado. Uma vez que a memória é trocada, é improvável que seja trocado.

Uma maneira de forçar essas páginas na memória é desligar o dispositivo de troca. Se você tiver dois, pode desligar um, ligá-lo novamente e depois desligar o segundo. Se a troca for realmente necessária, ela será movida entre os dispositivos. Você pode simplesmente desligar o dispositivo de swap (ou arquivo), mas se você realmente precisar de espaço de troca, coisas drásticas podem acontecer.

Além das coisas normais na memória, o tempfs usa o espaço de troca e troca como o resto da memória. Se você executar algo que exija muito disco temporário, ele poderá forçar a troca de páginas. Uma vez criados, os arquivos temporários não podem mais ser usados após alguns minutos e são bons candidatos para serem movidos para o dispositivo de troca.

Em uma pitada, você pode usar um arquivo como um dispositivo de troca. Isso é útil se você precisar de espaço de troca extra temporariamente.

    
por BillThor 30.06.2012 / 06:02
fonte
2

Eu editei o script do Scott Severance para combinar com as versões mais novas do free que já incluem um campo de memória total disponível.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print }')"
used_swap="$(free | grep 'Swap:' | awk '{print }')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
    
por derberlinersmurf 03.10.2017 / 15:37
fonte