Я использовал 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».
Ответы:
Не путайте () обмен (как область диска) и (к) обмен (как способ перемещения страниц памяти из ОЗУ на диск и обратно).
Чрезмерного подкачки следует избегать по соображениям производительности, но наличие области подкачки не обязательно является проблемой.
В системах, таких как Linux, с чрезмерной загрузкой памяти, т. Е. Которые позволяют процессам выделять больше памяти, чем доступно, нехватка оперативной памяти без достаточного количества подкачки для обработки ситуации вызовет убийцу OOM. Вы должны доверять алгоритму, используемому для выбора «правильного» процесса для уничтожения, и принять один или несколько ваших процессов для уничтожения без возможности правильно завершить работу. Вот известная аналогия, которая объясняет, почему убийца OOM вообще не может быть хорошей идеей.
В таких системах, как Solaris, которые не перегружают память, т. Е. Обеспечивают постоянное резервирование памяти виртуальной памятью, будь то в ОЗУ или на диске, наличие достаточной области подкачки абсолютно необходимо, в противном случае потенциально значительная часть ОЗУ будет потрачены впустую.
источник
Я знаю одну причину, чтобы продолжать обмениваться. У меня есть приложение, которое занимает столько памяти, сколько я могу позволить себе настроить для моей системы. Он использует Hadoop, который в одной части обработки выполняет fork и exec для запуска одной команды unix (я думаю, что «uname» или «user» или что-то, для чего им не удалось найти эквивалент Java). Похоже, что Java не делает vfork с копией при семантике записи, как это делает нативное приложение. Если я запускаю свое приложение, используя 4 ГБ ОЗУ, когда оно разветвляется, вилка использует еще 4 ГБ ОЗУ, но затем быстро освобождает его. Если бы у меня не было 4 ГБ подкачки для того, чтобы этот Hadoop мог обмениваться, мне пришлось бы заплатить за 8 ГБ ОЗУ, чтобы иметь 4 ГБ для моего приложения.
источник
files_struct
, тоstruct signals
, какtask_struct
и других). Кроме того, многие исполняемые страницы не являются позиционно-зависимым кодом (PIC), и, таким образом, страницы исполняемого кода, которые были изменены динамическим загрузчиком (ld-linux.so
), должны иметь зарезервированное для них пространство подкачки, даже если ничего не записано в пространство подкачки немедленно. Вот почему я люблю Linux; Вы можете отключить своп, и система все еще работает. :)Я не могу добавить к обсуждению технически, но могу привести несколько примеров. Мой старый ноутбук (2 ГБ RAM kunbuntu lucid) обычно работает с swap на 0. Когда я запускаю передачу (bittorrent клиент) с несколькими торрентами, которые могут совместно использовать 100 соединений, мой swap может пойти вверх. Еще хуже, когда у меня работает XP vm, который использует 1 ГБ реальной памяти.
Я видел, как другие комментируют, что процессы, интенсивно использующие память, такие как рендеринг графики, также могут быть использованы для обмена Если вы делаете это только изредка, тогда это не проблема.
Что касается проблем с OOM, своп может быть спасителем, потому что он экономит время между выявлением проблемы и тем, что происходит на юге. Многие вещи занимают почти всю мою память, поэтому я не обращаю на это никакого внимания, но когда начинает работать своп, я замечаю это и начинаю искать проблему - до того, как она меня укусит.
источник
Есть одно очень хорошее приложение для пространства подкачки: расширение ОЗУ путем размещения пространства подкачки на устройстве хранения, использующем ОЗУ, для преодоления ограничений устанавливаемой системной памяти.
Взгляните на этот гаджет http://techreport.com/articles.x/16255 Это в основном интерфейс от S-ATA до DDR2-RAM. Вы можете заполнить до 64 ГБ оперативной памяти. Размещая пространство подкачки на одном из них, вы получаете значительное дополнительное ОЗУ. Конечно, это не так быстро, как обычная системная память. Но это как бы превращает системную память в дополнительный слой кеша.
источник
Я использую Linux и Windows без подкачки (файл подкачки, в номенклатуре Windows), на ноутбуках / десктопах с 4Gb или больше. Есть несколько случаев, когда происходит истощение памяти, я просто имею дело с ними. Я чувствую, что система работает быстрее, и меня это больше волнует. Никаких особых требований к моей рабочей нагрузке.
Вещи, которые я узнал:
источник
Я думаю, что ваши аргументы вполне верны для сервера , где важна производительность, и знание того, какое приложение будет действовать дальше, может быть непредсказуемым.
Однако для настольного компьютера подкачка полезна, когда я выполняю задачи, выдвигаемые и всплывающие.
Например, если я работаю над задачей с использованием приложения,
A
а затем обнаруживаю, что мне нужно использовать приложениеB
для чего-либо (или подзадачи, или прерывания), тогда мне мысленно легче разрешитьA
переключение на диск во время работы вB
чем закрыть ,A
а затем не забудьте запустить его снова после этого.Это особенно верно, если
A
удерживает не сохраненное состояние, которое не будет восстановлено при перезапуске.От того, будет ли приложение быстрее нажимать и извлекать
A
из / подкачки или закрывать и перезагружать его. (Некоторым удается иметь медленный запуск, но маленький жилой размер.)Однако я согласен, что лучшим решением для повышения производительности будет установка дополнительной оперативной памяти.
источник
В моей системе / tmp перезагружается, если слишком много оперативной памяти.
Это намного быстрее, чем использование реальной файловой системы для / tmp.
источник
Причин использования свопа много.
Обычно, когда системе не хватает физической памяти, ядро может поместить некоторые приложения (фактически - некоторые части памяти, которые используются не запущенными приложениями) для замены.
Позже, когда эти приложения должны что-то делать (например, некоторые данные поступают в сокет или срабатывает таймер) - ядро помещает какое-то другое приложение для замены.
Другой пример использования подкачки - это приостановка на диск.
Что касается встроенных устройств, их все можно разделить на (как минимум) две большие группы:
Конечно, есть устройства, на которых выполняется только некоторый код (какие-то микроконтроллеры) и т. Д. Я бы не стал их описывать, потому что на таких устройствах нет ОС, поэтому обсуждение подкачки бессмысленно для таких устройств.
Первая группа встроенных устройств (работающих под управлением некоторых ОС) может использовать (и обычно они используют) подкачку. И вообще, такие устройства используют подкачку так же, как настольные компьютеры и серверы.
Вторая группа устройств (работающих под управлением ОСРВ) вообще не использует подкачку, поскольку ОСРВ имеет ограничение по времени для ответа на событие, и
Кстати, есть много описаний того, как Linux использует своп, одним из них является http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Использование Windows похожий подход.
источник
Мне кажется, что и гибернация, и гибридный сон требуют пространства подкачки в Linux .
Я никогда не использовал пространство подкачки / раздел под Linux до тех пор, пока не столкнулся с необходимостью использовать Hybrid Sleep - поскольку режим сна при критическом уровне заряда батареи не был доступен в моей системе, так как это выполнялось Upower, который выбирает только между выключением, Hibernate и Hybrid -спать. (подробнее здесь )
источник
Несколько хороших примеров использования, которые я видел, - это процессы, которые используют много памяти, но не критично для производительности. Один случай был древним Firefox, у которого была плохая утечка памяти. Это будет заполнять оперативную память и перетекать в обмен без вредного воздействия. Другой, который у нас был, был наш рекурсивный DNS-сервер (они быстро создают огромный кеш, который редко используется).
Другое объяснение, которое я видел по поводу подкачки, звучало примерно так: «Вам говорят, что всегда нужно настраивать ОЗУ = 2 * ОЗУ. Это полная чушь, нет никакой связи между ОЗУ и свопом. Своп предназначен для компенсации скачков в использовании памяти. , вы должны добавить достаточно памяти, чтобы большую часть времени ваша нагрузка помещалась в ОЗУ. Если ваша нагрузка стабильна, вам не требуется подкачка. Если ваша нагрузка сильно варьируется, вам нужно достаточно подкачки для пиков, и расположите ее так, чтобы swap используется достаточно редко, чтобы не оказывать существенного влияния на производительность в целом. Подводя итог, вы не знаете, каковы ваши скачки нагрузки, а поскольку диск намного дешевле RAM, настройте SWAP = 2 * RAM. "
Некоторые старые версии Solaris вообще не могли использовать подкачку, если не было по крайней мере такого же объема подкачки, как и ОЗУ (я помню, что он выделил фиксированное пространство подкачки для выхода из ОЗУ или что-то в этом роде), поэтому 2 * ОЗУ было действительно минимально разумным ценность. Но это было много лет назад, когда наша большая машина имела 64 МБ ОЗУ и 1 ГБ диск ...
источник