Preciso trocar espaço se tiver mais do que suficiente quantidade de RAM?

91

Pelo que entendi, o objetivo de uma partição swap no Linux é liberar algumas informações "não tão freqüentemente acessadas" da RAM e movê-las para uma partição específica no seu disco rígido (com o custo de tornar mais lento a leitura ou gravação para), permitindo essencialmente aos aplicativos ativos mais "memória de alta velocidade".

Isso é ótimo para quando você estiver em uma máquina com uma pequena quantidade de RAM e não quiser ter problemas se acabar. No entanto, se o seu sistema tiver 16 GB ou 32 GB de RAM, e supondo que você não esteja executando um banco de dados MySQL para StackExchange ou editando um filme completo de 1080p no Linux, uma partição swap deve ser usada?

IQAndreas
fonte
16
@mikeserv Sabe, eu adoraria aceitar essas duas letras como resposta apenas para efeito cômico.
IQAndreas
3
@ Janis - custa muito. E você poderia facilmente ter feito isso sem trocar nem mesmo a máquina de 1 GB se implementasse o gerenciamento de memória sólida. Swap custa desempenho - quando você o possui, o kernel inevitavelmente o usará. Portanto, em um disco de 1 TB ou de qualquer tamanho, fazer uma partição de troca é um convite ao kernel para colocar páginas de memória em disco, em vez de mantê-las na RAM ou descartá-las inteiramente. Com 16 gb, um usuário típico nunca abordará o uso de tudo - eu tenho 24 gb de RAM com 2 gb usados ​​e 10 gb em cache (porque usei um torrent para /tmp) após 3 dias de funcionamento.
mikeserv
5
@ MikeServ, você está errado, eu temo; Eu tenho observado constantemente as métricas de disco exibidas. Desde que haja memória livre, a troca não foi usada, somente quando a memória foi preenchida, a troca foi iniciada. Eu acho que depende de como você usa seu computador; um sistema de desktop que é desligado todas as noites raramente encontrava problemas de memória, embora meu sistema tivesse meses de atividade. Sim, o desempenho dos custos de troca, mas se não houver espaço na RAM, o sistema poderá continuar funcionando. Qual é a opção que você tem? Talvez você possa elaborar o argumento de gerenciamento de memória. Eu uso meu sistema Linux como pré-configurado.
Janis
40
@mikeserv, como você postou um comentário com menos de 15 caracteres?
user253751
11
@immibis existem 12 espaços de largura zero
dave

Respostas:

98

Sim.

Definitivamente, você sempre deve ter a troca ativada, exceto se houver um motivo muito atraente e proibitivo (como, por exemplo, nenhum disco ou apenas o disco de rede presente). Você deveria trocar a ordem dos tamanhos ridículos frequentemente recomendados (como o dobro da quantidade de RAM)? Bem, não .

O motivo é que a troca não é útil apenas quando seus aplicativos consomem mais memória do que a RAM física (na verdade, nesse caso, a troca não é muito útil porque afeta seriamente o desempenho). Atualmente, o principal incentivo à troca não é transformar magicamente 16GiB de RAM em 32 GiB, mas fazer um uso mais eficiente da RAM disponível instalada.

Em um computador moderno, a RAM não é utilizada. RAM não utilizada é algo que você também não poderia ter comprado e economizado. Portanto, qualquer coisa que você carregar ou qualquer coisa que é outra forma de mapeamento de memória, qualquer coisa que poderia possivelmente ser reutilizados por qualquer pessoa em qualquer momento posterior (limitado por restrições de segurança) está sendo armazenada em cache. Logo após a inicialização da máquina, toda a RAM física será usada para alguma coisa .

Sempre que você solicita uma nova página de memória do sistema operacional, o gerenciador de memória precisa tomar uma decisão informada:

  1. Limpar uma página do cache do buffer
  2. Limpe uma página de um mapeamento (efetivamente o mesmo que nº 1, na maioria dos sistemas)
  3. Mova uma página que não foi acessada por um longo período de tempo - de preferência nunca - para trocar (isso pode até acontecer proativamente, não necessariamente no último momento)
  4. Mate seu processo ou mate um processo aleatório (OOM)
  5. Kernel panic

As opções 4 e 5 são muito indesejáveis e só acontecerão se o sistema operacional não tiver outra opção. As opções 1 e 2 significam que você joga fora algo que possivelmente precisará em breve novamente. Isso afeta negativamente o desempenho.

A opção 3 significa que você move algo que você (provavelmente) não precisa em breve para armazenamento lento. Tudo bem, porque agora algo que você precisa pode usar a RAM rápida.

Ao remover a opção nº 3, você efetivamente limitou o sistema operacional às nºs 1 ou 2. Recarregar uma página do disco é o mesmo que recarregá-la da troca, exceto ter que recarregar da troca geralmente é menos provável (devido à tomada de decisões de paginação apropriadas).

