Troque o tamanho da partição em um computador com RAM de 64 GB para um trabalho intensivo em memória


36

Tenho 64 GB de RAM e SSD de 240 GB no meu computador, que vou usar para cálculos com muita memória (aprendizado de máquina, mineração de dados etc.). A maioria dos conselhos que encontrei na Internet são de computadores com RAM de 2-4 a 8 GB e recomendam o dobro do tamanho da partição de troca de RAM (aproximadamente 128 GB).

É razoável fazer uma partição de swap de 128 GB? que vantagens eu ganho criando uma enorme partição de swap?

Entendo corretamente que, no caso de ficar sem memória RAM física:

  1. Se não houver troca, recebo um erro de 'falta de memória'
  2. Se eu tiver swap, algumas páginas da RAM serão copiadas para trocar a partição e o programa continuará sendo executado (embora mais devagar).

Algumas pessoas dizem que é uma má idéia fazer uma troca no SSD, pois ele possui uma quantidade limitada de ciclos de leitura / gravação. Quão rápido o uso do swap esgotará os ciclos de leitura / gravação de SSD (até onde eu sei, são cerca de 50000 IOPS de gravação)?

Estou usando o Linux ( Ubuntu 14.04 (Trusty Tahr)).

Vamos definir uma troca de 16 GB por enquanto, como deve ser o suficiente (por exemplo, RedHat sugere 4 GB), e 16 GB de espaço em disco não é realmente um grande problema.


1
Em vez de confiar explicitamente no swap, se você conhece o tamanho da sua configuração inicial de trabalho ou deseja fazer um gerenciamento de memória de baixo nível, considere usar mmappara alocar as páginas do conjunto de trabalho. Então, sua quantidade de swap será exatamente a quantidade necessária para o seu processo.
fofo

5
O conselho que recomenda "o dobro da quantidade de RAM" remonta aos velhos tempos, quando os computadores tinham pouca RAM. Vários documentos afirmam que é aplicável principalmente a computadores com <2GB de RAM. Acima disso, o tamanho da troca está relacionado principalmente ao que você está fazendo com a máquina.
John WH Smith

Consulte também as perguntas e respostas sobre essa falha no servidor - se você estiver executando Java (e possivelmente outros aplicativos), deseja garantir a troca suficiente para aumentar a alocação de memória. Eu , pessoalmente, ficar com o padrão RHEL de RAM + 2 para a minha partição swap
Warren

2
É uma pena que a maioria dos comentários aqui tenha sido removida. Adicionando novamente: Vale a pena mencionar, aliás, que se o seu kernel suportar, você poderá montar sua partição swap discardem um SSD. Além disso (e isso foi mencionado em uma resposta abaixo), não se esqueça de que você pode usar um arquivo em vez de uma partição para um gerenciamento potencialmente mais fácil (e nenhum resultado de desempenho em um SSD devido a, por exemplo, fragmentação).
Jason C

1
Se você tiver um aplicativo com uso intensivo de memória, como o aprendizado SVM, e ficar sem RAM e começar a trocar, tudo ficará muito lento para se recuperar e sua única jogada disponível será a tomada (o que aconteceu comigo algumas vezes) . Você provavelmente deseja que seu processo seja eliminado por OOM se começar a trocar, para que você possa pelo menos mudar as coisas e começar de novo. Talvez com drives SSD não seja tão ruim assim. Gostaria de verificar as definições OOMK também - isso aconteceu comigo no Ubuntu que às vezes processa tenho quando ainda havia ram muito à esquerda porque eles alocados de forma agressiva matou-OOM
pqnet

Respostas:


36

