Qual é o tamanho padrão de troca?

16

Como o instalador calcula o tamanho da partição swap a ser criada? Presumivelmente, é baseado no tamanho da RAM instalada, mas isso depende de quanta RAM?

Seret
fonte
Não há valor padrão, depende da quantidade de RAM que você possui.
Uri Herrera
11
Bem, sim, mas eu estava procurando um pouco mais de detalhes do que "depende". É sempre um conjunto múltiplo de tamanho de RAM ou depende de quanta RAM existe? Por exemplo, tamanhos grandes de RAM nunca precisariam ser suficientes para permitir a hibernação, mas tamanhos muito pequenos de RAM poderiam se beneficiar de uma troca consideravelmente maior que 1: 1.
Seret

Respostas:

5

Na verdade, não há dphys-swapfileprograma em um CD de instalação padrão do Ubuntu e não é usado para calcular o tamanho da troca .

O que acontece é que o ubiquityinstalador usa os partman-autoscripts e arquivos de configuração (chamados de receitas ) para determinar os tamanhos de todas as partições. Funciona assim:

  • O Partman encontra o arquivo de receita correto de acordo com o tipo de computador e a opção que o usuário escolheu.
  • Lá encontra o tamanho mínimo e máximo da partição e sua prioridade. Para troca , pode ser 96 (min - em MB) 512 (prioridade) 300% (máx).
  • Em seguida, obtém o tamanho da RAM (via /proc/meminfo).
  • Ele usa seu próprio algoritmo para calcular os tamanhos.

Detalhes:

Um arquivo de receita pode ficar assim:

1 1 1 free
    $iflabel{ gpt }
    method{ biosgrub } .

500 10000 -1 $default_filesystem
    $lvmok{ }
    method{ format }
    format{ }
    mountpoint{ / } .

96 512 300% linux-swap
    $lvmok{ }
    method{ swap }
    format{ } .

O algoritmo para calcular os tamanhos:

for(i=1;i<=N;i++) {
   factor[i] = priority[i] - min[i];
}
ready = FALSE;
while (! ready) {
   minsum = min[1] + min[2] + ... + min[N];
   factsum = factor[1] + factor[2] + ... + factor[N];
   ready = TRUE;
   for(i=1;i<=N;i++) {
      x = min[i] + (free_space - minsum) * factor[i] / factsum;
      if (x > max[i])
         x = max[i];
      if (x != min[i]) {
         ready = FALSE;
         min[i] = x;
      }
   }
}

Para mais informações, consulte:

organizar
fonte
Debate interessante: uma referência melhor do que um site debian estranho?
enzotib
Bem, eu descobri isso também quando procurei, mas o pacote tem um "Aviso: Este pacote é destinado ao uso na construção de imagens do debian-installer. Não o instale em um sistema Ubuntu normal". Eu assumi que isso não foi usado, então procurei e achei o código dphys-swapfile>: - D Hmm realmente interessante.
Rinzwind
@enzotib: por que estranho?
organize
@arrange: estranho, porque não é um site oficial do ubuntu, e também como um site debian não parece oficial.
enzotib
Encontrei mais 2 métodos para calcular o tamanho da troca D: Esse método usa grep ^ Mem: / proc / meminfo ou, se for 0 grep ^ MemTotal: / proc / meminfo e multiplica por 2 (padrão) ou 3 (a maioria está definida como 300%) com um mínimo por arquitetura. Um mipsel-sb1-bcm91250a usa um 512 fixo. I386-efi usa 200%.
Rinzwind
19

Isso vai ser bastante técnico, mas foi divertido descobrir, então aqui vai ...

  • Encontrei um pacote dphys-swapfilee aqui está o código fonte . A opção setupé usada para configurá-lo:
setup - informa ao dphys-swapfile para calcular o tamanho ideal do arquivo de troca e
(re) gere um arquivo de troca apropriado. O padrão é 2 vezes o tamanho da RAM.
Isso pode ser chamado no momento da inicialização, para que o arquivo permaneça sempre o
tamanho certo para a RAM atual ou execute manualmente sempre que o tamanho da RAM tiver
mudou.
  • Dentro dphys-swapfilehá uma configuração conf_swapsizepara um tamanho predefinido (em Natty, isso está vazio):
tamanho que queremos forçar, o padrão (vazio) fornece 2 * RAM
CONF_SWAPSIZE =

e um cenário para uma swapfactor...

this is what we want, 2 times RAM size
SWAPFACTOR=2
  • O tamanho real é calculado um pouco mais adiante:

    if ["$ {CONF_SWAPSIZE}" = ""]; então
      # calcular tamanho ideal automático
      eco -n "tamanho da computação"
      # este parece ser o mais próximo do tamanho físico da RAM, falta cerca de 60k
      KCORESIZE = "` ls -l / proc / kcore | awk '{print $ 5}' '"
      # make MBytes arredondados será exatamente 1 a menos, então adicione 1
      MEMSIZE = "` expr "$ {KCORESIZE}" / 1048576 + 1` "
      # padrão, sem substituir o arquivo de configuração, swap = 2 * RAM
      CONF_SWAPSIZE = "` expr "$ {MEMSIZE}" '*' "$ {SWAPFACTOR}" `"
    fi

Como você pode ver, a maneira como eles o calculam neste pacote depende do tamanho de e /proc/kcore, em seguida, é dividido por 1048576, +1 para arredondá-lo e multiplicado pelo fator de troca. Da minha máquina:

insira a descrição da imagem aqui

Portanto, o padrão para este sistema seria 1065349120/1048576 = 1015 + 1 = 1016 * 2 = 2032 MBytes.

Rinzwind
fonte