Какой размер свопа по умолчанию?

16

Как установщик вычисляет, какой размер раздела подкачки создать? Предположительно это основано на установленном объеме ОЗУ, но зависит ли это от того, сколько ОЗУ?

Серет
источник
Там нет значения по умолчанию, это зависит от того, сколько у вас оперативной памяти.
Ури Эррера
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?
энзотиб
Что ж, я обнаружил, что когда я искал его, но в пакете есть «Предупреждение: этот пакет предназначен для использования только при создании образов Debian-Installer. Не устанавливайте его в обычной системе Ubuntu». Я предположил, что это не использовалось, поэтому я искал и нашел код для dphys-swapfile>: - D Хм, действительно интересно.
Rinzwind
@enzotib: почему странно?
устроить
@arrange: странно, потому что не официальный сайт Ubuntu, а также сайт Debian не кажется официальным.
энзотиб
Я нашел еще 2 метода для расчета размера свопа 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используется для настройки:
setup - указывает dphys-swapfile рассчитать оптимальный размер файла подкачки и
(повторно) создать подходящий файл подкачки. По умолчанию это в 2 раза больше оперативной памяти.
Это может быть вызвано во время загрузки, поэтому файл всегда остается
правильный размер для текущей оперативной памяти, или запускать вручную, когда объем оперативной памяти имеет
изменилось.
  • Внутри dphys-swapfileнаходится настройка conf_swapsizeдля заранее определенного размера (в Natty это пусто):
Размер, который мы хотим, чтобы он был, по умолчанию (пустой) дает 2 * RAM
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 * RAM
      CONF_SWAPSIZE = "` expr "$ {MEMSIZE}" '*' "$ {SWAPFACTOR}" `"
    фи

Как вы можете видеть, как они вычисляют его в этом пакете, зависит от размера /proc/kcore, затем делится на 1048576, +1 для округления и затем умножается на коэффициент свопфинга. С моей машины:

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

Таким образом, по умолчанию для этой системы будет 1065349120/1048576 = 1015 + 1 = 1016 * 2 = 2032 МБ.

Rinzwind
источник