Em outras palavras, ao desativar o swap, você não ganha nada, mas limita o número de opções úteis do sistema operacional ao lidar com uma solicitação de memória. O que pode não ser , mas muito possivelmente pode ser uma desvantagem (e nunca será uma vantagem).

[EDITAR]

O cuidadoso leitor da página de mmap manual , especificamente a descrição de MAP_NORESERVE, notará outro bom motivo pelo qual a troca é uma necessidade, mesmo em um sistema com memória física "suficiente":

"Quando o espaço de troca não está reservado, pode-se obter o SIGSEGV na gravação, se não houver memória física disponível."

- Espere um momento, o que isso significa?

Se você mapear um arquivo, poderá acessar o conteúdo diretamente, como se o arquivo estivesse, de alguma forma, por mágica, no espaço de endereço do seu programa. Para acesso somente leitura, o sistema operacional não precisa, em princípio, de apenas uma página de memória física que possa repovoar com dados diferentes toda vez que você acessar uma página virtual diferente (por motivos de eficiência, é claro que não é isso que é feito, mas em princípio, você pode acessar dados em terabytes com uma única página de memória física). Agora, e se você tambémescrever em um mapeamento de arquivo? Nesse caso, o sistema operacional deve ter uma página física - ou trocar espaço - pronta para todas as páginas gravadas. Não há outra maneira de manter os dados atualizados até que o processo de write-back de páginas sujas tenha feito seu trabalho (que pode levar vários segundos). Por esse motivo, o sistema operacional reserva (mas nem sempre confirma) o espaço de troca; portanto, se você estiver gravando em um mapeamento enquanto houver uma página física não utilizada (essa é uma condição normal e possível), você pode É garantido que ainda funcionará.

Agora, e se não houver troca? Isso significa que nenhuma troca pode ser reservada (duh!), E isso significa que, assim que não houver mais páginas físicas gratuitas e você estiver escrevendo em uma página, estará recebendo uma agradável surpresa na forma de receber seu processo uma falha de segmentação e provavelmente sendo morto.

[/EDITAR]

No entanto, a recomendação tradicional de fazer swap duas vezes o tamanho da RAM não faz sentido. Embora o espaço em disco seja barato, não faz sentido atribuir tanta troca. Desperdiçar algo barato ainda é um desperdício, e você absolutamente não deseja trocar continuamente os conjuntos de trabalho com várias centenas de megabytes (ou maiores) de tamanho.

Não existe um tamanho de troca "correto" único (há tantos tamanhos "corretos" quanto usuários e opiniões). Normalmente, atribuo 512MiB fixos, independentemente do tamanho da RAM, o que funciona muito bem para mim. O raciocínio por trás disso é que 512MiB é algo que você sempre pode pagar hoje em dia, mesmo em um pequeno disco. Por outro lado, adicionar vários gigabytes de swap não é melhor. Você não vai usá-los, exceto se algo der errado.

Mesmo em um SSD, o swap é uma ordem de magnitude mais lenta que a RAM (devido à largura de banda e latência do barramento) e, embora seja muito aceitável mover algo para trocar que provavelmente não será necessário novamente (ou seja, você provavelmente não será trocando novamente, para que seu conjunto de páginas disponíveis seja efetivamente ampliado gratuitamente), se você realmente precisar de quantidades consideráveis ​​de troca (ou seja, você tem um aplicativo que usa, por exemplo, um conjunto de dados de 50 GiB), você está praticamente perdido.

Depois que o computador inicia a troca e a devolução de gigabytes de páginas, tudo vai para um rastreamento. Portanto, para a maioria das pessoas (inclusive eu), isso não é uma opção, e, portanto, ter tanta troca não faz sentido.

Damon
fonte
7
Completamente falso: pode ser uma vantagem para o kernel não usar o disco, especialmente se você configurou o OOM para suas especificações. Se o OOM killer estiver configurado para lidar com sua limpeza, é vantajoso
mikeserv
22
Qual é a diferença entre ter 8 GB de RAM e 8 GB de swap e 16 GB de RAM e sem swap? Se o seu computador decidir que precisa de 16.001 GB de memória, ele não começará a limpar / matar as coisas da mesma forma (mas o desempenho será prejudicado antes de começar a acontecer)?
Nick T
5
@ NickT: A troca não é por mais RAM, mas sim por uma bandeira vermelha, que algo será morto em breve. Eu gosto de ter uma bandeira vermelha antes de matar, em vez de ter um processo "aleatoriamente" desaparecendo diante dos meus olhos.
Mooing Duck
10
-1 esta resposta não faz sentido. Por que diabos ter memória mais lenta (swap) teria melhor desempenho que a mesma quantidade de memória mais rápida (RAM)? em algum momento você precisa reconhecer que RAM suficiente significa que não é necessário trocar.
Mehrdad
14
@ Mehrdad: Certamente faz sentido. A memória mais lenta (troca) melhora o desempenho na medida em que "mais lento" não importa para itens acessados ​​raramente ou nunca. A troca aumenta efetivamente a quantidade de memória disponível para dados "quentes" movendo dados "frios" para fora. Daemons que executam apenas algo uma vez por hora ou memória alocada por um módulo do kernel que é carregado por padrão, mas nunca usado, são um exemplo disso. Você pode trocá- las ou soltar páginas do cache. Qual é o melhor?
21415 Damon
50

