Нужно ли пространство подкачки, если у меня более чем достаточно оперативной памяти?


91

Из того, что я понимаю, цель раздела подкачки в Linux состоит в том, чтобы освободить некоторую информацию «не так часто доступную» из ОЗУ и переместить ее в определенный раздел на жестком диске (за счет замедления чтения или записи из него). к), по существу, позволяя активным приложениям больше «высокоскоростной памяти».

Это отлично подходит для тех случаев, когда вы работаете на машине с небольшим объемом оперативной памяти и не хотите сталкиваться с проблемами, если у вас закончились. Однако, если в вашей системе 16 ГБ или 32 ГБ ОЗУ и предполагается, что вы не используете базу данных MySQL для StackExchange или не редактируете полнометражный фильм 1080p в Linux, следует ли использовать раздел подкачки?


16
@mikeserv Знаете, мне бы очень хотелось принять эти два письма в качестве ответа только для комедийного эффекта.
IQAndreas

3
@Janis - это стоит много. И вы могли бы легко обойтись без свопа даже на машине с 1 ГБ, если бы реализовали управление звуковой памятью. Своп стоит производительности - когда она у вас есть, ядро ​​неизбежно ее использует. Таким образом, на диске размером 1 ТБ или любого другого размера, создающем раздел подкачки, это приглашение к ядру размещать страницы памяти на диске, а не хранить их в ОЗУ или сбрасывать их целиком. С 16 ГБ типичный пользователь никогда не подойдет, используя все это - у меня есть 24 ГБ ОЗУ с 2 ГБ памяти и 10 ГБ кэш-памяти (потому что я использовал торрент /tmp) после 3 дней безотказной работы.
mikeserv

5
@mikeserv, ты не прав, я боюсь; Я постоянно наблюдаю за отображаемыми метриками дисков. Пока есть свободная память, подкачка не использовалась, только когда память была заполнена, подкачка началась. Я думаю, это зависит от того, как вы используете свой компьютер; настольная система, которая отключается каждый вечер, редко сталкивалась с проблемами с памятью, хотя моя система работала несколько месяцев. Да, производительность подкачки снижает производительность, но если не осталось места в оперативной памяти, ваша система может продолжать работать. Какой вариант у вас есть? Может быть, вы можете уточнить аргумент управления памятью. Я использую свою систему Linux как предварительно настроенную.
Янис

40
@mikeserv как вы разместили комментарий короче 15 символов?
user253751

Ответы:


98

Да.

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

Причина в том, что подкачка полезна не только тогда, когда ваши приложения потребляют больше памяти, чем физической памяти (фактически, в этом случае подкачка не очень полезна вообще, потому что она серьезно влияет на производительность). В настоящее время основным стимулом для обмена является не магическое превращение 16 ГБ ОЗУ в 32 ГБ, а более эффективное использование установленной и доступной ОЗУ.

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

Всякий раз, когда вы запрашиваете новую страницу памяти из операционной системы, диспетчер памяти должен принять взвешенное решение:

  1. Очистить страницу из буфера кеша
  2. Очистить страницу от сопоставления (фактически так же, как # 1, в большинстве систем)
  3. Переместить страницу, к которой долгое время не обращались - желательно никогда - чтобы поменяться (это может даже произойти заранее, не обязательно в самый последний момент)
  4. Убей свой процесс или убей случайный процесс (OOM)
  5. Ядро паники

Варианты № 4 и № 5 крайне нежелательны и произойдут только в том случае, если у операционной системы нет другого выбора. Опции # 1 и # 2 означают, что вы выбрасываете то, что вам, возможно, скоро понадобится снова. Это негативно влияет на производительность.

Вариант № 3 означает, что вы перемещаете то, что вам (вероятно) не нужно в ближайшее время, на медленное хранилище. Это нормально, потому что теперь то, что вам нужно, может использовать быструю оперативную память.

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

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

[РЕДАКТИРОВАТЬ]

Внимательный читатель mmap справочной страницы , в частности описание MAP_NORESERVE, заметит еще одну вескую причину, по которой своп является в некоторой степени необходимостью даже в системе с «достаточным количеством» физической памяти:

«Когда пространство подкачки не зарезервировано, можно получить SIGSEGV при записи, если физическая память недоступна».

- Подожди, что это значит?

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

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

[/РЕДАКТИРОВАТЬ]

Тем не менее, традиционная рекомендация сделать своп в два раза больше оперативной памяти бессмысленна. Хотя дисковое пространство дешевое, не имеет смысла назначать такой большой объем подкачки. Потеря чего-то дешевого все еще расточительна, и вы абсолютно не хотите постоянно менять рабочие наборы размером в несколько сотен мегабайт (или больше).

Не существует единого «правильного» размера свопа («правильных» размеров столько же, сколько пользователей и мнений). Я обычно назначаю фиксированные 512MiB, независимо от объема оперативной памяти, что очень хорошо работает для меня. Причина в том, что 512MiB - это то, что вы всегда можете себе позволить в наше время, даже на маленьком диске. С другой стороны, добавление нескольких гигабайт подкачки не лучше. Вы не собираетесь их использовать, за исключением случаев, когда что-то идет серьезно.

Даже на SSD подкачка на несколько порядков медленнее, чем ОЗУ (из-за пропускной способности шины и задержки), и хотя вполне приемлемо переместить что-то для подкачки, что, вероятно, не понадобится снова (т.е. вы, скорее всего, не будете поменяйте местами снова, чтобы ваш пул доступных страниц был эффективно расширен бесплатно (если вам действительно нужно значительное количество свопа (то есть у вас есть приложение, которое использует, например, набор данных 50 ГБ)), вы в значительной степени потеряны.

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


7
Совершенно неверно: ядру может быть полезно не использовать диск, особенно если вы настроили OOM в соответствии со своими спецификациями. Если OOM Killer настроен на обработку вашей очистки, то это выгодно
mikeserv

22
Какая разница между наличием 8 ГБ ОЗУ и 8 ГБ подкачки и 16 ГБ ОЗУ и без подкачки? Если ваш компьютер решит, что ему нужно 16,001 ГБ памяти, не начнет ли он так же производить чистку / уничтожение (но производительность начнет снижаться до того, как это начнется)?
Ник Т

5
@NickT: своп не столько для оперативной памяти, сколько для красного флага, который скоро что-то убьет. Мне нравится, когда перед убийством стоит красный флаг, а не случайный процесс, исчезающий на моих глазах.
Mooing Duck

10
-1 этот ответ не имеет смысла. Почему, черт возьми, более медленная память (подкачка) имеет лучшую производительность, чем та же сумма более быстрой памяти (ОЗУ)? в какой-то момент вы должны признать, что достаточно оперативной памяти означает, что обмен не требуется ..
Mehrdad

14
@Mehrdad: Это, безусловно, имеет смысл. Медленная память (своп) улучшает производительность, поскольку «медленная» не имеет значения для вещей, к которым вы обращаетесь редко или никогда. Swap эффективно увеличивает объем памяти, доступной для «горячих» данных, перемещая «холодные» данные. Демоны, которые выполняют что-то только один раз в час или память, выделенная модулем ядра, который загружается по умолчанию, но никогда не используется, является примером этого. Вы можете поменять их или вместо этого удалить страницы из кеша. Какая из них лучше?
Деймон

50

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

В эти дни я оцениваю их в 1-1,5 раза больше памяти. 2 раза память раньше была эмпирическим правилом. Диск подкачки «дешевый» в том смысле, что его не нужно резервировать или защищать.

Если вам не хватает памяти, то пространство подкачки дает вам немного времени и подушки для решения проблемы.

Поймите, что такие вещи, как / tmp, могут находиться в пространстве подкачки.

Область подкачки может содержать частичный дамп ядра, чтобы его можно было восстановить при следующей перезагрузке. Это может быть полезно для какой-то неотложной ситуации в будущем, к которой вы призваны.


16
+1. Наличие свопа означает разницу между ухудшением производительности при нехватке памяти и резким сбоем.
Davidmh

6
@mikeserv, независимо от того, как вы его настроите, если ваша программа попытается выделить больше памяти, чем доступно, что-то произойдет сбой, или ОС начнет их убивать.
Davidmh

6
@Davidmh: По этой причине ваш файл подкачки должен быть бесконечно большим, иначе ваши программы все равно будут аварийно завершать работу, когда они исчерпывают файл подкачки.
Мердад

6
@ Mehrdad, но это также дороже. Учитывая, что у вас есть X ГБ ОЗУ, поскольку это столько, сколько вы можете себе позволить, это строго хуже, чем наличие X ГБ ОЗУ и Y подкачки, для некоторых разумных значений Y (которые будут зависеть от вашего использования и размера твое HD).
Davidmh

9
«Ваше пространство подкачки дает вам немного времени и подушки для решения проблемы» - это также означает, что мне придется гораздо дольше сидеть перед не отвечающей на запросы машиной, пока утечка памяти не «сама себя решит».
Рафаэль

23

Может быть:

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

Начните с активного раздела подкачки того, что вы считаете достаточным размером.

Затем откройте терминал в рабочей области и введите команду, free -hs 1которая будет сообщать об использовании раз в секунду.

При желании переключиться на другие рабочие пространства.

Делайте все, что вы, вероятно, когда-либо делаете, а затем еще немного. Запускайте все свои обычные приложения одновременно, просматривайте несколько вкладок и отчаянно пытайтесь дать системе реальную тренировку для вас, это может означать перекодирование 1/2 дюжины видео во время выполнения операции компиляции и проверки вашей электронной почты или чего-либо еще. Давайте посмотрим правде в глаза, это все о том, как вы используете свою систему.

Когда вы чувствуете, что ваша система находится под высокой нагрузкой (или такой высокой, какой вы когда-либо могли бы получить, а затем еще немного), посмотрите на терминал и изучите результаты. или, что еще лучше, перенаправьте вывод в файл, добавив >output.txtв команду, чтобы вы могли проверить весь прогон. Если используемый своп никогда не превышает Mem free, вам не нужен своп. Если это так, вы делаете. free.png

Мне не нужен своп. Может быть, вы делаете. Почему бы не узнать?

Что касается подмены размеров, эмпирические правила обычно переоцениваются, так как это вопрос, основанный на использовании.


2
Итак, вы говорите, что подкачка используется только тогда, когда вашей системе это абсолютно необходимо? В каком случае есть ли штраф за включение свопинга - на всякий случай? Другие комментарии, кажется, предполагают, что даже наличие свопа может отрицательно сказаться на производительности?
MrWhite

3
@ w3d Нет, я не говорю это. Как вы можете видеть из моего вывода выше, подкачка используется, даже если не требуется. это можно отрегулировать с учетом коэффициента перестановки. Я говорю о необходимости иметь своп или нет.
Старейшина Гик

Можно ли сценарий это , чтобы увеличить своп вверх в любое время swapпереходит free?
JFA

@JFA Я не видел, чтобы это было сделано. Лично у меня возникают трудности с концепцией резервирования неопределенного количества пространства подкачки для этой цели. Теоретически все возможно. Это фаза реализации, которая становится интересной.
Старейшина Гик

17

ПРИМЕЧАНИЕ: это случилось со мной, в конкретной, необычной ситуации. Если вы устраняете проблему, это может быть полезно. Я не имею в виду, что ВСЕ машины ДОЛЖНЫ иметь обмен.

МОЖЕТ БЫТЬ!

В прошлом у меня возникали проблемы с «устройством», которое я построил, работающим под управлением Linux, работающим на компактном флэш-устройстве, я не хотел носить CF с использованием свопинга, и для приложения было достаточно памяти.

Большинство этих устройств работало нормально, но на особенно загруженной коробке я столкнулся с проблемой:

ФРАГМЕНТАЦИЯ ПАМЯТИ

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

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

Проверьте / proc / buddyinfo - мой прямо сейчас выглядит так:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

Числа представляют блоки разных размеров; каждый размер составляет половину размера следующего блока, от 4 МБ блоков слева до 4 КБ справа (то есть 4 МБ, 2 МБ, 1 МБ и т. д.). У недавно загруженной машины должно быть все блоки слева, очень мало справа (= не фрагментировано). Помните также, что один и тот же объем памяти (например, 4 МБ) будет представлен в виде разных чисел в столбцах - 1 блок в крайнем левом столбце, 1024 в крайнем правом столбце.

Память выделяется из пула, который находится как можно правее; например, если вашей программе требуется 12 КБ памяти (за один раз), она извлечет ее из столбца 16 КБ; остаток появится в столбце 4 КБ. Если блоков по 16 КБ нет, то они будут извлечены из блоков по 32 КБ, в результате чего останутся 16 КБ и 4 КБ, и так далее.

Если нет достаточно больших блоков памяти, И у вас есть пространство подкачки, то, например, если вы хотите 16 КБ памяти, он найдет наименее используемый блок 16 КБ (который может, например, содержать используемый блок 4 КБ, доступный блок 4 КБ, и еще 2 использованных блока по 4 КБ), перемещая ИСПОЛЬЗУЕМЫЕ части только для обмена, и выделяя освобожденную память новому приложению.

В коробке, которая рухнула, у меня были сотни тысяч блоков по 4 и 8 Кбайт, и больше ничего.

Как далеко, как я могу сказать (на разбитых машинах!) Ядро будет перемещаться из памяти в своп и своп в память, но никогда не будет перемещаться из памяти в память.


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

2
Это лучшая причина, которую я когда-либо читал в пользу использования раздела подкачки. Я попытался выполнить быстрый поиск и не нашел упоминаний об этом; мне интересно, почему эта функция не так часто документируется.
До 마 SE

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

1
Я не сомневаюсь в вашем опыте работы с флеш-устройством, я просто не уверен, что приведенный вами случай единственного использования приравнивается к вероятности необходимости подкачки, и я не уверен, что фрагментация памяти связана с перестановкой или нет. Это поднимает интересный вопрос, который можно легко проверить и доказать или опровергнуть.
Старейшина Гик

1
Дополнительный вопрос . Что вы подразумеваете под «фрагментацией памяти»? MMU не заботится о том, являются ли физические страницы, используемые для последовательных страниц в некотором виртуальном адресном пространстве, последовательными или нет. Физические страницы фрагментированы, но это не имеет значения (если речь идет об обычной памяти приложений на физическом компьютере с одним кластером, а не о страницах памяти, используемых периферийным устройством или гипервизором). Когда программа запрашивает 16 КБ, она получает четыре страницы, которые могут быть или не быть близко друг к другу в физической памяти.
Жиль

15

Раздел подкачки имеет большое значение, помимо того, что он просто выступает в роли дополнительного ОЗУ, когда у вас заканчивается.

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

Кроме того, Linux использует оптимистическую стратегию выделения памяти, с помощью которой она позволяет номинально распределять страницы, даже если не уверена, что у них есть реальная память для их заполнения. Это более эффективно, чем правильная проверка и отображение каждого распределения, и обычно не вызывает проблем. Однако эвристика, которую ядро ​​использует для определения целесообразности выделения ресурсов, включает в себя уровень свопа, доступный в системе, поэтому распределения могут быть быстрее, если в системе много свопов, даже если они мало используются.

В совокупности эти факторы заставляют меня поверить в то, что лучше иметь какой-то своп почти на каждой нормальной системе, однако для больших размеров памяти я игнорирую правило ram * 2 и просто ограничиваю свой своп 4-8 ГБ (в зависимости от размера диска ).


9
Даже 4 ГБ слишком велико для настольного компьютера. Я бы предпочел, чтобы OOM killer активировался, прежде чем ждать такого большого количества свопов, если что-то пойдет не так. (Если я когда-нибудь столкнусь с делом, где мне нужно больше, я смогу выполнить dd и mkswap файл подкачки, прежде чем запускать любую огромную работу, требующую больше виртуальной памяти, чем на моей машине. ...)
Питер Кордес

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

1
забавная история: только сегодня, на моем ноутбуке с 4 ГБ оперативной памяти, подкачкой 0.5G (SSD), firefox вызвал убийцу OOM (который выбрал firefox). У меня такого раньше не было. (Хотя я использовал свой ноутбук больше, чем обычно). Практически ничего не было запущено (просто gnome-терминал в xfce). Так что я думаю, что я в порядке с этим, так как Firefox должен знать лучше, чем связывать так много оперативной памяти. Я видел, как кто-то недавно сказал: «Существуют веб-браузеры для стресс-тестирования подсистемы виртуальной памяти», или что-то в этом роде. Firefox довольно плохо справляется с освобождением кэшей для вкладок, которые не использовались в течение нескольких дней и т. Д.
Питер Кордес

3
Один из случаев, когда Linux рассматривает доступное пространство подкачки, - это когда большой процесс пытается запустить дочерний элемент: системные вызовы fork () + exec () начинаются примерно с дублирования выделения родительского элемента - ядро ​​не может гарантировать, что новый дочерний элемент будет меньше чем родитель. Пространство подкачки обычно не используется, но если оно не доступно, fork () может завершиться ошибкой. Типичным примером на клиенте является браузер, запускающий плагин, или на сервере, когда большой контейнер приложения вызывает вспомогательную программу. Для решения проблемы обычно достаточно 1/2 или 1 ГБ свопа. Google «Java Exec не может выделить память»
Джеймс

13

Вы никогда не должны иметь размер свопа больше, чем максимальный размер, который вы могли бы вынести, ожидая, когда ядро ​​поменяется местами. в противном случае вы просто создаете новый режим отказа для своей системы (который становится непоправимо заваленным при замене). Обратите внимание, что, несмотря на то, что современные диски способны передавать данные порядка ГБ / с, Linux обычно может перемещать своп только со скоростью, превышающей сотни кБ или, в лучшем случае, несколько МБ в секунду. Такой огромный обмен может сделать вашу систему непригодной для использования в течение нескольких минут, часов или даже дней.

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

Если у вас недостаточно физической памяти, вам нужно оценить, можете ли вы терпеть серьезное замедление из-за сильной перестановки. Если это так, может иметь смысл до 1-2 ГБ подкачки , и, возможно, до 4 ГБ, если у вас очень быстрые диски. Но более того, это только ухудшит режимы сбоя в вашей системе, и вам следует подумать о том, чтобы просто покупать больше оперативной памяти.


2
Я думаю, что это лучший ответ. Если у вас слишком много места подкачки, это может привести к тому, что машина полностью перестанет отвечать на запросы из-за перестановки. Это означает, что вы не можете убить оскорбительный процесс. Если вы уменьшите пространство подкачки, убийца OOM автоматически сделает вашу работу за вас. Аргументы в других ответах о кешировании файлового буфера совершенно неубедительны. Вы должны иметь своп, чтобы ядро ​​могло перемещать файловые буферы в своп ... который находится на диске? Пожалуйста.
Тимммм

Единственный аргумент против пространства подкачки, который я могу найти, это: «какая-то программа утечка памяти». А также? Если убийца ООМ убивает важную вещь, которую вы не спасли, вы фактически потеряли свою работу. Это означает, что этот аргумент становится совершенно неактуальным, я могу просто принудительно отключить свою машину, чтобы получить точно такой же эффект, сохраняя при этом большое пространство подкачки для задач с низким приоритетом, которые используют много памяти и часто меняются местами. Если ваша машина застревает в таком состоянии, это ваша вина. Единственный раз, когда это случилось со мной, это когда я сам написал программу для заполнения всей рабочей памяти.
Сахсахэ

11

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


6

Нет универсального и четкого ответа, потому что это зависит от задачи, которую вы собираетесь выполнить. Если вы собираетесь запускать серверы БД, HTTP, виртуализации или кэширования, вы никогда не должны разрешать какой-либо обмен, независимо от количества оперативной памяти. Если у вас есть настольный компьютер или хост со смешанными задачами, и у вас есть 16 ГБ быстрой оперативной памяти - посмотрите здесь: zRam


zRam - отличный выбор Я использовал его в сочетании с крошечными системами флэш-накопителей для хорошего эффекта.
Старейшина Гик

1
@ElderGeek Я также использовал его в бездисковой среде, например, при сетевой загрузке. Отличная работа, но есть некоторые предостережения: во-первых, вам нужно не просто больше оперативной памяти, вам нужен быстрый. Медленные и дешевые оперативные модули, которые, вероятно, подойдут вам в обычном классическом случае, могут вызвать проблемы. Передняя шина ЦП также должна быть принята во внимание: даже в том случае, если вы можете использовать более медленную частоту ЦП, но более быструю частоту FSB, вы значительно улучшите свою производительность. Вторым вопросом является количество разделов подкачки zRam. Попробуйте числа от 1 до числа ядер вашего процессора. Не используйте на одноядерных системах!
Алексей Веснин

Хорошие действительные баллы всем. Поскольку я увлечен производительностью и всегда проектирую и строю свои собственные системы, меня лично не преследуют такие проблемы
старейшина Гик

@ ElderGeek меня тоже :) приятно познакомиться! Также я заметил одну странную вещь в поведении zRam. Он появляется и исчезает в разных версиях и конфигурациях ядра, но хорошо воспроизводится в ядрах HZ 100 и 1000. zRam отлично работает для 1,2,4 - но не для большего количества разделов. Даже на 8 и 16 физических ядрах на высшем оборудовании для почти бездействующих задач. Так что имейте это в виду, играя с твиками! Привет из России!
Алексей Веснин

Я не согласен с "если вы запускаете БД, ... вы никогда не должны включать какой-либо своп, независимо от того, какое у вас есть крепление RAM". Перестановка обычно предпочтительнее, чем случайные процессы убийства OOM. Да, у вас должно быть достаточно памяти для приложений, которые вы запускаете, и да, использование большого объема подкачки может замедлить работу вашей системы. Я завидую тебе жить в идеальном мире.
AMADANON Inc.

5

Невозможно определить, нужно ли вам пространство подкачки или нет, единственный известный нам параметр - это объем установленной оперативной памяти.

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

  • Случай 1: Если у вас нет пространства подкачки и вам не хватает оперативной памяти, ядро ​​Linux выберет один или несколько процессов, которые оно считает хорошими кандидатами, и уничтожит их.

  • Случай 2: Если у вас есть место подкачки и не хватает оперативной памяти, ядро ​​выберет менее использованные страницы памяти и поместит их в область подкачки для освобождения оперативной памяти. Это замедлит работу системы, но иначе ваши приложения не будут затронуты.

Я всегда предпочитаю случай 2, потому что мне неудобно терять части или всю мою работу, потому что ядро ​​считает, что мои приложения стоит убивать. Более того, при текущем размере среднего диска в диапазоне TB резервирование нескольких процентов для подкачки не должно быть проблемой.


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

1
@ Марк, это верный момент. Я все еще стараюсь избегать делегирования алгоритму «сначала стрелять», а потом подойти.
Jlliagre

2
Случай 2 действителен, только если у вас есть что-то, что предупреждает вас об этой ситуации, и у вас есть достаточно времени, чтобы вручную «сделать что-то», прежде чем система исчерпает своп. Но вы могли бы вместо этого контролировать процент использования оперативной памяти для тех же результатов.
Тотор

1
Исходя из ваших рассуждений, мониторинг использования оперативной памяти является достаточно .
Тотор

1
@Totor Я предпочитаю не просыпаться среди ночи моим приложением для мониторинга ноутбуков, потому что я запустил пакет, который обрабатывает кучу файлов и исчерпал ОЗУ. Я предпочитаю, чтобы работа была выполнена, даже если она занимает пару часов больше из-за недостаточного объема ОЗУ, чем из-за прерывания всей работы.
Jlliagre

3

Мое правило применять своп в любой системе - иметь ответ на этот вопрос:

  • Какова цель системы?
  • Сколько памяти будут использовать приложения?
  • Это критическая система?
  • Нужно ли временное дисковое пространство для передачи файлов?
  • Прогнозируемая скорость роста приложений?

Когда я получаю ответ на эту информацию, я соответствующим образом измеряю систему. В предыдущие годы я использовал эмпирическое правило от Sun Microsystem. До 16 ГБ вдвое больше оперативной памяти для SWAP, от 16 ГБ до такого же объема. Но с другой стороны, если у вас достаточно оперативной памяти, а ваши приложения принудительно не используют SWAP, вы можете опустить swap. Если вам нужно просто поставить новый диск или лун и настроить SWAP. Правило Sun применялось главным образом потому, что на Solaris в случае «паники ядра» память была бы полностью выгружена для обмена для дальнейшего анализа.


1

Обмен необходим, если у вас недостаточно оперативной памяти для запуска всех ваших программ.

Вы говорите, что не делаете ничего, что требует много оперативной памяти. Итак, у вас достаточно оперативной памяти.

Тогда вам не нужно пространство подкачки.

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


Использование свопа может помочь избежать катастрофического сбоя, но никогда не улучшит предварительную производительность, так же как парашют не ускорит Ferrari. ;-)
Старейшина Гик

@ElderGeek Это может быть крайний случай, но своп может помочь. Временами у вас достаточно ОЗУ для всего, но неиспользуемые программы можно заменить, чтобы лучше использовать ОЗУ (например, какой-нибудь полезный дисковый кеш). Я часто видел это в конце 90-х. Иногда я вижу это сейчас, когда у меня есть <1 ГБ свободной оперативной памяти (включая дисковый кеш), без необходимости подкачки.
jbo5112

@ jbo5112 Я не буду полностью исключать такую ​​возможность, если вы так говорите, мой опыт показал обратное. Это не слишком удивительно, так как это тот случай, когда система используется больше, чем жесткое и быстрое правило (к которому, похоже, все стремятся).
Старейшина Гик

@ElderGeek Я могу видеть это только сейчас, потому что моим дискам уже десять лет, и они отчаянно нуждаются в кеше. Обычно существует дополнительная проблема слишком большой загрузки подкачки для почти любого случая, из-за которой пространство подкачки используется слишком агрессивно. Снижение значения с 60 до 10 представляется обычной рекомендацией. Вы можете пойти еще ниже, но в какой-то момент вы сбросите слишком много дискового кэша, что вызовет много дополнительных операций ввода-вывода при замене.
jbo5112

@ jbo5112 Хороший вопрос. Это всегда баланс между различными подсистемами. Я помню, как в те времена, когда я настраивал жесткие диски, например, чередование жестких дисков и частоту обновления ОЗУ, выжимал максимальную производительность из систем 80286 с накопителями Seagate ST225 и ST238. Мы всегда должны подходить к каждому вопросу индивидуально, чтобы выжать максимальную производительность и надежность. Поздравляем Кстати! В прошлый раз, когда мне удалось выжать из диска десятилетие, это был Micropolis с общим объемом 600 МБ.
Старейшина Гик

