Qual è la dimensione di scambio predefinita?


16

In che modo il programma di installazione calcola quale dimensione della partizione di swap creare? Presumibilmente si basa sulla dimensione della RAM installata, ma dipende da quanta RAM?


Non esiste un valore predefinito, dipende da quanta RAM hai.
Uri Herrera,

1
Bene sì, ma stavo cercando un po 'più di dettagli di "dipende". È sempre un set multiplo della dimensione della RAM o dipende dalla quantità di RAM disponibile? Ad esempio, grandi dimensioni della RAM non avrebbero mai bisogno di più che sufficienti per abilitare l'ibernazione, ma dimensioni della RAM molto piccole potrebbero beneficiare di uno scambio considerevolmente maggiore di 1: 1.
Seret,

Risposte:


5

In realtà non esiste alcun dphys-swapfileprogramma su un CD di installazione di Ubuntu predefinito e non viene utilizzato per calcolare la dimensione di scambio .

Quello che succede è che il programma di ubiquityinstallazione utilizza gli partman-autoscript e i file di configurazione (chiamati ricette ) per determinare le dimensioni di tutte le partizioni. Funziona così:

  • Partman trova il file di ricetta giusto in base al tipo di computer e all'opzione scelta dall'utente.
  • Qui trova la dimensione minima e massima della partizione e la sua priorità. Per lo scambio può essere 96 (min - in MB) 512 (priorità) 300% (max).
  • Quindi ottiene la dimensione della RAM (via /proc/meminfo).
  • Utilizza il proprio algoritmo per calcolare le dimensioni.

Dettagli:

Un file di ricetta può assomigliare a questo:

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{ } .

L'algoritmo per calcolare le dimensioni:

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;
      }
   }
}

Per di più vedi:


Dibattito interessante: un riferimento migliore di uno strano sito web debian?
enzotib,

Beh, ho scoperto che anche quando l'ho cercato, ma il pacchetto ha un "Avvertimento: questo pacchetto è destinato all'uso nella costruzione di immagini debian-installer. Non installarlo su un normale sistema Ubuntu.". Ho pensato che questo non fosse usato, quindi ho cercato e trovato il codice per dphys-swapfile>: - D Hmm davvero interessante.
Rinzwind,

@enzotib: perché strano?
organizzare il

@arrange: strano perché non è un sito ubuntu ufficiale, e anche come sito debian non sembra ufficiale.
enzotib,

Ho trovato altri 2 metodi per calcolare la dimensione dello swap D: Questo metodo usa grep ^ Mem: / proc / meminfo o se quello è 0 grep ^ MemTotal: / proc / meminfo e quindi si moltiplica per 2 (impostazione predefinita) o 3 (la maggior parte sono impostati su 300%) con un minimo per architettura. Un mipsel-sb1-bcm91250a utilizza un 512 fisso. I386-efi utilizza il 200%.
Rinzwind,

19

Sarà piuttosto tecnico ma è stato divertente scoprirlo, quindi ecco qui ...

  • Ho trovato un pacchetto dphys-swapfileed ecco il codice sorgente . L'opzione setupviene utilizzata per configurarlo:
setup - dice a dphys-swapfile di calcolare la dimensione ottimale del file di scambio e
(ri) generare un file di scambio adatto. Predefinito 2 volte la dimensione della RAM.
Questo può essere chiamato all'avvio, quindi il file rimane sempre
giusta dimensione per la RAM corrente, o eseguita a mano ogni volta che la dimensione della RAM ha
cambiato.
  • All'interno dphys-swapfileè presente un'impostazione conf_swapsizeper una dimensione predefinita (in Natty è vuota):
dimensione che vogliamo forzare ad essere, default (vuoto) dà 2 * RAM
CONF_SWAPSIZE =

e un'impostazione per un swapfactor...

this is what we want, 2 times RAM size
SWAPFACTOR=2
  • La dimensione effettiva viene calcolata un po 'più avanti su:

    if ["$ {CONF_SWAPSIZE}" = ""]; poi
      # calcola le dimensioni ottimali automatiche
      echo -n "dimensione di calcolo"
      # questo sembra essere il più vicino alla dimensione fisica della RAM, manca di circa 60k
      KCORESIZE = "` ls -l / proc / kcore | awk '{print $ 5}' `"
      # make MBytes che arrotondato per difetto sarà esattamente 1 in numero troppo basso, quindi aggiungi 1
      MEMSIZE = "` expr "$ {KCORESIZE}" / 1048576 + 1` "
      # default, senza sovrascrittura del file di configurazione, swap = 2 * RAM
      CONF_SWAPSIZE = "` expr "$ {MEMSIZE}" '*' "$ {SWAPFACTOR}" `"
    fi

Come puoi vedere, il modo in cui lo calcolano in questo pacchetto dipende dalla dimensione di /proc/kcore, quindi viene diviso per 1048576, +1 per arrotondare per eccesso e quindi moltiplicato per swapfactor. Dalla mia macchina:

inserisci qui la descrizione dell'immagine

Quindi il valore predefinito per questo sistema sarebbe 1065349120/1048576 = 1015 + 1 = 1016 * 2 = 2032 MByte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.