A troca é um anacronismo?


43

Eu uso o unix há um bom tempo e, nos últimos dois anos, senti que a troca é um anacronismo, mas ficaria curioso para saber o que as outras pessoas pensam.

Meu argumento é mais ou menos isso (supondo que não haja ulimit global ou ajustes nas configurações do OOM):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

Para qualquer serviço ajustado para desempenho, eu acho que entender os limites superiores do uso de recursos seria a chave para ajustá-lo em primeiro lugar; nesse caso, você sabe o quanto precisa.

Não consigo imaginar muitas situações (algumas, mas não muitas) em que você suspenderia um processo em execução e ele poderia ser trocado para dar lugar a outras coisas, mas você ainda perderia seus soquetes se fizesse isso, forçando uma core-dump via gcc ou copiar a memória manualmente seria funcionalmente equivalente.

Definitivamente, eu não gostaria de trocar em um sistema incorporado (mesmo que ele possua uma ram menor disponível), se você ficar sem RAM, prefiro que meu processo morra do que rasgar uma memória flash de um milhão de gravações por setor dirigir durante um fim de semana, nivelando os setores até o ponto mais baixo.

Alguma barba unix por aí tem razões convincentes para continuar trocando?

UPDATE respostas e análise:

  • CONFIRMADO? - fork () requer a mesma quantidade de memória para o processo filho que o pai

    O fork moderno () é copy-on-write para crianças no POSIX (em geral), mas especificamente no Linux e no FreeBSD , e estou assumindo o OSX por extrapolação. Considero essa parte da bagagem anacrônica que a troca leva consigo.

    Curiosamente, este artigo do Solaris afirma que, embora o Solaris use o Copy-on-Write com fork (), você deve ter pelo menos 2x (!) O tamanho do processo pai na memória virtual livre para que o fork () não seja um meio. Enquanto o elemento Solaris detém um pouco o argumento de que a troca é um anacronismo - acho que sistemas operacionais suficientes implementam corretamente o CoW de tal maneira que é mais importante dissipar o mito do que marcá-lo como justificativa adicional para a troca. Desde a. Vamos encarar. Nesse ponto, as pessoas que realmente usam o Solaris provavelmente são apenas funcionários da Oracle. Sem ofensa Solaris!

  • CONFIRMADO - os arquivos tmpfs / ramfs podem ser trocados como uma conveniência quando o tmpfs / ramfs é preenchido

    Não use no-limit tmpfs / ramfs! Sempre defina explicitamente a quantidade de ram que você deseja que o tmpfs / ramfs use.

  • PROVÁVEL - Faça uma pequena troca 'por precaução'

    Um dos meus antigos chefes costumava ter um ótimo ditado, 'você não sabe o que não sabe' - essencialmente, você não pode tomar uma decisão com base em informações que ainda não possui. Este é um argumento plausível para troca para mim, no entanto - suspeito que os tipos de coisas que você faria para detectar se seu aplicativo está sendo trocado ou não seriam mais pesados ​​do que verificar se o malloc () é bem-sucedido ou captura a exceção de um novo com falha ().

    Isso pode ser útil nos casos em que você está executando uma área de trabalho e tem várias coisas aleatórias acontecendo, mas mesmo assim - se algo der errado, prefiro que o OOM seja colhido do que mergulhar no inferno das trocas. Sou apenas eu.

  • BUSTED! - No Solaris , a troca é importante por alguns motivos

    tmpfs - states A quantidade de espaço livre disponível para tmpfs depende da quantidade de espaço de troca não alocado no sistema. O tamanho de um sistema de arquivos tmpfs aumenta para acomodar os arquivos gravados nele, mas existem algumas vantagens inerentes aos usuários pesados ​​de tmpfs. O Tmpfs compartilha recursos com os segmentos de dados e pilha dos programas em execução. A execução de programas muito grandes pode ser afetada se os sistemas de arquivos tmpfs estiverem próximos do tamanho máximo permitido. O Tmpfs é livre para alocar todos os 4 MB de espaço de troca do sistema, com exceção de 4 MB.

    Fatos e mitos do Solaris sobre estados de swap Atualmente, a memória virtual consiste na soma total de RAM física e espaço de swap no disco. O Solaris NÃO exige que nenhum espaço de troca seja configurado. Se você escolher esta opção, quando a RAM estiver cheia, você não poderá iniciar novos processos. .

    Não tenho certeza se isso significa que o mapa virtual máximo que você pode criar é ram + swap , ou se você ainda pode fazer algo como mmap (), um arquivo maior que ram, e confiar na preguiçosa inicialização do mmap (). provavelmente pode executar o Solaris hoje em dia sem troca, parece menos amigável do que outros sistemas operacionais POSIXy.

  • BUSTED! As populares ferramentas de hibernação do Linux parecem confiar na troca

    Por padrão, o TuxOnIce parece confiar na troca de hibernação - embora existam outros back-end. No entanto, se você não está executando uma caixa que precisa hibernar, eu ainda estaria por trás da declaração de que 'swap é anacronístico no linux'