0

Краткий ответ:

Да, вам всегда нужен своп, просто в маловероятном случае, когда приложение даже не отображает память, а отображает виртуальную память напрямую.

Установите свой файл подкачки на:

  • RAM+round(sqrt(RAM)) если вы используете спящий режим
  • round(sqrt(RAM)) если ты не

Установите swappinessна 10 на рабочем столе, но не на сервере!

Длинный ответ:

В прошлом:

Эмпирическое правило, используемое в течение последних 25 лет, было минимум 1xRAM и максимум 2xRAM, так что это то, что вы увидите в кавычках все время.

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

Максимум был установлен в то время из-за уменьшения отдачи: слишком медленно менять объем памяти, поскольку доступ к жестким дискам в 1000 раз медленнее, чем объем оперативной памяти: хорошо в чрезвычайной ситуации, но не очень хорошо для повседневного использования! В то время, когда вам не хватило места подкачки, пришло время добавить больше оперативной памяти! (что все еще верно сегодня).

В настоящее время:

  1. Если вы не используете спящий режим и ваша память превышает 1GByte новое правило заключается в том , round(sqrt(RAM))где RAM, очевидно , ваш размер ОЗУ в ГБ.

  2. Если вы используете спящий режим, вам нужно иметь возможность поменять весь объем ОЗУ + уже перенесенную ОЗУ на диск, поэтому формула будет выглядеть так: RAM+round(sqrt(RAM))

  3. Правило уменьшения отдачи остается в силе и сегодня для максимума, но если вы не протестируете свое фактическое использование, использование 2xRAM - это просто трата дискового пространства , поэтому не используйте максимум, если у вас не заканчивается пространство подкачки с использованием других методологий .