Você provavelmente só precisa de uma pequena quantidade de swap. Quando você tem RAM suficiente para o conjunto de trabalho típico do seu computador, o que tenho certeza, você só precisa trocar por duas coisas:

  1. Você precisa trocar para obter informações que provavelmente nunca serão acessadas pela RAM para liberar mais espaço para o cache do disco. Muitos aplicativos são executados na inicialização do sistema e nunca serão acessados ​​novamente. Você não quer que nenhuma página que esteja suja fique presa na RAM para sempre. Então você precisa trocar para segurá-los.

  2. Você precisa trocar para cobrir alocações que nunca serão preenchidas. Esse espaço simplesmente precisa estar disponível, mesmo que não seja usado. Sem ele, o sistema terá que se recusar a alocar memória, mesmo quando tiver bastante RAM física livre, porque possui armazenamento de backup insuficiente para permitir que todas as suas alocações sejam usadas de uma só vez.

Nenhum desses requer uma grande quantidade de swap. 16 GB, por exemplo, deve ser mais do que suficiente. O objetivo não é permitir que você execute conjuntos de trabalho maiores ao custo da velocidade. O objetivo é permitir que você use seus 64 GB com eficiência e não tenha que entupi-lo com lixo ou reservá-lo para casos extremos que nunca acontecerão.

(Concordo com Bert que 4 GB provavelmente são suficientes.)


2
@wrwt Coloque sua partição swap no final da unidade (ou pelo menos após a partição de dados), o redimensionará mais rápido e com menos uso de gravação se você optar por ajustá-lo (mais especificamente, redimensionará a partição de dados para acomodá-lo mais simples, já que você não precisa mover o início). Não há vínculo entre posição e desempenho em SSDs, como às vezes ocorre em unidades mecânicas.
Jason C

Embora essa resposta provavelmente seja suficiente para a maioria dos entusiastas, é um péssimo conselho para servidores reais - a resposta depende de como o aplicativo é escrito, porque ficar sem espaço de troca fará com que o assassino com falta de memória entre em ação e encerre um processo pelo aleatório (sim, você leu certo, "aleatório")
Soren

3
@ Soren Este é o superusuário, não a falha do servidor. ;) Certamente é verdade que definir o espaço de troca não é a única decisão que você precisa tomar para "servidores reais". Você também precisa tomar decisões sobre coisas como supercomprometimento, pode ser necessário ajustar o assassino do OOM e assim por diante. (E as respostas se muito mais complicado se você espera que o seu conjunto de trabalho para exceder RAM física, mas quase ninguém opera máquinas desse jeito..)
David Schwartz

5
O Linux supercomprimirá a memória mesmo sem a troca ativada. Apenas processará o OOMK quando muita memória for realmente usada. Então, o segundo ponto da resposta está errado.
Ruslan

1
@MaciejPiechotka Ou use um arquivo.
Jason C

29

A RedHat recomenda 4 GB em uma máquina com 64 GB .

No entanto, a troca de tamanho é mais uma arte do que uma ciência. Depende de para que a máquina está sendo usada, de quanto espaço em disco e memória você possui e de outros fatores. Lembre-se, você sempre pode adicionar mais trocas posteriormente.

O uso da regra de memória física 2X está desatualizada com a quantidade de sistemas de memória atualmente. Mas executar com troca zero não é recomendado, a menos que você saiba o que está fazendo. A recomendação de 4 GB é um bom ponto de partida.


12
+1 no último parágrafo. A recomendação 2x remonta a quando a maioria dos computadores não tinha memória RAM suficiente para evitar a troca no uso normal. Subjetivamente, ao usar computadores, o limite de 2x parece ter sido selecionado como um número grande o suficiente para que o computador fique inutilmente lento antes de ficar sem troca.
Dan Neely

1
O 2X também funcionou bem quando os sistemas tinham 4 GB / 8 GB de RAM e centenas de gigabytes de espaço em disco. Claro, provavelmente era mais do que o necessário, mas qual era o problema? Mas agora que os sistemas têm 16 GB / 64 GB de RAM e SSD de 128 GB / 256 GB, o dano é óbvio.
David Schwartz

12

No Linux, você precisa de troca suficiente para que a memória virtual total disponível (RAM + SWAP) seja suficiente para todos os processos que você deseja executar ao mesmo tempo e com o seu espaço virtual máximo.