Eu não tenho muita barba un * x (alguns cabelos ainda;), mas meus 2 centavos seriam que ter um "pouco" de troca daria ao seu sistema alguma robustez. Como em vez de diretamente OOM, você trocaria, se um pouco acima dos limites do sistema. Claro, se realmente ultrapassar os limites do seu sistema, ele acabará por travar / parar / explodir a si próprio / qualquer coisa que você possa imaginar. Então, dando um pouco de corda para brincar;)
Ouki 27/02

1
O fato de fork () é verdade se você configurar seu sistema para nunca comprometer demais a RAM (esse não é o padrão). Agora, por que você precisaria mais dessa configuração, não tenho idéia. Não é útil para processamento em tempo real.
27712 Joshua

@Jushua: O comprometimento excessivo da memória pode não ser o padrão ou até possível, dependendo do sistema operacional.
Jlliagre

Eu tenho um servidor NAS com 8 GB de RAM, ele executará até 2 VMs. Eu não coloquei swap. Se começar a trocar bastante, já estará morto. Portanto, ele suporta perfeitamente seu argumento. Por outro lado, ainda estou usando minha área de trabalho enferrujada com um limite de 1 GB de RAM e lá tenho troca para lidar com a memória esparsa. Isso torna as coisas um pouco mais lentas, mas me ajuda a abrir o Firefox e outros aplicativos ao mesmo tempo.
Huygens

Acho que o assassino do OOM é acionado tarde demais, somente depois que todos os caches foram esvaziados e o sistema ficou lento. Para manter meu sistema ágil , uso earlyoom ou nohang para fazer o mesmo trabalho, mas antes! Pode ser usado com ou sem swap.
joeytwiddle 4/11

Respostas:


28

Não confunda swap (como uma área de disco) e swap (como) para mover páginas de memória da RAM para o disco e reciprocamente).

A troca excessiva é algo a ser evitado por razões de desempenho, mas ter uma área de troca não é necessariamente um problema.

Em sistemas, como o Linux, que supercomprometem memória, ou seja, permitem que os processos alocem mais memória do que a disponível, ficar sem RAM com troca insuficiente para lidar com a situação acionará o OOM killer. Você precisa confiar no algoritmo usado para selecionar o processo "correto" para matar e aceitar que um ou mais de seus processos sejam mortos sem ter a chance de desligar corretamente. Aqui está uma analogia famosa que explica por que o assassino da OOM pode não ser uma boa idéia.

Em sistemas como o Solaris, que não comprometem demais a memória, ou seja, garantem que uma reserva de memória seja sempre apoiada pela memória virtual, seja na RAM ou no disco, é absolutamente necessário ter uma área de troca suficiente, caso contrário uma parte potencialmente significativa da RAM será desperdiçado.


1
Você tem certeza de que o argumento sobre Solaris ainda é verdadeiro? estados do blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts : Atualmente, a memória virtual consiste na soma total de RAM física e espaço de troca no disco. O Solaris NÃO exige que nenhum espaço de troca seja configurado. Se você escolher esta opção, quando a RAM estiver cheia, você não poderá iniciar novos processos. Acho que entendo qual é o seu ponto - se você quisesse mapear algo maior que o físico, sem a troca, não conseguiria? (Independentemente do mmap ser um inicializador lento).
Sintetizadorpatel

5
Sim, tenho certeza que meu argumento sobre o Solaris ainda é verdadeiro. Mesmo quando a cotação de Jim Laurent for verdadeira, ou seja, o Solaris não exige troca, não ter swap significa que toda reserva de memória (ou seja, malloc) precisa ser apoiada pela RAM, mesmo que parte da memória alocada não seja usada. Isso não está relacionado ao mmap grande ou ao tmpfs, embora o tmpfs também seja um motivo pelo qual você queira trocar com o Solaris (e o Linux também).
Jlliagre