Все это вместе дает следующую таблицу: (последние 3 столбца обозначают пространство подкачки)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

Выше просто эмпирическое правило; это не закон гравитации!
Вы можете нарушить это правило (в отличие от закона гравитации), если ваш конкретный вариант использования отличается!

Совет для профессионалов: всегда выделяйте SWAP в начале жесткого диска, поскольку головки должны меньше перемещаться внутри диска.
Да: на SSD больше не имеет значения, где вы располагаете область подкачки, поскольку они используют квантовое туннелирование вместо движущихся головок, а современные SSD используют все свои ячейки памяти (даже нераспределенное пространство) для предотвращения квантовой деградации.

Как проверить, отличается ли ваше использование swap от «общего» правила:

Просто выполните:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

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

Если вы используете больше, чем несколько КБ: измените размер больше, чем минимум, в противном случае, не беспокойтесь ...

Если вы находитесь на сервере, прекратите чтение сейчас: все готово!


Если вы используете клиент для настольного компьютера / ноутбука (не сервер), вы хотите, чтобы ваш графический интерфейс был максимально отзывчивым и менялся только тогда, когда это действительно необходимо . Ubuntu был оптимизирован для ранней замены для использования на сервере, но на вашем клиенте вы хотите, чтобы это огромное необработанное 250-мегапиксельное изображение gimpбыло быстрым , поэтому если вы установите swappiness10, то ядро ​​не будет переключаться слишком рано, при этом гарантируя, что это не произойдет. поменять слишком поздно:

