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


Eu pensei que toda a essência da troca era agir como uma rede temporária de segurança de armazenamento quando a RAM estava cheia, mas a minha partição swap é constantemente usada mesmo que eu tenha, por vezes, até 3 GB de RAM livre. Isso é normal?


183
2018-06-29 22:16


origem


Por favor, compartilhe o conteúdo ou a saída dos seguintes comandos / arquivos para melhor nos ajudar a solucionar seu problema (instruções nesta resposta): free -m, top -b 1 - ish
Vai atualizar a questão com pastebins desses comandos amanhã. São 12 da manhã agora :( - Mysterio
Eu deveria editar o título para adicionar "... mas estou com muito sono para me importar agora, então vocês também tiram um cochilo": P - ish


Respostas:


Você pode tentar mudar o seu valor "swappiness":

De 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, se os processos forem muito agressivamente removidos da memória.

  1. swappiness pode ter um valor entre 0 e 100

  2. swappiness = 0 informa ao kernel para evitar a troca de processos da memória física pelo maior tempo possível

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

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 têm requisitos de desempenho diferentes para sistemas desktop, e o valor padrão de 60 é provavelmente mais adequado.

Para verificar o valor de swappiness

cat /proc/sys/vm/swappiness

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

sudo sysctl vm.swappiness=10

Para tornar uma mudança permanenteedite o arquivo de configuração com seu editor favorito:

gksudo gedit /etc/sysctl.conf

Pesquise 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: https://askubuntu.com/a/103916/54187


161
2018-06-29 23:10



Especulação ociosa: isso pode realmente ser benéfico para o desempenho - páginas que não foram acessadas em algum momento podem ser copiadas para trocar espaço, o que permite que o SO as libere rapidamente se precisar de memória, mas o conteúdo da página permanece na memória . - Simon Richter
@ SimonRichter Sim, essa é a ideia. Swappiness of 60 é provavelmente muito agressivo em sistemas modernos, já que isso significa que você está começando a trocar quando ainda tem vários shows de memória livre. - Brendan Long
Corre sudo sysctl --load=/etc/sysctl.conf depois de editar o arquivo para aplicar as alterações - deFreitas


Existem alguns aspectos diferentes para 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. Usa Linux toda a memória de outra forma desocupada (exceto para os últimos poucos 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.

Idealmente, você tem memória suficiente para todos os seus aplicativos e ainda tem 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 teve que liberar para o disco dentro dos próximos segundos de qualquer forma.

Essa 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 cache, porque é praticamente gratuito - está disponível se qualquer aplicativo solicitar. No Linux, o free O comando relata os dois caminhos - 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)

Uma vez que você tenha 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 a troca.

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.

Há uma situação bem conhecida na qual o swap prejudica o desempenho percebido em um sistema de desktop, e está na rapidez com que os aplicativos podem responder à entrada do usuário novamente depois de ficar ocioso por um longo tempo e ter processos em segundo plano pesados ​​(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 também.

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 grande quantidade 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 disso, posso faça.

Mas como pode trocar a velocidade do 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 a despesa inicial de troca de 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.

A troca é apenas associado com horários 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 tornaria instável) mesmo se você não tivesse swap. Então, para simplificar as coisas, a troca acontece Porque seu sistema está se atolando, e não o contrário.

Uma vez que os dados estão em swap, quando sai novamente?

Transferir dados de swap é (pelo menos para discos rígidos tradicionais) tão demorado 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 estamos sendo usado, potencialmente acelerando o seu sistema.


83
2017-07-04 03:50



+1 para uma explicação detalhada. Eu também gosto de manter 2GiB swap em meus computadores. Se algo der errado - vazamentos de memória, etc., você poderá ver a troca subindo e procurando o problema antes que ocorra falta de memória. É uma rede de segurança, bem como uma ferramenta de desempenho. - Joe
No meu netbook, que tem apenas 2GB de RAM, mantenho 4GB de swap. Isso ocorre porque eu uso o netbook para muito mais que se destinava e meus programas freqüentemente exigem mais de 2 GB de memória. Como o Linux se comporta muito mal em situações de falta de memória, prefiro ter uma grande rede de segurança. E eu tenho muito espaço em disco. - Scott Severance
Se seus programas freqüentemente exigem mais de 2GB de memória, eu consideraria colocar mais RAM lá dentro (é super barato!) Porque a RAM desgastante prejudicará o desempenho. Para o benefício de outros leitores: faça com que você não esteja apenas olhando para a memória cache que é suposto Hog RAM disponível - veja outras referências a free -m. - thomasrutter
@neon_overload: Eu devo apenas observar que, de acordo com a HP, a memória RAM máxima do meu netbook é de 1GB. Eu tenho 2GB lá agora, e fontes da internet sugerem que 2GB é o máximo real. Assim, a necessidade de esses tipos de soluções alternativas. - Scott Severance
@thomasrutter: Como sua resposta muda para servidores grandes, um dos meus tem 1TB (sim, um terabyte completo) de RAM e ainda está usando o swap; que configuração de swappiness e qual partição swap de tamanho você recomendaria? - chrisinmtown


Definir o valor de swappiness não funciona em todas as situações. Se isso funciona para você, ótimo. Se não, eu 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 memória RAM suficiente para armazenar tudo na memória RAM mais tudo na troca, tentando desabilitar a troca fará com que seu sistema pare de responder. Meu script primeiro verifica se há RAM livre suficiente (o que é um pouco difícil, já que a quantidade real de RAM livre é diferente do que free relatórios como gratuitos), então apenas 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 $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

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.


21
2017-07-04 02:38



+1 para script. Você pode querer modernizá-lo um pouco alterando MB para MiB nas saídas. Escrevi um script semelhante sem todos os (bons) testes de segurança que você inclui. No meu antigo notebook, onde o swap era usado pesadamente, levaria algum tempo para ser executado - um minuto ou dois, mas não doía nada. De vez em quando, falharia porque não havia memória livre suficiente para ser executada, mas isso não causava problemas adicionais. Eu tive que reiniciar para esclarecer as coisas quando isso aconteceu. Tinha a ver com o que parecia ser um vazamento de memória na Transmissão (já que consertado, acredito) e com apenas 2GiB de ram. - Joe
Se algo foi movido para swap e ele permanece em swap, isso normalmente é uma coisa boa - significa que os dados não estão realmente sendo usados, e liberou parte de sua RAM para outras coisas, resultando em um potencial aumento de velocidade. O que o levou a acreditar que esses dados não deveriam estar em swap e deveriam estar ocupando mais RAM valiosa? Normalmente, o kernel é muito bom em saber o que não é usado e que pode permanecer em segurança para liberar memória RAM. - thomasrutter
@neon: Tenha em mente que minhas máquinas têm 2GB e 3GB de RAM, respectivamente, o que é muito pouco nos dias de hoje. A evidência está em desempenho. Por exemplo, abrir menus ou alternar programas pode ser lento devido à troca, assim como efeitos Visoal do Compos. Essa lentidão é curada ao alternar a troca, demonstrando assim que, pelo menos em algumas situações, os algoritmos de otimização do kernel estão abaixo do ideal. Eu não posso discutir com experiência repetida. - Scott Severance
Ufa !! Isso só diminuiu para 0% de swap .... Eu não tive muito tempo para olhar para esta pergunta completa e sua resposta, mas eu o favoritei para lê-lo quando eu conseguir algum tempo livre. - AzkerM
Por que você não apenas ajusta o swappiness para um valor baixo? Isso parece estar fazendo a mesma coisa que seu roteiro, mas de uma maneira muito mais controlada. - jhfrontz


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 muitos ram livre, você pode alternar a troca, executando o comando:
swapoff -av (você precisará sudo direitos para isso.)
Se você não gosta da troca, você pode ligá-lo, usando o comando simétrico:
swapon -av (novamente sudo requeridos).


4
2018-06-29 22:24



Desligar totalmente o swap é um exagero, já que o swapiness = 0 faz a mesma coisa, mas é mais seguro (se você Faz acabar com muita coisa na memória, ele vai jogar algo em troca). - Brendan Long
@BrendanLong Ponto justo .. Obrigado por me ensinar. :) - drake01


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 são usados. Uma vez que a memória é trocada, é improvável que ela seja trocada.

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 troca (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 swap, e irá trocar 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.


3
2018-06-30 04:02





Eu editei o roteiro de Scott Severance para coincidir com as versões mais recentes do livre que já incluem um campo de memória total disponível.

#!/bin/bash

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

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

2
2017-10-03 13:37