1
Atualização para Linux: o excesso de confirmação pode ser desativado, o algoritmo OOM pode ser modificado, você pode até ter seu próprio manipulador de OOM com cgroups.
Peterph 28/05

1
@peterph Desativar o supercomprometimento no Linux torna a troca ainda menos um anacronismo. Se você não se comprometer demais, precisará garantir uma área de troca grande o suficiente para que todas as reservas sejam apoiadas.
Jlliagre

1
A memória virtual reservada por um fork depende do tamanho do programa que está fazendo isso. Digamos que você tenha uma VM Java usando 2 GB de bifurcação de memória, ela exigirá temporariamente mais 2 GB. Se isso acontecer enquanto você tiver menos de 2 GB disponíveis ou simultaneamente várias vezes, uma ou mais bifurcações falharão. Essa é uma situação comum com sistemas operacionais que não confirmam demais e também com o Linux ao confirmar demais desabilitado. Ele pode ser facilmente corrigido com uma área de troca grande o suficiente, o que IMHO é uma solução muito melhor do que o comprometimento excessivo da memória.
Jlliagre 29/05

3

Eu sei de uma razão para continuar trocando. Eu tenho um aplicativo que consome tanta memória quanto posso configurar para o meu sistema. Ele usa o Hadoop, que em uma parte do processamento executa um fork e exec para executar um único comando unix (acho que "uname" ou "user" ou algo para o qual eles não conseguiram encontrar um equivalente em Java). Parece que o java não faz um vfork com cópia na semântica de gravação, como faria um aplicativo nativo. Se eu iniciar o meu aplicativo usando 4Gb de RAM, quando for bifurcado, o fork usará outro 4Gb de RAM, mas o liberará rapidamente. Se eu não tivesse 4Gb de troca para o Hadoop, teria que pagar por 8Gb de RAM apenas para ter 4Gb no meu aplicativo.


Este é um ótimo ponto, mas não um reflexo do fork moderno () - no Linux e no FreeBSD (e, ostensivamente OSX?) O fork () é implementado através do uso de páginas de cópia na gravação. A cópia na gravação (ou COW) é uma técnica para atrasar ou impedir completamente a cópia dos dados. Em vez de duplicar o espaço de endereço do processo, o pai e o filho podem compartilhar uma única cópia. Os dados, no entanto, são marcados de tal maneira que, se forem gravados, é feita uma duplicata e cada processo recebe uma cópia exclusiva. Citações: forums.freebsd.org/showthread.php?t=26355 e página de manual do Linux para fork ()
synthesizerpatel

Embora verdade, existem algumas páginas que não podem ser marcadas como VACA. Por exemplo, as páginas usadas para a pilha do kernel do novo processo filho e as páginas usadas para estruturas de dados internas (o files_struct, o struct signals, o task_structe outros). Além disso, muitas páginas executáveis ​​não são código dependente de posição (PIC) e, portanto, páginas de código executável que foram modificadas pelo loader dinâmico ( ld-linux.so) devem ter espaço de troca reservado para elas, mesmo que nada seja escrito para trocar espaço imediatamente. É por isso que eu amo Linux; você pode desativar a troca e o sistema ainda funciona. :)
Azhrei

3

Não posso adicionar tecnicamente à discussão, mas posso dar alguns exemplos. Meu notebook antigo (2 GB de RAM kunbuntu lucid) geralmente roda com swap em 0. Quando executo transmissão (cliente bittorrent) com vários torrents que podem coletivamente usar 100 conexões, meu swap pode aumentar bastante. Fica ainda pior quando tenho um XP vm em execução que usa 1 GB de memória real.

Vi outros comentarem que processos intensivos em memória, como a renderização de gráficos, também podem ser trocados. Se você fizer isso apenas ocasionalmente, não será um problema.

Quanto aos problemas de OOM, o swap pode realmente ser um salva-vidas, porque você ganha tempo entre identificar o problema e as coisas que estão indo para o sul. Muitas coisas usam quase toda a minha memória, então não presto atenção a isso, mas quando o swap começa a ocorrer, percebo isso e começo a procurar o problema - antes que ele me morda.


Bem, sim, os sistemas legados não podem fazer muito sem a troca ativada. Eu ainda tenho um subportátil antigo com 256 MB de RAM, em que é necessário trocar o swap para iniciar praticamente qualquer programa. Acredito que a pergunta tenha como alvo os sistemas modernos.
Dmitry Grigoryev

3

Há um aplicativo muito bom para o espaço de troca: extensão de RAM, colocando o espaço de troca no dispositivo de armazenamento que usa RAM, para superar as limitações da RAM do sistema instalável

