35

У меня на компьютере 64 ГБ ОЗУ и SSD на 240 ГБ, которые я собираюсь использовать для вычислений с интенсивным использованием памяти (машинное обучение, анализ данных и т.д.). Большинство советов, которые я нашел в Интернете, касаются компьютеров с ОЗУ 2-4-8 ГБ, и они рекомендуют в 2 раза увеличить размер раздела подкачки ОЗУ (т.е. 128 ГБ).

Разумно ли сделать раздел подкачки объемом 128 ГБ? какие преимущества я получу, создав огромный раздел подкачки?

Правильно ли я понимаю, что в случае, если у меня заканчивается физическая память:

  1. Если у меня нет свопа, я получаю ошибку «недостаточно памяти»
  2. Если у меня есть своп, некоторые страницы ОЗУ будут скопированы в раздел подкачки, и программа продолжит работу (хотя и медленнее).

Некоторые люди говорят, что делать своп на SSD - плохая идея, так как он имеет ограниченное количество циклов чтения / записи. Насколько быстро с помощью swap будут исчерпаны циклы чтения / записи SSD (насколько я знаю, это около 50000 операций записи в секунду)?

Я использую Linux (Ubuntu 14.04 (Trusty Tahr)).

На данный момент мы собираемся установить своп на 16 ГБ, что должно быть достаточно (например, RedHat предлагает 4 ГБ), а 16 ГБ дискового пространства на самом деле не имеет большого значения.

8 ответов8

35

Вам, вероятно, нужно только небольшое количество свопа. Когда у вас достаточно оперативной памяти для типичного рабочего набора вашего компьютера, что, я уверен, у вас есть, подкачка нужна только для двух вещей:

  1. Вам нужен обмен, чтобы получить информацию, которая, вероятно, никогда не будет доступна из ОЗУ, чтобы освободить больше места для дискового кэша. Многие приложения запускаются при запуске системы и никогда не будут доступны снова. Вы не хотите, чтобы страницы, которые они загрязнили, застряли в ОЗУ навсегда. Таким образом, вам нужно поменять их.

  2. Вам нужен своп, чтобы покрыть ассигнования, которые никогда не будут заполнены. Это пространство просто должно быть доступно, даже если оно не будет использоваться. Без этого система будет вынуждена отказаться от выделения памяти, даже если у нее достаточно свободного физического ОЗУ, поскольку у нее недостаточно хранилища резервных копий для одновременного использования всех ее выделений.

Ни один из них не требует большого количества обмена. 16 ГБ, например, должно быть более чем достаточно. Цель состоит не в том, чтобы позволить вам запускать большие рабочие наборы за счет скорости. Цель состоит в том, чтобы позволить вам эффективно использовать 64 ГБ, и вам не придется забивать его мусором или резервировать для крайних случаев, которые никогда не произойдут.

(Я согласен с Бертом, что 4 ГБ вполне вероятно будет достаточно.)

29

RedHat рекомендует 4 ГБ на машине с 64 ГБ.

Однако обмен размерами - это больше искусство, чем наука. Это зависит от того, для чего машина используется, сколько места на диске и памяти у вас есть, и других факторов. Помните, что вы всегда можете добавить больше свопа позже.

Использование правила физической памяти 2X устарело с объемом памяти, который есть у систем в наши дни. Но запуск с нулевым свопом не рекомендуется, если вы не знаете, что делаете. Рекомендация в 4 ГБ является хорошей отправной точкой.

12

В Linux вам нужно достаточно подкачки, чтобы общего объема доступной виртуальной памяти (RAM + SWAP) хватило для всех процессов, которые вы хотите запустить одновременно, и их максимальной виртуальной площади.

Если у вас меньше свопа, чем этот, или вообще нет, то возникает следующая ситуация: системе не хватает памяти, пытающейся выделить страницу. Но это все еще мягкий сбой, даже если нет подкачки, потому что в системе есть много страниц-жертв, которые можно удалить, чтобы освободить место, а именно: страницы всех отображений памяти с файловой поддержкой, таких как исполняемые файлы. и общие библиотеки!

Поскольку вашей системе требуется все больше и больше места для данных (которые не могут быть выгружены), она будет все более и более эвакуировать исполняемый код (разделяемые библиотеки и исполняемые файлы), что приведет к ужасной переборе, так как рабочий набор обрезается в более плотный набор страницы.