Não vou concordar com algumas das opiniões que vejo aqui. Eu ainda estaria criando uma partição SWAP, especialmente em um ambiente de produção. Também faço isso para minhas máquinas domésticas e VMs.

Hoje em dia, eu os dimensionei em torno de 1 a 1,5 vezes a memória. 2 vezes a memória costumava ser a regra de ouro. O disco de troca é "barato", pois não precisa de backup nem proteção.

Se você ficar com pouca memória, seu espaço de troca oferecerá um pouco de tempo e proteção para resolver o problema.

Perceba que coisas como / tmp podem residir no espaço de troca.

A área de troca pode conter um despejo parcial do kernel para que possa ser restaurado na próxima reinicialização. Isso pode ser bom para alguma emergência de depuração futura que você é chamado a fazer.

mdpc
fonte
16
+1. Ter uma troca significa a diferença entre o desempenho prejudicado com pouca memória e uma falha grave.
21415 Davidmh
6
@mikeserv, não importa como você o configure, se o seu programa tentar alocar mais memória do que a disponível, algo irá falhar ou o sistema operacional começará a matá-los.
21415 Davidmh
6
@ Davididmh: Por esse raciocínio, seu arquivo de troca deve ser infinitamente grande; caso contrário, seus programas ainda travarão quando esgotarem o arquivo de troca.
Mehrdad
6
@ Mehrdad, mas também é mais caro. Como você tem X GB de RAM, porque é o máximo que pode pagar, é estritamente pior do que ter X GB de RAM e Y de troca, para alguns valores razoáveis ​​de Y (que dependerão do uso e tamanho de seu HD).
Davidmh
9
"seu espaço de troca oferece um pouco de tempo e proteção para resolver o problema" - isso também significa que tenho que ficar muito tempo na frente de uma máquina que não responde até que um vazamento de memória "se resolva".
Raphael
23

Talvez:

Pensei bastante neste tópico e vi opiniões pousando nos dois lados do argumento mais vezes do que posso contar. Minha abordagem foi desenvolver uma maneira de descobrir.

Comece com uma partição de troca ativa do que você acha que é um tamanho suficiente.

Em seguida, abra um terminal em uma área de trabalho e emita o comando free -hs 1que relatará o uso uma vez a cada segundo.

Opcionalmente, alterne para outros espaços de trabalho.

Faça tudo o que provavelmente fará e depois mais um pouco. Execute todos os seus aplicativos comuns de uma só vez, navegue por várias guias e tente desesperadamente dar ao sistema um treino real para você. Isso pode significar recodificar uma meia dúzia de vídeos enquanto executa uma operação de compilação e verifica seu e-mail ou o que quer. Vamos encarar os fatos, isso é tudo sobre como você usa seu sistema.

Quando você sentir que o sistema está sob uma carga alta (ou o mais alto que você pode obter e, em seguida, alguns), olhe para o terminal e examine os resultados. ou, melhor ainda, redirecione a saída para um arquivo adicionando >output.txtao comando para que você possa examinar a execução completa. Se o seu Swap usado nunca exceder o Mem free, você não precisará de swap. Se isso acontecer, você faz. free.png

Eu não preciso de troca. Talvez você faça. Por que não descobrir?

No que diz respeito à troca de tamanho, as Regras práticas geralmente são superestimadas, pois essa é uma pergunta baseada no uso.

Elder Geek
fonte
2
Então, você está dizendo que a troca é usada apenas quando o sistema exige? Nesse caso, há alguma penalidade em ativar a troca - apenas no caso? Outros comentários parecem sugerir que mesmo a presença de swap pode ser prejudicial ao desempenho?
MrWhite
3
@ w3d Não, eu não estou dizendo isso. Como você pode ver na minha saída acima, o swap é usado mesmo se não for necessário. isso pode ser ajustado um pouco com o fator de troca. Estou falando da necessidade de trocar ou não.
Elder Geek
Você pode roteiro isso para incrementar troca para cima a qualquer momento swappassa por cima free?
JFA
@ JFA eu não vi isso feito. Pessoalmente, tenho dificuldade com o conceito de reservar uma quantidade indeterminada de espaço de troca para esse fim. Teoricamente, todas as coisas são possíveis. É a fase de implementação que fica interessante.
Elder Geek
17

NOTA: Isso aconteceu comigo, em uma situação específica e incomum. Se você estiver solucionando um problema, isso pode ser útil. Não quero sugerir que TODAS as máquinas DEVEM trocar.

TALVEZ!