sudo nano /etc/sysctl.conf

и добавить:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

в конец файла сохраните файл ( Ctrl+ XY+ Enterв nano) и выполните:

sysctl --system

чтобы перезагрузить параметр или просто ради старости, воспользуйтесь подходом Window $ и перезагрузите компьютер ... :-)


-1

Компромиссный ответ: это зависит от значения слова «должен».

Вам нужен раздел подкачки в том смысле, что что-то плохое случится, если у вас его нет в описанных вами условиях работы? Нет .

Это мудрое , чтобы иметь раздел подкачки только в случае , если вы случайно нерест армии свиной памяти , так у вас есть шанс , чтобы убить их перед ОЫМИ киллерами ног в? Да.

Если ваша физическая ОЗУ «значительно» превышает объем используемой памяти для всех программ, которые вы будете запускать одновременно, то не будет никакого выигрыша в производительности при использовании свопинга. Если оно превышает, но не «значительно», производительность может быть полезной, если ОС может выгрузить редко используемую память, чтобы сохранить в памяти более часто используемые файлы данных.

В целом, это здорово, что у вас 16 ГБ ОЗУ. Но если у вас также есть диск объемом 1 ТБ, не можете ли вы зарезервировать 16 ГБ для его замены? Это всего лишь 1,5% диска.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.