Является ли своп анахронизмом?

43

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

Мой аргумент примерно такой (при условии отсутствия глобального ограничения или изменения настроек OOM):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

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

Я не могу представить себе много ситуаций (в некоторых, но не многих), когда вы бы приостановили запущенный процесс, и он мог бы поменяться местами, чтобы освободить место для других вещей, но вы все равно потеряли бы свои сокеты, если бы сделали это, поэтому core-dump через gcc или копирование памяти вручную будет функционально эквивалентным.

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

У каких-нибудь юникс-бород есть какие-то веские причины, чтобы продолжать обмениваться?

ОБНОВЛЕНИЕ ответов && анализ:

  • ПОДТВЕРЖДЕНЫ? - fork () требует того же объема памяти для дочернего процесса, что и родительский

    Modern fork () - это копирование при записи для детей в POSIX (в целом), но особенно для Linux и FreeBSD , и я предполагаю OSX путем экстраполяции. Я считаю эту часть анахроничного багажа, который своп несет с собой.

    Любопытно, что в этой статье о Solaris утверждается, что, хотя Solaris использует Copy-on-Write с fork (), вы должны иметь по крайней мере 2x (!) Размера родительского процесса в свободной виртуальной памяти, чтобы fork () не сгорела в средний. Хотя элемент Solaris несколько опровергает аргумент о том, что своп является анахронизмом - я думаю, что достаточно операционных систем правильно реализуют CoW таким образом, что важнее развеять миф, чем пометить его как дополнительное оправдание свопа. Поскольку. Давайте смотреть правде в глаза. На данный момент люди, которые на самом деле используют Solaris, вероятно, просто парни из Oracle. Без обид Солярис!

  • ПОДТВЕРЖДЕНО - файлы tmpfs / ramfs могут быть заменены для удобства при заполнении tmpfs / ramfs

    Не используйте безлимитные tmpfs / ramfs! Всегда явно определяйте количество оперативной памяти, которое вы хотите использовать tmpfs / ramfs.

  • УДОВЛЕТВОРЕННЫЙ - Сделайте небольшой обмен 'на всякий случай'

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

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

  • Разорен! - На Solaris , обмен является важным для нескольких причин

    tmpfs - состояния Количество свободного места, доступного для tmpfs, зависит от количества нераспределенного пространства подкачки в системе. Размер файловой системы tmpfs увеличивается, чтобы вместить записанные в нее файлы, но для активных пользователей tmpfs есть некоторые компромиссы. Tmpfs совместно использует ресурсы с сегментами данных и стека выполняемых программ. Это может повлиять на выполнение очень больших программ, если файловые системы tmpfs близки к максимально допустимому размеру. Tmpfs может свободно выделять все, кроме 4 МБ, пространства подкачки системы.

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

    Я не уверен, означает ли это, что максимальная виртуальная карта, которую вы можете создать, это ram + swap , или если вы все еще можете сделать что-то вроде mmap () файл больше, чем ram, и полагаться на ленивую инициализацию mmap (). Пока вы Скорее всего, в наши дни можно запустить Solaris без подкачки, похоже, он менее дружелюбен, чем другие операционные системы POSIXy.

  • Разорен! Похоже, что популярные инструменты гибернации в Linux полагаются на своп

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

synthesizerpatel
источник
У меня не так много бороды * x (некоторые волосы еще;), но мои 2 цента были бы таковы, что наличие «небольшого количества» свопа дало бы вашей системе некоторую надежность. Вместо того, чтобы напрямую использовать OOM, вы бы вместо этого переключились, если немного превысили пределы вашей системы. Несомненно, если действительно выходить за пределы вашей системы, ваша система в конечном итоге потерпит крах / остановка / уничтожение самой себя / чего бы вы ни представляли. Так что давайте немного поиграем;)
Ouki
1
Фактически, функция fork () верна, если вы устанавливаете свою систему так, чтобы она никогда не перегружала ОЗУ (это не значение по умолчанию). Теперь, зачем вам эта настройка, я понятия не имею. Это не полезно для обработки в реальном времени.
Джошуа
@Jushua: перегрузка памяти может быть не по умолчанию или даже невозможна в зависимости от операционной системы.
Jlliagre
У меня есть сервер NAS с 8 ГБ оперативной памяти, он будет работать до 2 виртуальных машин. Я не ставил своп. Если он начинает сильно меняться, то все равно он уже мертв. Так что это прекрасно поддерживает ваш аргумент. С другой стороны, я все еще использую свой ржавый рабочий стол с ограниченным объемом 1 ГБ ОЗУ, и там у меня есть своп для обработки разреженной памяти. Это немного замедляет работу, но помогает мне открывать Firefox и другие приложения одновременно.
Гюйгенс,
Я нахожу, что OOM killer запускает слишком поздно, только после того, как все кэши были очищены и система стала вялой. Чтобы сохранить мою систему быстрой, я использую earlyoom или nohang для выполнения той же работы, но раньше! Может использоваться со свопом или без него.
Joeytwiddle