Пространство подкачки смягчает эту проблему, предоставляя место для подмены анонимных (не отображаемых файлов) страниц: страницы, используемые для выделения памяти, так что исполняемый код может оставаться в памяти.

Тем не менее, если вы не часто запускаете задачи, интенсивно использующие память, вы можете избежать выполнения свопинга в большинстве случаев и вручную настроить файл подкачки (вместо выделенного раздела), когда вам это нужно. Чтобы сделать файл подкачки на лету, станьте пользователем root и:

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

Когда вам это больше не нужно:

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

Заметки:

  1. Вам определенно не нужно настраивать как минимум столько же подкачки, сколько у вас есть RAM. Это эмпирическое правило восходит к операционным системам, где оно было жестким требованием из-за способа, которым был разработан обмен.

  2. Есть способы заставить Linux терпеть неудачу, когда нет доступной памяти, а именно, манипулируя значениями этих записей sysctl:

    vm.overcommit_memory
    vm.overcommit_ratio
    
3

Есть еще соображения. Если вам нужно / хотите, чтобы приостановка работала, тогда вам нужен как минимум размер вашей оперативной памяти, а затем и немного. Однако это звучит маловероятно, если вам это нужно, учитывая, что вы, кажется, в основном строите вычислительную рабочую лошадь.

В этом случае, пожалуйста, рассмотрите возможность использования файла подкачки вместо раздела. Вам не нужно беспокоиться о больших размерах, чтобы избавиться от них или добавить их позже, не требуется перераспределение. Нет никакого (заметного) снижения производительности при использовании файла над разделом. Если вам когда-нибудь понадобится это, посмотрите на размер, и это также даст вам хорошие советы.

2

Для рабочей нагрузки, которую вы хотите применить к машине, требуется определенный объем памяти (не забудьте добавить достаточно в уравнение для обработки пиковых нагрузок), и вам необходимо настроить компьютер так, чтобы он был по крайней мере таким.

Современные операционные системы предоставляют виртуальную память как комбинацию физической памяти и пространства подкачки, поэтому, если вам нужно больше памяти, чем доступно машине, вы должны добавить достаточно места подкачки, чтобы заполнить этот пробел. Т.е. если вам нужно максимум 80 ГБ, а на машине есть 64 ГБ, то вам нужно 16 ГБ подкачки.

Обычно установщики операционной системы просят вас создать начальную область подкачки (так как она является самой простой и позволяет устанавливать даже крошечные компьютеры), и было обнаружено, что хорошим правилом для типичных операций Unix является размер виртуальной памяти, который должен быть в три раза больше физической памяти, так что это обычно предлагается. Тем не менее, вы знаете больше о шаблоне использования, так что вы можете изменить его при необходимости.

Нет ничего плохого в том, чтобы работать без пространства подкачки, если нагрузка на память всегда меньше. Linux будет прозрачно использовать любую неиспользуемую память в качестве дискового кэша.

2

Гораздо лучшая идея, чем "много подкачки", - это (ре) организовать свою работу так, чтобы рабочие наборы помещались в память, а затем использовать файловую систему для хранения и извлечения работы, которую вы делаете. Т.е. вместо того, чтобы заставлять ОС угадывать, каковы будут шаблоны использования вашей памяти, используйте то, что вы знаете о своих проблемах, чтобы контролировать шаблоны использования памяти.

Как случайный пример, который актуален для меня этим летом ... При реализации квадратичного сита требуется разметить большой (по-видимому) непрерывный массив (с некоторым сложным алгоритмом, детали которого на самом деле не имеют значения для этого примера). Массив должен быть ~ 100 гига-записей, так что легко в диапазоне 1 ТБ. Я мог бы притвориться, что выделил это, и позволил ОС сделать невероятное количество неэффективных операций подкачки, чтобы получить страницы в ОЗУ и из них для поддержки всех последовательных записей через массив. Вместо того, чтобы делать что-то с головой, я решил выделить гораздо меньший массив, который точно помещается в памяти, а затем повторно использовать этот маленький массив, чтобы итеративно покрыть остальную часть большого массива срезами. Я также удалил ОС, лишил работающий набор служб, заменил оболочку и настроил два уровня распределителей памяти, чтобы сделать все возможное, чтобы максимально увеличить доступное для моего процесса адресное пространство как можно ближе к непрерывному.

SSD может быть быстрым, но это не так быстро, как организация ваших вычислений для выполнения одного и того же набора операций без остановки обмена.