No passado, eu tive problemas com um "dispositivo" que eu construí, executando o Linux - executando em um dispositivo flash compacto, não queria usar meu CF usando swap e havia memória suficiente para o aplicativo.

A maioria desses aparelhos funcionou bem, mas em uma caixa particularmente ocupada, tive um problema:

FRAGMENTAÇÃO DE MEMÓRIA

Sem espaço de troca, a memória gradualmente se tornava cada vez mais fragmentada, especialmente com processos de execução longa (apesar de eu ter muita memória livre, era tudo em bits muito pequenos). Coloquei algum espaço de troca e disse ao Linux para não usá-lo, a menos que fosse necessário; isso resolveu o problema completamente.

Além de tudo o mais, o espaço de troca permite que a memória seja movida, desfragmentando-a. Se você possui memória fragmentada e precisa de um único bloco grande, os fragmentos serão trocados; à medida que são trocados, eles são efetivamente desfragmentados.

Confira / proc / buddyinfo - o meu está assim agora:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

Os números representam blocos de tamanhos diferentes; cada tamanho é metade do tamanho do próximo bloco, de blocos de 4mb à esquerda a 4kb à direita (ou seja, 4mb, 2mb, 1mb e assim por diante). Uma máquina recém-inicializada deve ter todos os blocos à esquerda, muito poucos à direita (= não fragmentados). Lembre-se também de que a mesma quantidade de memória (por exemplo, 4mb) será representada como números diferentes nas colunas - 1 bloco na coluna mais à esquerda, 1024 na coluna mais à direita.

A memória é alocada do pool o mais correto possível; por exemplo, se o seu programa deseja 12kb de memória (de uma só vez), ele será retirado da coluna 16kb; o restante aparecerá na coluna 4kb. Se não houver blocos de 16kb, serão utilizados os blocos de 32kb, resultando em 16kb e 4kb restantes, e assim por diante.

Se não houver blocos de memória grandes o suficiente, e você tiver espaço para trocar, por exemplo, se desejar 16kb de memória, ele encontrará o bloco menos usado de 16kb (que pode, por exemplo, conter um bloco usado de 4kb, um bloco disponível de 4kb, e mais 2 blocos de 4kb usados), mova as partes USED apenas para trocar e aloque a memória liberada para o novo aplicativo.

Na caixa que caiu, eu tinha centenas de milhares de blocos de 4kb e 8kb, e não muito mais.

Tanto quanto eu posso dizer (passando pelas máquinas travadas!), O kernel passará da memória para a troca, e trocará para a memória, mas nunca passará da memória para a memória.

AMADANON Inc.
fonte
3
Seu caso parece ser bom para alocar / implementar páginas enormes. Isso evitaria problemas de fragmentação (porque uma página enorme de um determinado tamanho, uma vez alocada, será doravante e para sempre novamente alocada apenas nesse tamanho) .
mikeserv
2
Essa é a melhor razão que eu já li a favor do uso de uma partição swap. Eu tentei uma pesquisa rápida e não encontrei nenhuma referência sobre isso. Gostaria de saber por que esse recurso não é documentado com mais frequência.
Para 마 SE 18/03/2015
1
páginas enormes (não transparentes) podem não ser utilizáveis ​​pelo seu aplicativo. Normalmente, aplicativos que precisam de toneladas de memória podem usá-los; por exemplo, servidores de banco de dados, java jvm. Eles devem ser ativados explicitamente e se tornam um conjunto de memórias separado que não pode ser usado para outros fins. Isso pode ser bom ou ruim, dependendo das circunstâncias. Além disso, aprenda sobre páginas enormes transparentes. Eles tentam mudar as coisas para que você use páginas enormes (para melhorar o desempenho), mesmo que seus aplicativos não saibam como. Se a memória está fragmentada, as coisas podem ir para o sul, pois o grande varredor de páginas tem mais a fazer.
Dan Pritts 18/03/2015
1
Não duvido da sua experiência com seu dispositivo flash, apenas não estou convencido de que o único caso de uso que você apresentou equivale a provavelmente precisar de troca e continuo não convencido de que a fragmentação da memória esteja relacionada à troca ou não. Isso levanta uma questão interessante que poderia ser facilmente testada e provada ou refutada.
Elder Geek
1
Pergunta de acompanhamento . O que você quer dizer com "fragmentação de memória"? A MMU não se importa se as páginas físicas usadas para páginas consecutivas em algum espaço de endereço virtual são consecutivas ou não. As páginas físicas estão fragmentadas, mas isso não importa (desde que falemos da memória comum do aplicativo em uma máquina física de cluster único e não como páginas de memória usadas por um periférico ou um hipervisor). Quando um programa pede 16kB, ele recebe quatro páginas, que podem ou não estar em qualquer lugar próximas na memória física.
Gilles
15

Uma partição de troca tem um valor significativo acima e além de simplesmente agir como uma RAM extra quando você acabar.