Ответы:

28

Не путайте () обмен (как область диска) и (к) обмен (как способ перемещения страниц памяти из ОЗУ на диск и обратно).

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

В системах, таких как Linux, с чрезмерной загрузкой памяти, т. Е. Которые позволяют процессам выделять больше памяти, чем доступно, нехватка оперативной памяти без достаточного количества подкачки для обработки ситуации вызовет убийцу OOM. Вы должны доверять алгоритму, используемому для выбора «правильного» процесса для уничтожения, и принять один или несколько ваших процессов для уничтожения без возможности правильно завершить работу. Вот известная аналогия, которая объясняет, почему убийца OOM вообще не может быть хорошей идеей.

В таких системах, как Solaris, которые не перегружают память, т. Е. Обеспечивают постоянное резервирование памяти виртуальной памятью, будь то в ОЗУ или на диске, наличие достаточной области подкачки абсолютно необходимо, в противном случае потенциально значительная часть ОЗУ будет потрачены впустую.

jlliagre
источник
1
Вы уверены, что точка зрения о Солярисе все еще верна? blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts заявляет: Виртуальная память сегодня состоит из общего объема физической памяти и пространства подкачки на диске. Solaris НЕ требует настройки пространства подкачки. Если вы выберете эту опцию, после заполнения ОЗУ вы не сможете запускать новые процессы. Я думаю, я понимаю, в чем ваша точка зрения - если вы хотите воспроизвести что-то большее, чем физический баран, без обмена вы не могли бы? (Независимо от того, что mmap является ленивым инициализатором).
синтезаторпатель
5
Да, я уверен, что мое мнение о Солярисе все еще верно. Даже если ваша цитата Джима Лорана верна, т. Е. Solaris не требует подкачки, отсутствие свопа означает, что все резервирование памяти (т.е. malloc) должно быть поддержано ОЗУ, даже если часть выделенной памяти не используется. Это не относится к большим mmap или tmpfs, хотя tmpfs также является причиной, по которой вы можете захотеть обменяться с Solaris (и Linux тоже).
Jlliagre
1
Обновление для Linux: перегрузка может быть отключена, алгоритм OOM может быть изменен, вы даже можете иметь свой собственный обработчик OOM с cgroups.
Петер
1
@peterph Отключение чрезмерной загрузки в Linux делает своп еще менее анахронизмом. Если вы не преувеличиваете, вы должны убедиться, что у вас есть достаточно большая область подкачки для резервирования всех резервирований.
Jlliagre
1
Виртуальная память, зарезервированная вилкой, зависит от размера программы, которая ее выполняет. Допустим, у вас есть виртуальная машина Java, использующая 2 ГБ разветвления памяти, ей временно потребуется еще 2 ГБ. Если это произойдет, когда у вас будет доступно 2 ГБ или одновременно несколько раз, один или несколько разветвлений завершатся неудачно. Это обычная ситуация с операционными системами без чрезмерной фиксации, а также с Linux, когда отключена избыточная загрузка. Это можно легко исправить, если иметь достаточно большую область подкачки, что, по-моему, является лучшим решением, чем чрезмерная загрузка памяти.
Jlliagre
3

Я знаю одну причину, чтобы продолжать обмениваться. У меня есть приложение, которое занимает столько памяти, сколько я могу позволить себе настроить для моей системы. Он использует Hadoop, который в одной части обработки выполняет fork и exec для запуска одной команды unix (я думаю, что «uname» или «user» или что-то, для чего им не удалось найти эквивалент Java). Похоже, что Java не делает vfork с копией при семантике записи, как это делает нативное приложение. Если я запускаю свое приложение, используя 4 ГБ ОЗУ, когда оно разветвляется, вилка использует еще 4 ГБ ОЗУ, но затем быстро освобождает его. Если бы у меня не было 4 ГБ подкачки для того, чтобы этот Hadoop мог обмениваться, мне пришлось бы заплатить за 8 ГБ ОЗУ, чтобы иметь 4 ГБ для моего приложения.

Пол Томблин
источник
Это хороший момент, но он не является отражением современного fork () - В Linux и FreeBSD (и, якобы, OSX?) Fork () реализован с помощью страниц копирования при записи. Копирование при записи (или COW) - это метод задержки или полного предотвращения копирования данных. Вместо дублирования адресного пространства процесса родитель и потомок могут совместно использовать одну копию. Однако данные помечаются таким образом, что, если они записаны, создается дубликат, и каждый процесс получает уникальную копию. Цитаты: forums.freebsd.org/showthread.php?t=26355 и справочная страница Linux для fork ()
synthesizerpatel
Хотя это правда, есть некоторые страницы, которые нельзя пометить COW. Например, страница используется для стека ядра нового дочернего процесса и страниц , используемых для внутренних структур данных ( files_struct, то struct signals, как task_structи других). Кроме того, многие исполняемые страницы не являются позиционно-зависимым кодом (PIC), и, таким образом, страницы исполняемого кода, которые были изменены динамическим загрузчиком ( ld-linux.so), должны иметь зарезервированное для них пространство подкачки, даже если ничего не записано в пространство подкачки немедленно. Вот почему я люблю Linux; Вы можете отключить своп, и система все еще работает. :)
Ажрей
3

Я не могу добавить к обсуждению технически, но могу привести несколько примеров. Мой старый ноутбук (2 ГБ RAM kunbuntu lucid) обычно работает с swap на 0. Когда я запускаю передачу (bittorrent клиент) с несколькими торрентами, которые могут совместно использовать 100 соединений, мой swap может пойти вверх. Еще хуже, когда у меня работает XP vm, который использует 1 ГБ реальной памяти.

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

Что касается проблем с OOM, своп может быть спасителем, потому что он экономит время между выявлением проблемы и тем, что происходит на юге. Многие вещи занимают почти всю мою память, поэтому я не обращаю на это никакого внимания, но когда начинает работать своп, я замечаю это и начинаю искать проблему - до того, как она меня укусит.

Джо
источник
Да, устаревшие системы не могут многое сделать без включенного свопинга. У меня все еще есть старый субноутбук с 256 МБ оперативной памяти, где требуется swap для запуска практически любой программы. Я считаю, что этот вопрос нацелен на современные системы.
Дмитрий Григорьев
3

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

Взгляните на этот гаджет http://techreport.com/articles.x/16255 Это в основном интерфейс от S-ATA до DDR2-RAM. Вы можете заполнить до 64 ГБ оперативной памяти. Размещая пространство подкачки на одном из них, вы получаете значительное дополнительное ОЗУ. Конечно, это не так быстро, как обычная системная память. Но это как бы превращает системную память в дополнительный слой кеша.

datenwolf
источник
1
Принимая во внимание его цену (549 долларов), не будет ли эффективнее инвестировать 100 долларов в системную плату, поддерживающую 64 ГБ ОЗУ ?
Дмитрий Григорьев
1
@DmitryGrigoryev: Конечно. Но иногда вы вынуждены использовать этот конкретный вид аппаратного обеспечения (потому что по причинам , кашлем медицинской системы сертификации кашлем ) , но и иметь дело с невероятно большими наборами данных , полученных в очень короткое время (думаю , томографы, datarates> 3GiB / s).
datenwolf
Разве вы не должны были бы сертифицировать диск RAM как медицинское устройство в этом случае? ;) Но да, я понял.
Дмитрий Григорьев
1
@DmitryGrigoryev: Действительно, вы должны это сделать. Однако сертифицировать такое устройство S-ATA RAM намного, намного проще, чем сертифицировать всю материнскую плату. При поиске компьютеров, используемых в медицинском оборудовании, вы обычно приобретаете как можно больше компонентов, имеющих сертификат. Для тех частей, где нет ничего с легкодоступной сертификацией, вы сами проводите необходимые тесты и сертификацию. Особенно при работе в исследованиях, где упор делается на безопасность пациентов, а данные не используются для планирования лечения, это наиболее экономичное и быстрое решение. BT; DT.
datenwolf
3

Я использую Linux и Windows без подкачки (файл подкачки, в номенклатуре Windows), на ноутбуках / десктопах с 4Gb или больше. Есть несколько случаев, когда происходит истощение памяти, я просто имею дело с ними. Я чувствую, что система работает быстрее, и меня это больше волнует. Никаких особых требований к моей рабочей нагрузке.

Вещи, которые я узнал:

  • Windows со временем «теряет» память, примерно через 20-30 дней безотказной работы я дохожу до того, что предпочитаю просто перезагрузиться. Я не знаю, почему это происходит. Я предполагаю, что это может быть утечка в каком-то драйвере или антивирус. Если у вас есть файл подкачки, я полагаю, что он может поместить эту утечку памяти в файл подкачки, поэтому было бы сложнее заметить эту проблему в обычной системе Windows.
  • Firefox работает лучше с небольшим объемом памяти, чем Chrome. Firefox предупреждает вас и продолжает работать, Chrome просто падает.
spuk
источник
2

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