Se você tiver menos troca do que essa ou nenhuma troca, a seguinte situação ocorre: o sistema fica sem memória tentando alocar uma página. Porém, isso ainda é uma falha suave, embora não haja troca, porque o sistema possui muitas páginas "vítimas" que podem ser removidas para criar espaço: ou seja, as páginas de todos os mapeamentos de memória com backup de arquivos, como executáveis e bibliotecas compartilhadas!

À medida que seu sistema exige cada vez mais espaço para os dados (que não podem ser trocados), evacua cada vez mais o código executável (bibliotecas e executáveis ​​compartilhados), levando a uma surra terrível, pois o conjunto de trabalho é aparado em um conjunto cada vez mais Páginas.

O espaço de troca suaviza esse problema fornecendo um local para troca de páginas anônimas (não mapeadas por arquivos): as páginas usadas para alocações de memória, para que o código executável possa permanecer na memória.

Mesmo assim, se você não executar frequentemente tarefas que consomem muita memória, poderá executar a maior parte do tempo sem interrupções e configurar manualmente um arquivo de troca (em vez de uma partição dedicada) quando necessário. Para criar um arquivo de troca rapidamente, torne-se root e:

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

Quando você não precisar mais:

swapoff /path/to/swapfile
rm /path/to/swapfile

Notas:

  1. Definitivamente, você não precisa configurar pelo menos a quantidade de permuta que possui RAM. Essa regra geral remonta aos sistemas operacionais em que era um requisito difícil devido à maneira como a troca foi projetada.

  2. Existem maneiras de fazer com que o Linux falhe com dificuldade quando não há memória disponível, ou seja, manipulando os valores dessas entradas sysctl:

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
+1 para realmente se referir aos parâmetros de configuração do kernel - A chave está na parte da pergunta If I have no swap, I get an 'out of memory' error- que é false- a verdade é que quando você fica sem espaço de troca, o killer de falta de memória entra em ação e mata um processo aleatório para liberar espaço - portanto, a quantidade de espaço de troca necessária depende de como o aplicativo é gravado.
Soren 07/07

@Soren É provável que a maior parte da RAM seja preenchida com dados reais, para que o assassino com falta de memória não faça muita diferença. Thx para 'a verdade' de qualquer maneira.
wrwt

3

Há mais considerações. Se você precisa / deseja suspender para trabalhar, precisa de pelo menos o tamanho da sua RAM e mais. No entanto, parece improvável que você precise, já que parece criar principalmente um cavalo de trabalho computacional.

Nesse caso, considere usar um arquivo de troca em vez de uma partição. Você não precisa se preocupar em dimensionar muito, livrar-se ou adicioná-lo mais tarde não requer reparticionamento. Não há penalidade de desempenho (perceptível) usando um arquivo em uma partição. Se você precisar, dê uma olhada no tamanho e isso também lhe dará boas dicas.


1
@ Kaz Acho que você está falando de algo diferente do que o kaste é. O kaste está dizendo que, se você quiser suspender / hibernar o computador, desligá-lo e continuar de onde parou mais tarde, precisará de espaço de troca suficiente para armazenar toda a sua RAM (caso contrário, para onde iria?).
amalloy

@amalloy Se você armazenou sua RAM no seu espaço de troca, para onde vai a troca (lembrando que a troca é tratada como memória - se perdida, é o mesmo que perder ram).
NPSF3000

2

A carga de trabalho que você deseja aplicar à máquina precisa de uma certa quantidade de memória para executar (lembre-se de adicionar o suficiente à equação para lidar com picos de carga) e você precisa configurar o computador para ter pelo menos isso.

Os sistemas operacionais modernos fornecer memória virtual como uma combinação de memória física e espaço de troca, por isso, se você precisar de mais memória do que a máquina tem disponível, você deve adicionar espaço de swap suficiente para preencher a lacuna. Ou seja, se você precisa de 80 GB no máximo e a máquina possui 64 GB, é necessário trocar 16 GB.

