O que especificamente o Linux pode fazer quando tem swap que não pode sem swap?
Para esta pergunta, quero focar na diferença entre, por exemplo, um PC Linux com 32 GB de RAM e sem swap versus um PC Linux quase idêntico com 16 GB de RAM com 16 GB de swap. Observe que não estou interessado no "sim, mas você pode ver uma melhoria no X se adicionar swap ao PC de 32 GB" . Isso é off-topic para esta pergunta.
Eu encontrei pela primeira vez a opinião de que adicionar swap pode ser melhor do que adicionar RAM em comentários para um problema anterior .
É claro que li isso: Preciso de espaço de troca se tiver uma quantidade de RAM mais do que suficiente? e...
- As respostas são principalmente focadas na adição de swap, por exemplo, discutindo o cache de disco, onde a adição de RAM também estenderia o cache de disco.
- Há alguma menção de que a desfragmentação só é possível com troca, mas não consigo encontrar evidências para fazer backup disso.
- Eu vejo alguma referência a MAP_NORESERVE para
mmap
, mas isso parece um risco muito específico e obscuro associado apenas a situações OOM e possivelmente apenas mmap privado .
A troca é frequentemente vista como uma maneira barata de estender a memória ou melhorar o desempenho. Mas quando a produção em massa de dispositivos Linux embutidos, isso é virado de cabeça para baixo ...
... Nesse caso, a troca irá desgastar a memória flash, fazendo com que ela falhe anos antes do final da garantia. Onde dobrar a RAM é um par de dólares extras no dispositivo.
Observe que é flash eMMC NÃO é um SSD! . Normalmente, o flash eMMC não possui tecnologia de nivelamento de desgaste, o que significa que ele se desgasta MUITO mais rápido que os SSDs
Parece haver muita opinião contestada sobre este assunto . Estou realmente procurando por fatos secos sobre capacidades, não por opiniões do tipo "você deveria / não deveria".
O que pode ser feito com o swap que também não seria feito adicionando RAM?
Hibernação (ou suspensão no disco). A hibernação real desliga o sistema completamente, então o conteúdo da RAM é perdido e você precisa salvar o estado em algum armazenamento persistente. AKA Troca. Ao contrário do Windows com
hiberfil.sys
epagefile.sys
, o Linux usa espaço de troca para memória supercomprometida e hibernação.Por outro lado, a hibernação parece um pouco complicada para funcionar bem no Linux. Se você "pode" realmente hibernar é uma coisa diferente. ¯\_(ツ)_/¯
Perguntado assim, o swap geralmente economiza dinheiro, aumentando a relação de desempenho por dólar, talvez também por watt.
Mas a troca ainda é mais do que "memória tão lenta quanto um disco". É um armazenamento temporário para páginas de memória, que podem ser carregadas diretamente (sujas como são, sem sobrecarga do sistema de arquivos) na RAM quando necessário.
Claro que depende muito da carga (o tipo de carga), e a ideia de trocar pode até sair pela culatra. É por isso que existe o parâmetro "swappiness", além do próprio
swapon
/swapoff
, e a discussão sobre o tamanho certo.Da wikipedia, recebi esta declaração sobre "swap" no linux (no artigo "paging")
Isso mostra que você pode transformar a troca em algo que faz mais sentido no nível do hardware: uma "unidade de rascunho" dedicada daria a essas páginas trocadas um lar melhor. Idealmente, uma unidade scratch deve ser (muito) pequena, mas rápida e robusta.
De acordo com a "nova" regra de tamanho ( raiz quadrada de Giga), seu exemplo deve comparar:
16 GB RAM
+0 GB Swap+1000 GB Disk
16 GB RAM
+4 GB Swap+ 996 GB Disk
Porque o que realmente não faz sentido é:
16 GB RAM+0 GB Swap
+1000 GB Disk
12 GB RAM+4 GB Swap
+1000 GB Disk
Isso seria uma partição swap em um tmpfs ("ramdisk") - talvez nem muito prejudicial, mas não vejo nenhum benefício aqui. Você não pode nem hibernar.
(veja abaixo para zram e zswap, no entanto, quando você adiciona compactação a isso)
Para entender o swap, você deve considerar todo o sistema e a carga média. E porque vm/mm (gerenciamento de memória virtual) é um sistema complexo, é realmente difícil citar uma vantagem clara. Eu gosto da ideia de uma transição "suave" para um sistema sobrecarregado.
Eu tenho 8 GB de RAM e não há swap. Mas ainda assim defendo o conceito, AFA eu posso entender :-)
Encontrei esta citação redhat em um dos links do OP. O cenário é uma demanda de memória cada vez maior, em 2 GB RAM + 2 GB Swap, se bem me lembro:
Mas a alternativa é
OOM
ainda mais cedo!O "tempo de baixo desempenho" é longo, sim, mas o desempenho só degrada proporcionalmente à carga. Eu não conheço o contexto, talvez eles só queiram alertar contra uma partição swap muito grande . Parece anti-swap, mas na segunda olhada não é .
Então, novamente, pelo mesmo motivo, não tenho troca. Quero saber quando eu e meus aplicativos atingirmos o teto, e então decidirei se devo diminuir a carga, comprar mais RAM ou ativar uma partição para swap (tenho uma ou duas partições pequenas prontas para isso).
Eu procurei este zram e então zswap coisa: muito interessante...:
Por outro lado,
zram
funciona sem nenhum dispositivo de troca. Torna possível que o que eu disse não faça sentido, mas não levei em consideração a compactação.Meu ponto é esse mecanismo de despejo inerente ao “swap”. Isso pode ser muito útil sob alta carga, seja trocando ou compactando.
Esta questão poderia realmente ser reformulada em O que pode ser feito com RAM não volátil que também não seria feito adicionando RAM mais volátil? . Só porque você dedica uma partição para paginação (uma maneira dedicada de interagir com a RAM volátil), isso não muda o fato de que ainda faz parte de um meio de armazenamento secundário persistente. A partição de troca também não é obrigatória para colocar um sistema em hibernação, um "arquivo de troca" criado em uma partição preexistente também pode ser usado.
No final, se você estiver usando uma partição de troca ou um arquivo de troca, o que você armazenará são coisas para serem gravadas na memória RAM. Se você puxar o cabo de alimentação de um sistema com uma partição de troca habilitada, essa partição de troca não será apagada magicamente.
Embora esses dados de troca não sejam lidos na próxima inicialização (porque o arquivo de paginação teria entradas correspondentes a processos que não estão mais em execução), e algumas distribuições podem tomar medidas deliberadas para destruí-lo durante um desligamento adequado ou uma reinicialização adequada , se alguém puxar um fio de um sistema, ele poderá examinar essa partição de troca forense.
No caso dos dispositivos embarcados que você mencionou, o Flash, sendo um tipo de armazenamento em RAM não volátil (NVRAM ou EEPROM), se desgasta por sua capacidade de receber hits de I/O (Flash Cell Endurance representado em termos de número de programas /erase cycles) empalidece em comparação com a RAM volátil. Você literalmente raspa uma camada de óxido toda vez que executa uma gravação nesse local e, eventualmente, simplesmente não resta óxido para permitir o armazenamento persistente da carga e ela literalmente vaza antes de sua leitura subsequente.
Por outro lado, a capacidade de sobrevivência da RAM do volátil é praticamente inexistente (da ordem de minutos em condições experimentais ideais) em comparação com o flash, se ou quando você cortar sua fonte de alimentação. No caso de RAM volátil, não há nada que impeça o vazamento da carga e o estado correspondente do flip-flop (entradas, determinando saídas, que então redeterminam as entradas), também conhecidas como travas controladas por feedback.
Para um determinado total , é sempre melhor tê-lo como RAM do que trocar.
Existe uma diferença de comportamento entre um sistema noswap e um sistema de troca, que pode ou não ser útil: thrashing. À medida que o sistema de troca começa a ficar sem memória virtual total disponível, ele fica cada vez mais bloqueado na movimentação de páginas para frente e para trás entre troca e RAM. Isso desacelera o sistema. Em algumas circunstâncias, isso pode permitir a intervenção manual ou automatizada para reduzir a carga e recuperar o sistema.
Em um sistema noswap, o desempenho permanece relativamente nivelado até o uso de memória muito alto, ponto em que o SO começa a descarregar páginas readonly de executáveis mapeados em memória e também tem muito pouco espaço para cache de disco. É provável que o assassino OOM seja acionado neste momento. Portanto, uma falha repentina em vez de uma degradação lenta.
Concordo que a troca faz pouco sentido para sistemas embarcados, especialmente em pequenos dispositivos Flash embutidos. O mundo está cheio de pequenos roteadores para consumidores Linux, lâmpadas etc. com uso de memória bastante fixo e sem troca.
A troca, ao contrário da RAM, pode ser facilmente desabilitada, restrita, desacelerada ou estendida - um recurso útil ao desenvolver a estratégia de alocação de memória de um aplicativo.
Suponha que seu kernel veja 4G de RAM e 4G de swap, e o SO e os aplicativos de desenvolvimento (navegador, IDE, etc.) consomem 3G. Isso é 5G virtual grátis: 1G de real e 4G de swap.
Você está desenvolvendo seu novo banco de dados ou jogo, que quer, digamos, 2G para carregar seus recursos quentes. Então, está indo,
sbrk
emmap
repetidamente, e com swap ativado, obtém seu 2G real pela maravilha da camada de VM do kernel. Hooray, seu código funciona bem. (E seu navegador ou o que quer que tenha sido relegado à página para trocar o inferno.)Agora, pare seu programa.
swapoff
e execute novamente seu programa. Desta vez, enquanto ele faz seusbrk
discurso retórico, ele recebe umENOMEM
e seu código tem que lidar com um caminho infeliz. Como reage? Como dança nesse cenário?Ou monte um pendrive,
mkswap
eswapon
no suporte USB, e aumentevm.min_free_kbytes
para forçar o kernel a ir ainda mais para esse pendrive. Execute novamente seu programa. Como seu aplicativo está se comportando agora com a VM de mallocação lenta?Que tal fazer todos os itens acima enquanto seu aplicativo está em execução? Como ele se comporta quando está em execução e começa a experimentar condições OOM?
Não há fim para as maneiras de torturar um sistema com pouca RAM real livre, ajustando seu subsistema de troca ao vivo. E ao contrário de cgroups ou rusage, você não precisa encerrar seu processo para alterar a RAM virtual disponível para ele.
Você pode testar esses tipos de abusos de memória, usando mocks para simular
ENOMEM
ou desacelerarbrk
, e isso é apropriado porque é estável. Mas nada supera o exercício ao vivo em ambientes com pouca memória para minerar o ouro de processos estocásticos. Swap permite que um testador ajuste os recursos e características de memória do kernel em tempo real, facilmente, de uma maneira que seja adequadamente semelhante ao mundo real de pouca memória. Adicionar ou remover pentes de RAM não fornece esse valor.Este é um caso um pouco de nicho, e é certo que você pode adicionar mais memória RAM, mas ...
Todo mundo parece estar assumindo que swap significa um armazenamento físico não volátil, como um disco rígido ou unidade flash. A troca é mais um processo do que um local físico.
Considere as seguintes travessuras estranhas:
Um uso para swap (que está na RAM), que é mais do que apenas o que você obtém da RAM simples (sem uma partição swap).
Embora, sim, você poderia tecnicamente apenas adicionar mais memória RAM; esse tipo de estranheza significaria que não importa quanta memória RAM você adicionasse, você sempre poderia disputar um pouco mais de espaço (desde que você conheça seus dados / o que for adequado).
A hibernação requer um arquivo de troca, mesmo que a troca não seja usada de outra forma.
Fora isso, nada. Swap é um bom paliativo se
A RAM é muito cara ou limitada em comparação com o espaço em disco
O sistema é um sistema de uso geral sob o controle de 1 usuário que pode experimentar software e/ou cargas de trabalho imprevisíveis de tempos em tempos.
Se os cenários OOM forem possíveis e a paginação no disco for preferível ao travamento total dos programas.
Duas coisas:
A. Esteja lá quando a RAM estiver cheia.
B. Mantenha as páginas de memória que não estão sendo usadas pelos processos em um determinado momento (porque estão bloqueadas em alguma condição) para permitir que a RAM seja usada para outra coisa.
Se você tiver RAM suficiente para satisfazer qualquer solicitação de memória de todos os processos que serão executados simultaneamente, ou não se importar com erros OOM, A pode ser ignorado.
O Linux usa RAM livre para armazenar em cache leituras e gravações de dispositivos de bloco, mas não precisa. A RAM é mais rápida que os dispositivos de bloco. Permitir que o Linux faça a paginação de coisas que os processos não estão usando para trocar permitirá que mais RAM seja usada para armazenar em cache as leituras do dispositivo de bloco. Se você não se importa com a velocidade do seu acesso ao dispositivo de bloco, que pode ser aplicado em ambientes incorporados como roteadores, etc., B pode ser ignorado (e nessas situações você não se importa com a hibernação).
Swap não é um cache de disco - é possível que as páginas que estão em swap não sejam associadas a um arquivo de disco ou nunca tenham a intenção de serem gravadas em disco.
Você já tem a resposta, mas sua pergunta mostra que você ainda não aprecia essa resposta.
A resposta simples é: "Seja grande e barato (e talvez flexível)". Você já sabe disso, mas também descarta. Você não deveria.
RAM não é "um par de dólares extras". Gigabyte por gigabyte, por exemplo, RAM ECC no meu servidor custa £ 130 por 32 GB (RDIMM 2400 DDR4), ou cerca de £ 4/GB. O SDD que estou usando para troca custa cerca de £ 100-130 por TERABYTE, ou cerca de £ 0,11/GB (Micron/Intel com proteção contra perda de energia). Os farms de servidores podem ocupar de centenas a milhares (em muitos casos) de GB por servidor, com centenas de servidores.
A RAM também consome mais energia - um processo ocioso na RAM requer alimentação e atualização da RAM enquanto no SSD o uso de energia é muito menor. Em pequenos dispositivos incorporados, isso pode ser um problema por si só.
O nivelamento de desgaste também é um problema menor do que você pensa na maioria dos dispositivos. Os SSDs duram mais do que as pessoas pensam, e os dispositivos projetados comercialmente escolherão um SSD para corresponder ao uso esperado, não os extremamente pobres em algumas placas.
Por último, o Swap é mais flexível. Se sua tarefa normalmente usa 32 GB, mas brevemente e raramente algum aspecto dela precisa de 64 GB, com RAM você deve fornecer 64 independentemente. Com swap funciona no 32 e usa brevemente, depois descarta, troca, para os tempos excepcionais.
Tl;Dr - você está perdendo completamente o ponto econômico.
A troca pode economizar seu dinheiro. A RAM é mais cara do que a quantidade correspondente de disco. O objetivo é otimizar a relação custo-benefício. Claro, RAM é sempre melhor do que swap, mas vai custar mais caro e vai para o lixo se você não usar tudo.
A utilidade do swap também depende muito do tipo de carga de trabalho. Por exemplo, se você tiver muitos aplicativos abertos, mas usar ativamente apenas um deles, a RAM usada pelos programas inativos poderá ser liberada e usada pelo processo ativo. Por outro lado, usar um único programa com uso intensivo de memória que precisa de mais memória do que a quantidade disponível de RAM é um uso não ideal da troca.
Acho que você vai descobrir que isso é falso. Em primeiro lugar, alguns dólares extras não dobrarão nenhuma quantidade razoável de RAM. Em segundo lugar, o flash é mais barato que a RAM. Em terceiro lugar, a troca é usada para dados inativos. Se você tiver uma situação em que a partição de troca é continuamente gravada, você tem muito pouca RAM e, sem troca, algum processo importante teria travado.
Além disso, as gravações aleatórias em um SSD completo (o que faz com que falhem cedo) são lentas. Eles são muito, muito lentos mesmo. Seu SSD não morrerá prematuramente se o seu computador não ficar lento pela troca.
É muito melhor que seu computador fique muito lento quando estiver ficando sem memória do que algum processo importante travar.
Agora, o que você pode fazer com a troca que você não pode fazer com a RAM?