Por um lado, o Linux utiliza o máximo de memória possível para armazenar arquivos em cache e operações de E / S, se você tiver alguma troca, poderá descobrir que mais memória é armazenada em cache e / ou IO, tornando-a mais rápida (minimizando o acesso ao disco e também diminuindo o desgaste dos SSDs). manter dados que algum programa alocou, mas está usando apenas uma vez a cada 12 horas, o que pode ser o caso de alguns daemons.

Além disso, o Linux usa uma estratégia otimista de alocação de memória, pela qual permitirá que as páginas sejam nominalmente alocadas, mesmo que não tenha certeza de que possui memória real para preenchê-las. Isso é mais eficiente do que fazer uma verificação adequada e mapear todas as alocações e geralmente não causa problemas. No entanto, as heurísticas usadas pelo kernel para determinar se é aceitável permitir uma alocação incluem o nível de troca disponível no sistema; portanto, as alocações podem ser mais rápidas se o sistema tiver bastante troca, mesmo que não seja muito utilizado.

Esses fatores juntos me levam a acreditar pessoalmente que é melhor ter alguma troca em quase todos os sistemas normais, no entanto, para tamanhos grandes de ram, eu ignoro a regra ram * 2 e simplesmente limito minha troca em 4-8 GB (dependendo do tamanho do disco )

Validade
fonte
9
Até 4 GB são grandes demais para um desktop. Prefiro ativar o assassino do OOM antes de esperar que a troca seja preenchida se algo der errado. (Se eu já encontrei um caso em que precisava de mais, eu poderia dd e mkswap trocar FILE antes de executar qualquer trabalho enorme que necessitasse de mais memória virtual do que minha máquina tinha RAM. Ou seja, se sair do meu navegador não liberasse o suficiente ...)
Peter Cordes
@ PeterCordes Isso provavelmente depende de que tipo de tarefas você está fazendo, eu entendo perfeitamente. Pessoalmente, acho que me beneficio de altos níveis de troca, já que muitas vezes faço longas compilações com baixa prioridade em segundo plano enquanto uso minha máquina, que são trocadas quando a memória está com pouca carga (normalmente quando a máquina está muito ocupada para fazer qualquer compilação). de qualquer forma). Ainda assim, eu concordo que é uma coisa muito pessoal baseada em carga de trabalho, é preciso sempre pensar em seu próprio uso antes de decidir.
Vality 18/03/2015
1
história engraçada: só hoje, no meu laptop com 4 GB de RAM, troca 0.5G (SSD), o firefox acionou o assassino do OOM (que pegou o firefox). Eu nunca tinha acontecido isso antes. (Embora eu estivesse usando meu laptop mais do que o habitual). Praticamente nada mais estava funcionando (apenas gnome-terminal no xfce). Então, eu acho que estou bem com isso, já que o Firefox deve saber melhor do que usar tanta memória RAM. Eu vi alguém dizer há um tempo atrás "os navegadores existem para testar o subsistema de memória virtual", ou algo assim. Firefox é muito ruim em liberando caches para guias que não tenham sido utilizadas durante dias, etc.
Peter Cordes
3
Um caso em que o Linux considera o espaço de troca disponível é quando um grande processo tenta iniciar um filho: as chamadas do sistema fork () + exec () começam duplicando aproximadamente a alocação do pai - o kernel não pode garantir que o novo filho seja menor que o pai. O espaço de troca normalmente não é usado, mas, a menos que esteja disponível, o fork () pode falhar. Um exemplo típico em um cliente é um navegador que inicia um plug-in ou em um servidor quando um contêiner de aplicativo grande chama um programa auxiliar. 1/2 ou 1GiB de swap geralmente é suficiente para resolver o problema. Google "o java exec não pode alocar memória"
James
13

Você nunca deve ter uma troca maior que o tamanho máximo que seria capaz de tolerar aguardando a troca / retirada do kernel; caso contrário, você está apenas criando um novo modo de falha para o seu sistema (tornando-se irremediavelmente atolado na troca). Observe que, apesar das unidades modernas serem capazes de transferir na ordem de GB / s, o Linux normalmente só consegue mover trocas a taxas mais próximas das linhas de centenas de kB, ou no máximo alguns MB, por segundo. Portanto, uma grande troca pode deixar seu sistema inutilizável por minutos, horas ou até dias.

Se você possui memória física suficiente para o que está fazendo, o tamanho ideal para a troca é combiná-lo com a quantidade de processos de "dados indesejados" que estão mantendo, mas nunca usando. Provavelmente, isso varia de algumas a algumas centenas de megabytes. Essa estratégia permite que toda a sua memória física seja utilizada para armazenar informações úteis em cache, e não como armazenamento permanente de dados que provavelmente nunca serão usados ​​novamente.