Однако для настольного компьютера подкачка полезна, когда я выполняю задачи, выдвигаемые и всплывающие.

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

Это особенно верно, если Aудерживает не сохраненное состояние, которое не будет восстановлено при перезапуске.

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

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

joeytwiddle
источник
Обновление: после написания этого ответа у меня был ноутбук с большим количеством оперативной памяти и медленным жестким диском. В этом случае мой совет полностью изменился! Вот краткое изложение плюсов и минусов .
Joeytwiddle
1

В моей системе / tmp перезагружается, если слишком много оперативной памяти.

Это намного быстрее, чем использование реальной файловой системы для / tmp.

Джошуа
источник
Это довольно опасно - если мне нужны ramfs, я указываю fstab (или options), чтобы явно установить размер. Вероятность того, что программа может сойти с ума с распределением памяти, так же высока, как и то, что она начнет создавать файлы в / tmp. Обмен был бы плохим местом для файлов ramfs, чтобы показать (особенно если вы полагаетесь на ramfs для скорости)
synthesizerpatel
2
Я часто превышаю объем оперативной памяти. tmpfs, поддерживаемые swap, значительно быстрее, чем ext2, даже при разливе.
Джошуа
Полезно знать - и, вероятно, это будет предмет исследования в будущем - я по-прежнему буду обеспокоен тем, что приложение заполняет мой ram через прокси-сервер tmpfs / ramfs в / tmp. Это дает мне хиби джиби!
синтезаторпатель
Затем установите предел = размер свопа.
Джошуа
Кстати, в этом разница между ramfs и tmpfs. tmpfs может разливаться, а ramfs - нет.
Джошуа
1

Причин использования свопа много.

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

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

Другой пример использования подкачки - это приостановка на диск.

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

  1. они работают под управлением Linux / Windows или аналогичных не-ОСРВ (ОС реального времени); или
  2. они запускают ОСРВ.

Конечно, есть устройства, на которых выполняется только некоторый код (какие-то микроконтроллеры) и т. Д. Я бы не стал их описывать, потому что на таких устройствах нет ОС, поэтому обсуждение подкачки бессмысленно для таких устройств.

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

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

  • чтение из свопа может занять непредсказуемое время
  • устройства имеют предопределенное (во время компиляции) количество задач, которые не нужно менять

Кстати, есть много описаний того, как Linux использует своп, одним из них является http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Использование Windows похожий подход.

Vasily-VM
источник
Кроме того, подкачка необходима для гибернации (приостановки на диск), если вы не используете что-то вроде TuxOnIce.
Ренан
1

Мне кажется, что и гибернация, и гибридный сон требуют пространства подкачки в Linux .

Я никогда не использовал пространство подкачки / раздел под Linux до тех пор, пока не столкнулся с необходимостью использовать Hybrid Sleep - поскольку режим сна при критическом уровне заряда батареи не был доступен в моей системе, так как это выполнялось Upower, который выбирает только между выключением, Hibernate и Hybrid -спать. (подробнее здесь )

Сообщество
источник
0

Несколько хороших примеров использования, которые я видел, - это процессы, которые используют много памяти, но не критично для производительности. Один случай был древним Firefox, у которого была плохая утечка памяти. Это будет заполнять оперативную память и перетекать в обмен без вредного воздействия. Другой, который у нас был, был наш рекурсивный DNS-сервер (они быстро создают огромный кеш, который редко используется).

Другое объяснение, которое я видел по поводу подкачки, звучало примерно так: «Вам говорят, что всегда нужно настраивать ОЗУ = 2 * ОЗУ. Это полная чушь, нет никакой связи между ОЗУ и свопом. Своп предназначен для компенсации скачков в использовании памяти. , вы должны добавить достаточно памяти, чтобы большую часть времени ваша нагрузка помещалась в ОЗУ. Если ваша нагрузка стабильна, вам не требуется подкачка. Если ваша нагрузка сильно варьируется, вам нужно достаточно подкачки для пиков, и расположите ее так, чтобы swap используется достаточно редко, чтобы не оказывать существенного влияния на производительность в целом. Подводя итог, вы не знаете, каковы ваши скачки нагрузки, а поскольку диск намного дешевле RAM, настройте SWAP = 2 * RAM. "

Некоторые старые версии Solaris вообще не могли использовать подкачку, если не было по крайней мере такого же объема подкачки, как и ОЗУ (я помню, что он выделил фиксированное пространство подкачки для выхода из ОЗУ или что-то в этом роде), поэтому 2 * ОЗУ было действительно минимально разумным ценность. Но это было много лет назад, когда наша большая машина имела 64 МБ ОЗУ и 1 ГБ диск ...

vonbrand
источник