Dê uma olhada neste gadgest http://techreport.com/articles.x/16255 É basicamente uma interface de S-ATA para DDR2-RAM. Você pode armazenar até 64 GB de RAM neles. Ao colocar o espaço de troca em um deles, você obtém uma RAM adicional significativa. Claro que não é tão rápido quanto a RAM normal do sistema. Mas isso meio que transforma a RAM do sistema em uma espécie de camada de cache adicional.


1
Considerando seu preço (US $ 549), não seria mais eficiente investir US $ 100 em uma placa mãe com suporte a 64 GB de RAM ?
Dmitry Grigoryev

1
@DmitryGrigoryev: Claro. Mas às vezes você é forçado a usar esse tipo particular de hardware (porque, por motivos tosse sistema médico certificação tosse ), mas também tem que lidar com ridiculamente grandes conjuntos de dados produzidos em muito pouco tempo (acho que tomógrafos, datarates> 3GiB / s).
datenwolf

Você também não precisaria certificar a unidade de RAM como dispositivo médico? ;) Mas sim, entendi.
Dmitry Grigoryev

1
@DmitryGrigoryev: Na verdade, você precisa fazer isso. No entanto, certificar um dispositivo de disco RAM S-ATA é muito, muito mais fácil do que certificar uma placa-mãe inteira. Ao comprar computadores usados ​​em equipamentos médicos, você geralmente compra o máximo possível de componentes certificados e prontos para uso. Para aquelas partes em que não existe nada com uma certificação prontamente disponível, você faz os testes e a certificação necessários. Especialmente quando se trabalha em pesquisa, onde a ênfase está na segurança do paciente e os dados não são usados ​​para o planejamento do tratamento, essa é a solução mais econômica e rápida. BT; DT.
datenwolf

3

Estou executando o Linux e o Windows sem swap (arquivo de paginação, na nomenclatura do Windows), em notebooks / desktops com 4Gb ou mais. Existem algumas ocasiões em que a exaustão da memória acontece, eu apenas lido com elas. Eu sinto que o sistema é mais rápido dessa maneira, com o qual me preocupo mais. Porém, não há requisitos especiais para minha carga de trabalho.

Coisas que aprendi:

  • O Windows "perde" a memória com o tempo. Em cerca de 20 a 30 dias de atividade, chego a um ponto em que prefiro apenas reiniciar. Não sei por que isso acontece. Eu estou supondo que pode ser um vazamento em algum driver ou o antivírus. Quando você tem um arquivo de paginação, acredito que ele pode colocar essa memória vazada no arquivo de paginação; portanto, seria mais difícil perceber esse problema em um sistema Windows normal.
  • O Firefox lida muito melhor com pouca memória que o Chrome. O Firefox avisa e, mesmo assim, é executado, o Chrome apenas trava.

2

Eu acho que seus argumentos são bastante válidos para um servidor , onde o desempenho é importante, e saber qual aplicativo irá agir a seguir pode não ser previsível.

No entanto, para uma área de trabalho , acho a troca útil quando estou empurrando e popping tarefas.

Por exemplo, se estou trabalhando em uma tarefa usando o aplicativo Ae, em seguida, descubro que preciso usá-lo Bpara alguma coisa (subtarefa ou interrupção), é mentalmente mais fácil permitir a Atroca para o disco enquanto trabalho em Bque para fechar Ae, em seguida, lembre-se de iniciá-lo novamente depois.

Isso é especialmente verdadeiro se Aestiver mantendo algum estado não salvo que não seria restaurado quando for reiniciado.

Se é mais rápido empurrar e puxar Apara / da troca ou fechar e reiniciar, depende do aplicativo. (Alguns conseguem ter uma inicialização lenta, mas um pequeno tamanho residencial.)

No entanto, eu concordaria que uma solução melhor para aumentar a produtividade seria instalar alguma RAM adicional.


Atualização: Depois de escrever esta resposta, eu possuía um laptop com muita RAM e um disco rígido lento. Nesse caso, meu conselho inverteu! Aqui está um resumo dos prós e contras .
joeytwiddle 4/11

1

No meu sistema, / tmp derrama para trocar se consome muita RAM.

Isso é muito mais rápido do que usar um sistema de arquivos real para / tmp.