Se você não possui memória física suficiente, é necessário avaliar se é possível tolerar uma desaceleração grave devido a trocas pesadas. Nesse caso, ter até 1-2 GB de swap pode fazer sentido, e talvez até 4 GB se você tiver unidades extremamente rápidas. Porém, mais do que isso apenas piorará os modos de falha do sistema, e você deve considerar comprar mais RAM.

R ..
fonte
2
Eu acho que essa é a melhor resposta. Se você tiver muito espaço de troca, ela poderá deixar a máquina totalmente sem resposta devido a todas as trocas. Isso significa que você não pode matar o processo ofensivo. Se você reduzir o espaço de troca, o OOM killer fará seu trabalho automaticamente. Os argumentos em outras respostas sobre o cache do buffer de arquivo são totalmente pouco convincentes. Você deve ter swap para que o kernel possa mover buffers de arquivo para swap ... qual está no disco? Por favor.
Timmmm
O único argumento contra o espaço de troca que posso encontrar é o seguinte: "algum programa vaza memória". E? Se o OOM killer mata algo importante que você não salvou, você efetivamente perdeu seu trabalho. O que significa que esse argumento se torna completamente irrelevante. Posso apenas forçar o desligamento da minha máquina para ter exatamente o mesmo efeito enquanto ainda tenho alto espaço de troca para tarefas de baixa prioridade que usam muita memória e geralmente são trocadas. Se a sua máquina ficar presa nesse estado, a culpa é sua. A única vez que aconteceu comigo foi quando eu mesmo escrevi um programa para preencher toda a memória de trabalho.
Sahsahae
11

Somente se você quiser hibernar para trocar (esse recurso também é chamado "suspender no disco" e envolve salvar todo o conteúdo da RAM e desligar a energia). Normalmente, isso é usado apenas em laptops e outros dispositivos móveis, portanto depende.

hanetzer
fonte
6

Não existe uma resposta universal e clara, pois depende de uma tarefa que você está prestes a executar. Se você estiver prestes a executar um servidor de banco de dados, HTTP, virtualização ou cache, nunca deverá ativar nenhum tipo de troca, independentemente da quantidade de memória RAM que possui. Se você possui um host de área de trabalho ou de tarefas mistas e tem 16 ou mais Gb de RAM rápida - dê uma olhada aqui: zRam

Alexey Vesnin
fonte
O zRam é uma ótima opção. Eu o usei em conjunto com pequenos sistemas de pen drive com bons resultados.
Elder Geek
1
@ElderGeek Eu também o usei em um ambiente sem disco, por exemplo, inicialização de rede. Bom trabalho, mas há algumas ressalvas: primeiro, você não precisa apenas de mais RAM, precisa de um RÁPIDO. Módulos ram lentos e baratos, que provavelmente o acomodariam em um caso clássico comum, podem causar um problema. O barramento frontal da CPU também deve ser levado em consideração: mesmo no caso em que você possa ter uma frequência de CPU mais lenta, mas uma frequência FSB mais rápida melhorará bastante seu desempenho. A segunda preocupação é um número de partições de troca do zRam. Tente números de 1 ao número de núcleos da CPU. Não use em sistemas de núcleo único!
Alexey Vesnin 28/03
Bons pontos válidos todos. Como eu sou um geek desempenho e sempre projetar e construir meus próprios sistemas, não estou pessoalmente atormentado com essas preocupações
Elder Geek
@ElderGeek me too :) prazer em conhecê-lo! Também notei uma coisa estranha no comportamento do zRam. Ele aparece e desaparece em diferentes versões e configurações do kernel, mas altamente reproduzível nos kernel HZ 100 e 1000. O zRam funciona bem para 1,2,4 - mas não para mais partições. Mesmo em 8 e 16 núcleos físicos no hardware superior em tarefas quase inativas. Portanto, lembre-se de brincar com os ajustes! Saudações da Russia!
Alexey Vesnin
Não concordo com "se você executa um banco de dados, ... nunca deve ativar nenhum tipo de troca, independentemente da montagem da ram que você possui". A troca é geralmente preferível ao assassino de OOM que mata processos aleatórios. Sim, você deve ter memória suficiente para os aplicativos em execução e, sim, o uso de grandes quantidades de troca pode tornar o sistema mais lento. Eu te invejo vivendo em um mundo ideal.
AMADANON Inc. 12/03
5

Não há como saber se você precisa trocar espaço ou não, se o único parâmetro que conhecemos é a quantidade de RAM instalada.

Em qualquer caso, existe um equívoco comum de que ter um espaço de troca está afetando negativamente o desempenho do sistema. Isto está incorreto. Contanto que você tenha RAM suficiente, ter uma área de troca, independentemente do tamanho, não prejudica o desempenho. O que afeta o desempenho é ter pouca RAM e usar efetivamente o espaço de troca.

  • caso 1: Se você não tiver espaço de troca e estiver sem RAM, o kernel do Linux escolherá um ou mais processos que considera bons candidatos e os matará.

  • caso 2: Se você tiver um espaço de troca e estiver sem RAM, o kernel escolherá menos páginas de memória usadas e as colocará na área de troca para liberar RAM. Isso diminuirá a velocidade do sistema, mas seus aplicativos não serão afetados de outra forma.