Normalmente, os instaladores de sistemas operacionais solicitam que você faça uma área de troca inicial (como essa é a mais simples e permite a instalação de computadores minúsculos), e descobriu-se que uma boa regra geral para operações típicas do Unix é ter uma memória virtual dimensionada para ser três vezes a memória física; portanto, isso geralmente é sugerido. Você, no entanto, sabe mais sobre o padrão de uso para poder alterar isso conforme apropriado.

Não há nada errado em trabalhar sem espaço de troca se a pressão da memória sempre for menor. O Linux usará de forma transparente qualquer memória não utilizada como cache de disco.


2

Uma idéia muito melhor do que ter "muita troca" é (re) organizar seu trabalho para que os conjuntos de trabalho caibam na memória e, em seguida, usar o sistema de arquivos para armazenar e recuperar o trabalho que você faz. Ou seja, em vez de forçar o sistema operacional a adivinhar quais serão seus padrões de uso de memória, use o que você sabe sobre seus problemas para controlar seus padrões de uso de memória.

Como um exemplo aleatório que é imediatamente relevante para mim neste verão ... Na implementação da peneira quadrática, é preciso uma matriz grande (aparentemente) contígua para marcar (com algum algoritmo complicado cujos detalhes realmente não importam para este exemplo). A matriz precisa ter ~ 100 entradas de Giga, tão facilmente na faixa de 1 TB. Eu poderia fingir alocar isso e deixar que o sistema operacional fizesse uma quantidade incrível de trocas ineficientes para obter páginas dentro e fora da RAM para suportar todas as gravações seqüenciais na matriz. Em vez de fazer algo que não importa, planejei alocar uma matriz muito menor que caiba exatamente na memória e, em seguida, reutilizar essa pequena matriz para cobrir iterativamente o restante da grande matriz em fatias. Eu também tirei o sistema operacional, tirei o conjunto de serviços em execução, substituí o shell,

O SSD pode ser rápido, mas não é tão rápido quanto a organização de seu cálculo para executar o mesmo conjunto de operações sem a interrupção da troca.


1

Como os outros mencionados, uma partição swap é uma boa idéia, mesmo se você tiver bastante RAM. Não é uma boa ideia colocá-lo em um SSD; as gravações frequentes de uma partição de swap acabarão desgastando sua unidade.

Se você tiver uma porta USB 3.0 sobressalente, sugiro usar uma unidade flash para o seu espaço de troca. Existem muitas unidades flash de alta velocidade que são tão rápidas quanto o seu SSD, mas muito mais baratas - baratas o suficiente para serem substituídas se começarem a falhar. Uma pesquisa rápida na Amazon mostra que existem muitas unidades flash USB 3.0 de 16 GB decentes por menos de US $ 20 e até algumas unidades de 64 GB com menos de US $ 60.

Particione a unidade flash inteira como espaço de troca, e você terá espaço para troca, se necessário, e tranqüilidade sabendo que a memória que está sendo gravada repetidamente é fácil (e barata) substituível.


3
+1 para não trocar para SSD, -1 para trocar para um componente que tem uma vida útil muito curta quando usado dessa maneira.
precisa saber é o seguinte

1
@TC está certo, ArmanX - se você está tentando evitar o uso de flash (SSD), por que usaria o flash no USB? Isso é irracional.
warren

2
@TC: Não usar o SSD para troca por causa do desgaste do meio é uma lenda urbana injustificada. A troca não acontece "o tempo todo", mas raramente. Além disso, isso é algo que foi pesquisado extensivamente na Microsoft após o lançamento do Win7, com o resultado de que os padrões típicos de acesso de troca são bastante aceitáveis ​​para SSD (que é o Windows, não o Ubuntu, mas é provável que o Linux não tenha um desempenho muito pior). Você tem cem (ou mil) vezes mais operações de gravação esgotando seu SSD devido a arquivos de log tolos que ninguém está lendo (geralmente sincronizando todas as linhas).
Damon

A lógica é falha: se o pendrive é realmente tão rápido quanto o SSD, por que é mais barato?
Agent_L

É um equilíbrio. Por um lado, é uma boa ideia ter um arquivo de troca. Por outro lado, se um arquivo de permuta desgastar um SSD (que, você está certo, provavelmente não importará), seria melhor usar um substituto barato - e uma unidade flash por US $ 20 é muito melhor do que um SSD por mais de US $ 100.
ArmanX

1

Você ficará bem, mesmo com 1GiB (e provavelmente menos) de swap. Meu computador de trabalho normalmente não usa mais que 140-150 MiB. Um gigabyte é um excesso de provisionamento para isso.
A menos que você calcule tarefas que exijam conjuntos de dados na ordem de centenas de gigabytes e (este é importante!) Os dados sejam acessados ​​de maneira mais ou menos acessada uma vez, você nunca desejará uma troca muito maior que isso. Mas, novamente, o simples mapeamento de memória de um arquivo de dados funciona igualmente bem para esse aplicativo.

Mas mais troca ajuda mais, certo? Mais de tudo é sempre melhor!

Considere a diferença que uma troca de, digamos, 16GiB fará (ou pense em 64GiB). Se você nunca usar esses 16GiB, também não poderá deixá-los de lado. Mas se você usá-los, o que acontece? O disco, comparado com a memória principal, é extremamente lento. Mesmo com um SSD SATA-600, a transferência de 16GiB leva entre 30 e 40 segundos e 2-4 vezes mais em algumas outras configurações.
Agora alguém inevitavelmente objeta que você está paginando mais ou menos uma dúzia de páginas de 4kiB, e não 16GiB de uma só vez. Embora isso seja verdade, o ponto permanece. Se você precisar trocar e trocar algumas páginas, não precisará de 16GiB de swap, mas se precisar de 16GiB de swap, também será possível transferi-las (de uma maneira ou de outra).

Em teoria, 99,9% de todos os usuários poderiam usar uma máquina de 64GiB (ou qualquer máquina de 8 + GiB) sem qualquer troca e, provavelmente, nunca notariam algo faltando. No entanto, isso não é aconselhável.
Primeiro, ele é sub-ideal, porque o sistema operacional tem menos opções no que pode descartar quando a memória física está acabando. Há duas coisas que ele pode fazer: Troque algo que não é usado ou jogue fora as páginas do cache do buffer. Se você não tem troca, há apenas uma coisa que pode ser feita. Jogar fora as páginas do cache do buffer é inofensivo, mas pode afetar visivelmente o desempenho.
Segundo, os mapeamentos anônimos privados podem simplesmente falhar se não houver troca. Isso geralmente não acontece, mas, eventualmente, quando não há memória física suficiente para satisfazer a todos e não há troca, o sistema operacional tem apenas essa opção, exceto ...
Terceiro, o temido assassino do OOM pode entrar em ação O que significa que um processo mais ou menos aleatório é morto. Não, obrigado. Isso não é algo que você deseja que aconteça.

Com isso dito, conselhos como você precisa de uma troca X vezes a quantidade de RAM instalada vêm de pessoas que repetem algo que ouviram (e não entenderam!) De alguém que repetiu algo que ouviram (e não entenderam!) Décadas atrás.
A regra "use 2X your RAM" foi uma regra fácil de lembrar nas décadas de 1980 e 1990, nunca foi a "verdade de ouro" (apenas algo que funcionou bem para a maioria dos usuários), e não se aplica a todos os dias de hoje .

Você deve ter uma quantidade razoável de trocas que possa pagar com facilidade (digamos, um gigabyte), para que o sistema operacional possa paginar algumas coisas obsoletas e para que o mundo não termine imediatamente quando você pedir um pouco mais de memória. Mas é isso.

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.