1

Вы будете в порядке даже с 1 ГБ (и, вероятно, меньше) свопа. Мой рабочий компьютер обычно использует не более 140-150 МБ. Для этого достаточно гигабайта.
Если вы не выполняете вычисления задач, для которых требуются наборы данных в сотнях гигабайт и (это важно!) доступ к данным осуществляется более или менее по принципу однократного доступа, и вам никогда не понадобится своп, намного больший, чем этот. Но опять же, простое отображение памяти в файл данных одинаково хорошо работает для этого приложения.

Но больше обмена помогает больше, верно? Больше всего всегда лучше!

Подумайте, как изменится обмен, скажем, на 16 ГБ (или подумайте о 64 ГБ). Если вы никогда не используете эти 16GiB, вы могли бы также не отложить их в первую очередь. Но если вы используете их, что произойдет? Диск по сравнению с основной памятью работает очень медленно. Даже с твердотельным накопителем SATA-600 передача 16 ГБ занимает от 30 до 40 секунд и в 2–4 раза дольше в некоторых других конфигурациях.
Теперь кто-то неизбежно будет возражать, что вы, скорее, просматриваете и выводите дюжину или около того 4-килобайтных страниц, а не 16-гигабайтных за один раз. Хотя это и правда, точка все же остается в силе. Если вам нужно только поменять местами пару страниц, вам не нужен 16-гигабайтный своп, но если вам нужен 16-гигабайтный своп, то вы их тоже перенесете (так или иначе).

Теоретически, 99,9% всех пользователей могут даже использовать машину 64 ГБ (или любую машину 8+ ГиБ) без какой-либо подкачки, и, скорее всего, никогда не заметят, что чего-то не хватает. Однако это не рекомендуется.
Во-первых, это неоптимально, потому что операционная система имеет меньше вариантов того, что она может отбросить, когда у нее заканчивается физическая память. Это может сделать две вещи: заменить что-то, что не используется, или выбросить страницы из буферного кэша. Если у вас нет свопа, он может сделать только одну вещь. Выбрасывать страницы из буферного кеша безопасно, но это может заметно повлиять на производительность.
Во-вторых, частные анонимные сопоставления могут просто потерпеть неудачу, если нет обмена. Обычно этого не происходит, но, в конце концов, когда не хватает физической памяти, чтобы удовлетворить их все, и нет подкачки, операционная система имеет только один из этих вариантов, кроме ...
В-третьих, страшный убийца ООМ может вмешаться. Это означает, что более или менее случайный процесс может быть убит. Нет, спасибо. Это не то, что вы хотите, чтобы происходило.

С учетом вышесказанного, совет, такой как вам нужен обмен X раз, когда объем установленной оперативной памяти исходит от людей, которые повторяют то, что они слышали (и не понимали!) от кого-то, кто повторил что-то, что они услышали (и не поняли!) десятилетия назад.
Правило "используй в 2 раза больше своей оперативной памяти" было простым в запоминании практическим правилом в 1980-х и 1990-х годах, оно никогда не было "золотой истиной" (просто то, что работало нормально для большинства пользователей), и в настоящее время оно не применяется вообще ,

У вас должно быть разумное количество свопа, которое вы можете легко себе позволить (скажем, гигабайт), чтобы ОС могла выводить некоторые устаревшие данные, и поэтому мир не сразу заканчивается, когда вы однажды попросите немного больше памяти. Но это все.

1

Как уже упоминалось, раздел подкачки - хорошая идея, даже если у вас достаточно оперативной памяти. Не стоит помещать его на SSD; частые записи раздела подкачки со временем изнашивают ваш диск.

Если у вас есть запасной порт USB 3.0, я бы предложил использовать флэш-накопитель для вашего подкачки. Существует множество высокоскоростных флеш-накопителей, которые работают так же быстро, как и ваш SSD, но гораздо дешевле - достаточно дешевы, чтобы заменить, если они начнут выходить из строя. Быстрый поиск на Amazon показывает, что есть много приличных 16 ГБ флэш-накопителей USB 3.0 стоимостью менее 20 долларов и даже некоторые 64 ГБ дисков дешевле 60 долларов.

Разбейте всю флешку как пространство подкачки, и у вас будет место подкачки, если вам это нужно, и спокойствие, зная, что многократно записываемая память легко (и дешево) заменяется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .