Який розмір swap за замовчуванням?


16

Як інсталятор обчислює, який розмір розділу swap створити? Імовірно, він заснований на встановленому розмірі оперативної пам’яті, але чи залежить це від кількості оперативної пам’яті?


Немає значення за замовчуванням, це залежить від обсягу оперативної пам’яті.
Урі Еррера

1
Ну так, але я шукав трохи більше деталей, ніж "це залежить". Чи завжди це набір, кратний розміру оперативної пам’яті, чи це залежить від кількості оперативної пам’яті? Наприклад, великим розмірам оперативної пам’яті ніколи не знадобиться більше, ніж достатньо, щоб увімкнути сплячку, але дуже малі розміри оперативної пам’яті можуть скористатися свопом, значно більшим за 1: 1.
Серет

Відповіді:


5

Насправді dphys-swapfileна установчому компакт-диску Ubuntu за замовчуванням не існує програми, і вона не використовується для обчислення розміру свопу .

Що відбувається, це те, що ubiquityінсталятор використовує partman-autoскрипти та файли конфігурації (так звані рецепти ) для визначення розмірів усіх розділів. Це працює так:

  • Partman знаходить правильний файл рецептів відповідно до типу комп’ютера та опції, яку вибрав користувач.
  • Там він знаходить мінімальний та максимальний розмір розділу та його пріоритет. Для підкачки це може бути 96 (хв - в МБ) 512 (пріоритет) 300% (макс.)
  • Потім він отримує розмір ОЗУ (через /proc/meminfo).
  • Він використовує власний алгоритм для обчислення розмірів.

Деталі:

Рецепт файл може виглядати наступним чином :

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

Алгоритм обчислення розмірів:

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

Докладніше див:


Цікава дискусія: краща довідка, ніж дивний веб-сайт debian?
enzotib

Ну, я виявив, що я також шукав його, але в пакеті є "Попередження: Цей пакет призначений для використання лише для створення зображень debian-інсталятора. Не встановлюйте його у звичайній системі Ubuntu." Я припускав, що це не використовується, тому я шукав і знайшов код для dphys-swapfile>: - D Hmm дійсно цікаво.
Rinzwind

@enzotib: чому дивно?
домовитись

@arrange: дивно, бо не офіційний сайт ubuntu, а також як сайт debian не здається офіційним.
enzotib

Я знайшов ще 2 способи обчислення розміру swap D: Цей метод використовує grep ^ Mem: / proc / meminfo або якщо це 0 grep ^ MemTotal: / proc / meminfo, а потім помножує на 2 (за замовчуванням) або 3 (більшість встановлено на 300%) з мінімумом на одну архітектуру. Mipsel-sb1-bcm91250a використовує фіксовану 512. i386-efi використовує 200%.
Rinzwind

19

Це буде досить технічно, але це було цікаво дізнатися, так що тут іде ...

  • Я знайшов пакунок dphys-swapfileі ось вихідний код . setupДля його налаштування використовується опція :
налаштування - повідомляє dphys-swapfile для обчислення оптимального розміру файлу підкачки та
(повторно) створити придатний файл підкачки. За замовчуванням це в 2 рази більше оперативної пам'яті.
Це може бути викликано під час завантаження, тому файл завжди залишається
потрібний розмір для поточної оперативної пам’яті або запускатися вручну, коли є розмір оперативної пам’яті
змінився.
  • Всередині dphys-swapfile- це встановлення conf_swapsizeзаздалегідь визначеного розміру (у Natty це порожнє):
розмір ми хочемо змусити його бути, за замовчуванням (порожнім) дає 2 * ОЗУ
CONF_SWAPSIZE =

і налаштування для swapfactor...

this is what we want, 2 times RAM size
SWAPFACTOR=2
  • Фактичний розмір обчислюється трохи далі:

    if ["$ {CONF_SWAPSIZE}" = ""]; потім
      # обчислити автоматичний оптимальний розмір
      echo -n "обчислювальний розмір"
      # це здається найближчим до фізичного розміру оперативної пам’яті, не вистачає приблизно 60 кб
      KCORESIZE = "` ls -l / proc / kcore | awk '{print $ 5}' `"
      # зробіть MBytes, які округлені вниз, будуть рівно 1 занадто мало, тому додайте 1
      MEMSIZE = "` expr "$ {KCORESIZE}" / 1048576 + 1` "
      # за замовчуванням, без перезапис конфігураційного файлу, swap = 2 * ОЗУ
      CONF_SWAPSIZE = "` expr "$ {MEMSIZE}" '*' "$ {SWAPFACTOR}" `"
    фі

Як ви бачите, як вони обчислюють його в цьому пакеті, залежить від розміру /proc/kcore, потім ділиться на 1048576, +1, щоб округлити його, а потім помножиться на swapfactor. З моєї машини:

введіть тут опис зображення

Тож за замовчуванням для цієї системи буде 1065349120/1048576 = 1015 + 1 = 1016 * 2 = 2032 Мбайт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.