Eu sempre prefiro o caso 2, pois me sinto desconfortável perdendo partes ou todo o meu trabalho porque o kernel acha que vale a pena matar meus aplicativos. Além disso, com o tamanho atual de um disco médio na faixa de TB, reservar alguns por cento para troca não deve ser um problema.

jlliagre
fonte
6
Eu prefiro o caso 1, porque a única vez que fico sem memória RAM é quando tenho um programa descontrolado. O assassino da OOM geralmente é muito bom em identificar fugitivos, e eu realmente prefiro matá-lo imediatamente do que depois de algumas horas de troca pesada.
Mark
1
@ Mark, esse é um ponto válido. Eu ainda tento evitar delegar a um algoritmo as fotos primeiro, acho que depois abordarei.
Jlliagre
2
o caso 2 é válido apenas se você tiver algo que o avise sobre essa situação e tiver tempo suficiente para "fazer algo" manualmente antes que o sistema fique sem troca. Mas você pode monitorar a porcentagem de RAM usada para os mesmos resultados.
Totor
1
Com base no seu raciocínio, o monitoramento do uso da RAM é suficiente .
Totor
1
@ Motor Eu prefiro não ser acordado no meio da noite pelo meu aplicativo de monitoramento de laptops porque lancei um lote que processa vários arquivos e esgotou a RAM. Prefiro que o trabalho seja feito, mesmo que demore algumas horas a mais por causa do tamanho menor da RAM do que ter todo o material interrompido.
Jlliagre 17/03/2015
3

Minha regra para aplicar swap em qualquer sistema é ter a resposta para isso:

  • Qual é o objetivo do sistema?
  • Quanta memória os aplicativos consumirão?
  • Este é um sistema crítico?
  • Preciso de um espaço em disco temporário para transferência de arquivos?
  • Taxa de crescimento prevista das aplicações?

Quando recebo resposta para essas informações, dimensiono o sistema de acordo. Nos anos anteriores, eu fazia a regra de ouro da Sun Microsystem. Até 16 GB de RAM duas vezes mais para SWAP, de 16 GB na mesma quantidade. Por outro lado, se você tiver RAM suficiente para poupar e seus aplicativos não usarem SWAP à força, poderá omitir a troca. Se você precisar, basta colocar um novo disco ou lun e configurar o SWAP. a regra da Sun se aplicava principalmente porque no Solaris, em caso de "pânico do kernel", a memória seria descartada inteiramente para ser trocada por análises adicionais.

BitsOfNix
fonte
1

A troca será necessária se você não tiver RAM suficiente para executar todos os seus programas.

Você diz que não está fazendo nada que exija muita memória RAM. Então, você tem RAM suficiente.

Então, você não precisa de espaço de troca.

Mas , se você acha que, em algum momento, apesar do que você insinua em sua pergunta, seus programas usarão, digamos mais da metade (ou dois terços) da sua RAM (regra geral), então leia a outra "troca pró" "respostas. Você não precisará trocar, mas isso pode melhorar o desempenho do sistema.

Totor
fonte
O uso de swap pode ajudar a evitar um acidente catastrófico, mas nunca aprimora o desempenho, assim como um pára-quedas acelera um ferrari. ;-)
Elder Geek
@ElderGeek Pode ser um caso delicado, mas a troca pode ajudar. Há momentos em que você tem RAM suficiente para tudo, mas programas inativos podem ser trocados para fazer melhor uso da RAM (por exemplo, algum cache de disco útil). Eu costumava ver isso muito no final dos anos 90. Às vezes, vejo isso quando tenho <1 GB de RAM livre (incluindo cache de disco), sem precisar de espaço de troca.
jbo5112
@ jbo5112 Não descartarei completamente a possibilidade, se você diz, minha experiência mostrou o contrário até agora. Isso não é muito surpreendente, pois é um caso de como o sistema é usado mais do que uma regra rígida e rápida (que todo mundo parece procurar).
Elder Geek
@ElderGeek Eu só posso vê-lo agora porque meus discos têm uma década e precisam desesperadamente de cache. Geralmente, há um problema adicional de a troca ser ajustada muito alta para quase todos os casos, o que faz com que o espaço de troca seja usado de maneira muito agressiva. A queda do valor de 60 para 10 parece uma recomendação comum. Você pode diminuir ainda mais, mas em algum momento despejará muito cache de disco, causando muitas E / S extras durante a troca.
jbo5112
@ jbo5112 Bom ponto. É sempre um ato de equilíbrio entre os diferentes subsistemas. Lembro-me de voltar a ajustar ajustes como a intercalação do disco rígido e a taxa de atualização de RAM para reduzir o desempenho máximo dos sistemas 80286 com as unidades Seagate ST225 e ST238. Sempre precisamos abordar as coisas caso a caso para extrair o máximo desempenho e confiabilidade. Parabéns BTW! A última vez que consegui extrair uma década de uma unidade, foi uma Micropolis que possuía um total de 600 MB.
Elder Geek
0

