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'
Respostas:
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.
fonte
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.
fonte
files_struct
, ostruct signals
, otask_struct
e 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. :)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.
fonte
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.
fonte
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:
fonte
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
A
e, em seguida, descubro que preciso usá-loB
para alguma coisa (subtarefa ou interrupção), é mentalmente mais fácil permitir aA
troca para o disco enquanto trabalho emB
que para fecharA
e, em seguida, lembre-se de iniciá-lo novamente depois.Isso é especialmente verdadeiro se
A
estiver mantendo algum estado não salvo que não seria restaurado quando for reiniciado.Se é mais rápido empurrar e puxar
A
para / 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.
fonte
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.
fonte
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:
É 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
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.
fonte
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 )
fonte
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 ...
fonte