Isso é muito perigoso - se eu precisar de ramfs, especifique no fstab (ou opções) para definir o tamanho explicitamente. É tão provável que um programa possa ficar louco com a alocação de memória quanto começar a criar arquivos em / tmp. Swap seria um mau lugar para arquivos ramfs a mostrar-se (especialmente se você está confiando em ramfs para a velocidade)
synthesizerpatel

2
Excesso o tamanho da RAM lá com frequência. Os tmpfs suportados pelo swap são significativamente mais rápidos que o ext2, mesmo quando se derramar.
27712 Joshua

Útil saber - e provavelmente será um item de pesquisa futura - eu ainda estaria preocupado com um aplicativo que preenche meu RAM por proxy de tmpfs / ramfs em / tmp. Isso me dá os heebie jeebies!
Synthesizerpatel

Em seguida, defina o limite = tamanho da troca.
27712 Joshua

Aliás, essa é a diferença entre ramfs e tmpfs. Os tmpfs podem ser trocados, enquanto os ramfs não.
197 Joshua Joshua

1

Existem várias razões, quando o swap é usado.

Normalmente, quando o sistema não tem memória física suficiente, o kernel pode colocar alguns aplicativos (de fato - algumas partes da memória que são usadas por não executar aplicativos) para trocar.

Posteriormente, quando esses aplicativos fizerem alguma coisa (por exemplo, alguns dados chegarem a um soquete ou algum timer disparar) - o kernel colocará outro aplicativo para trocar.

Outro exemplo de uso de troca é suspender no disco.

Em relação aos dispositivos incorporados, todos eles podem ser divididos em (pelo menos) dois grandes grupos:

  1. eles executam Linux / Windows ou similar não RTOS (Real Time OS); ou
  2. eles executam um RTOS.

É claro que existem dispositivos executando apenas algum código (algum tipo de microcontrolador) etc. Eu não os descreveria porque esses dispositivos não possuem sistema operacional, portanto, discutir troca não faz sentido para esses dispositivos.

O primeiro grupo de dispositivos incorporados (executando algum sistema operacional) pode usar (e geralmente eles usam) a troca. E, em geral, esses dispositivos usam a troca da mesma maneira que os desktops e servidores.

O segundo grupo de dispositivos (executando o RTOS) não usa troca, porque o RTOS tem limitação de tempo para responder no evento e

  • a leitura do swap pode levar um tempo imprevisível
  • dispositivos têm um número predefinido (em tempo de compilação) de tarefas, não é necessário trocar

BTW, há muitas descrições de como o linux usa a troca, uma delas é http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Windows use uma abordagem semelhante.


Além disso, a troca é necessária para a hibernação (suspensão no disco), a menos que você esteja usando algo como o TuxOnIce.
Renan

1

Parece-me que a hibernação e o sono híbrido precisam trocar espaço no Linux .

Eu nunca usei o espaço / partição de swap no Linux até me deparar com a necessidade de usar o Hybrid Sleep - pois o sono no nível crítico da bateria não estava disponível no meu sistema, pois foi tratado pela Upower, que apenas escolhe entre Shut-Down, Hibernate e Hybrid -dormir. (mais aqui )


0

Alguns bons usos que eu já vi são processos que usam muita memória, mas não são críticos para o desempenho. Um caso foi um Firefox antigo que tinha um vazamento de memória ruim. Ele iria encher a RAM e transbordar para trocar sem nenhum efeito prejudicial. Outro que tivemos foi nosso servidor DNS recursivo (aqueles que constroem rapidamente um cache enorme que raramente é usado).

A outra explicação que eu vi sobre o swap correu um pouco ao longo das linhas: "Você é instruído a configurar sempre SWAP = 2 * RAM. Isso é um absurdo completo, não há relação entre RAM e swap. Swap é acomodar picos no uso da memória , você deve adicionar memória suficiente para que na maioria das vezes sua carga caiba na RAM. Se sua carga é estável, você não precisa de troca. Se sua carga é altamente variável, você precisa de troca suficiente para os picos e organize-a para que O swap é usado raramente o suficiente para não afetar significativamente o desempenho geral. Resumindo, como você não tem idéia de quais são os picos de carga e como o disco é muito mais barato que a RAM, configure SWAP = 2 * RAM ".

Algumas versões antigas do Solaris não podiam usar swap, a menos que houvesse pelo menos tanta quantidade quanto a RAM (eu lembro que ele alocava espaço de troca fixo para sair da RAM ou algo parecido), então 2 * RAM era realmente o mínimo sensato valor. Mas isso foi eras atrás, quando nossa grande máquina tinha 64 MiB de RAM e um disco de 1 GiB ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.