A resposta curta:

Sim, você sempre precisa trocar, apenas no improvável caso um aplicativo não se incomode em mapear a memória, mas mapeia a memória virtual diretamente.

Defina seu arquivo de troca para:

  • RAM+round(sqrt(RAM)) se você usar a hibernação
  • round(sqrt(RAM)) se você não

Defina seu swappiness10 em uma área de trabalho, mas não em um servidor!

A resposta longa:

No passado:

A regra geral em uso nos últimos 25 anos tem sido um mínimo de 1xRAM e um máximo de 2xRAM, e é isso que você verá citado o tempo todo.

Esse mínimo foi recuado na idade da pedra, quando eu era adolescente e os dinossauros ainda vagavam pela Terra e porque a RAM era muito cara e você absolutamente precisava desse espaço de troca para poder realizar qualquer coisa.

O máximo foi definido naquele momento por causa dos retornos decrescentes: é muito lento ter que trocar tanta memória, pois o acesso ao HDD é um fator 1000 mais lento que a RAM: bom em caso de emergência, mas não muito bom para o uso diário! Na época, quando você ficou sem espaço de troca, era hora de adicionar mais RAM! (o que ainda é verdade hoje).

No presente:

  1. Se você não usa a hibernação e sua memória excede 1 GByte, a nova regra geral é round(sqrt(RAM))onde RAMestá obviamente o tamanho da sua RAM em GB.

  2. Se você usar a hibernação, precisará trocar toda a quantidade de RAM + RAM já trocada pelo disco, assim a fórmula se tornará: RAM+round(sqrt(RAM))

  3. A regra dos retornos decrescentes ainda é válida hoje, mas a menos que você teste seu uso real, usar 2xRAM é apenas um desperdício de espaço em disco , portanto, não use o máximo, a menos que você fique sem espaço de troca usando as outras metodologias .

Todos eles juntos fornecem a seguinte tabela: (últimas 3 colunas indicando espaço de troca)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

O acima é apenas uma regra de ouro; não é a lei da gravidade!
Você pode violar esta regra (diferente da lei da gravidade) se o seu caso de uso específico for diferente!

Dica profissional: sempre aloque SWAP no início de um disco rígido, pois os cabeçotes precisam se mover menos na parte interna do disco.
Sim: nos SSDs, não importa mais onde você localiza a área de troca, pois eles usam tunelamento quântico em vez de cabeças móveis e os SSDs modernos usam todas as suas células de memória (mesmo o espaço não alocado) para impedir a degradação quântica.

Como testar se o seu uso de swap é diferente da regra "genérica":

Basta executar:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

que fornecerá uma lista de todos os programas em execução que foram trocados (com o que usar mais espaço de troca na parte superior)

Se você estiver usando mais de alguns KB: redimensione para mais do que o mínimo, caso contrário, não se preocupe ...

Se você estiver em um servidor, pare de ler agora: está tudo pronto!


Se você estiver em um cliente de desktop / laptop (não servidor), deseja que sua GUI seja a mais responsiva possível e só troque quando for realmente necessário . O Ubuntu foi otimizado para trocar cedo para uso do servidor, mas no seu cliente você deseja editar gimprapidamente essa enorme imagem bruta de 250 mega pixels , portanto, definir swappiness10 para impedir o kernel de trocar cedo demais, garantindo que isso não ocorra ' t trocar tarde demais:

sudo nano /etc/sysctl.conf

e adicione:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

até o final do arquivo, salve o arquivo ( Ctrl+ XY+ Enterem nano) e execute:

sysctl --system

para recarregar o parâmetro ou apenas pelos velhos tempos, adote a abordagem Window $ e reinicie ... :-)

Fabby
fonte
-1

Resposta de compromisso: depende do significado de "deveria".

Você precisa de uma partição swap no sentido de que algo ruim acontecerá se você não tiver uma nas condições operacionais descritas? Não.

É aconselhável ter uma partição de swap, caso você acidentalmente crie um exército de porcos de memória, para ter a chance de matá-los antes que o assassino da OOM entre em ação? Sim.

Se a sua RAM física "exceder muito" o uso de memória de dados de todos os programas que você executará simultaneamente o tempo todo, não haverá benefício de desempenho em troca. Se exceder, mas não "muito", pode haver um benefício no desempenho se o sistema operacional puder trocar a memória raramente usada para manter os dados de arquivos mais frequentemente acessados ​​na memória.

Em resumo, é ótimo que você tenha 16 GB de RAM. Mas, se você também tiver um disco de 1 TB, não poderá reservar 16 GB para troca? É apenas 1,5% do disco.

Atsby
fonte