Когда своп возвращается в физическую память?

8

Когда своп возвращается в физическую память в Linux? Это только по требованию, т.е. когда это нужно? Или же подкачка медленно переносится в физическую память, когда компьютер не загружен?

Ztyx
источник

Ответы:

7

По требованию. Фактически, Linux будет медленно переводить физическую память для перестановки в режиме ожидания (см .: «swappiness»).

Игнасио Васкес-Абрамс
источник
Спасибо. Короткий краткий ответ. Мне это нравится (хотя я ценю усилия всех остальных, вложенные в их ответы)!
Ztyx
Этот ответ неверен. Вопрос в том, когда память выгружается, а не выгружается. Это наоборот. При сбое страницы ядро ​​перезагрузит страницу с диска / подкачки. Так что в основном по требованию. Вы можете получить доступ ко всей виртуальной памяти процесса, чтобы вызвать сбои страниц. В результате страницы будут скопированы обратно в оперативную память.
user228505
7

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

Просто делать:

swapoff -a

… И все ваши данные подкачки «вернутся» в память. Побочным эффектом является то, что дисковые буферы / кеши могут быть сброшены.

Иногда это может быть желательно сделать swapoff -a ; swapon -a, например, после некоторого ошибочного процесса утечки памяти, перед сбоем, выметаются более важные процессы - чтобы убедиться, что любой процесс, работающий в системе, загружен в память и не будет ждать замены в несколько минут.

Яцек Конечный
источник
О, ты учишься чему-то хорошему каждый день! Кстати, «swapoff -a» потерпит неудачу, не хватает ли физической памяти? Есть ли риск, связанный с вызовом swapoff?
Ztyx
Это не удастся, если не хватает физической памяти. Это все еще риск, swapoffкоторый не потерпит неудачу, но вскоре после этого система исчерпает память, swapoffа OOM остановит случайный процесс (в худшем случае оболочка swaponили swaponкоманда). На практике это маловероятно - кэш-память использует много памяти перед вызовом, swapoffпоэтому для выполнения обеих команд должно быть достаточно оперативной памяти.
Яцек Конечны
7

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

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

Вы можете видеть, сколько страниц в настоящее время находится как в оперативной памяти, так и в cat /proc/meminfoразделе подкачки. SwapCachedСтрока - это объем данных на страницах, которые в настоящее время находятся как в оперативной памяти, так и на диске. Если вы думаете, что ваш текущий своп использует его выше, чем вы ожидаете, проверьте значение SwapCached, так как это может хорошо объяснить расхождение.

Дэвид Спиллетт
источник
Ранее обсуждались похожие проблемы. Однако не этот конкретный вопрос. См. Также serverfault.com/questions/100448/…, который касается SwapCached.
Ztyx
Я даже не помню, как писал этот ответ ... Я мог бы просто связать (или скопировать + вставить) его вместо того, чтобы набирать текст выше ...
Дэвид Спиллетт
0

Обычно это связано с оборудованием, которое вы используете. На большинстве аппаратных средств (включая Intel) MMU контролирует весь процесс.

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

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

Это означает, что до тех пор, пока к странице памяти не будет произведен доступ, она никогда не вернется в «живую» память после помещения в swap. Вот почему обычно существует OS API, который позволяет программам указывать, что конкретный блок памяти НЕ должен быть перенесен на диск и должен храниться в памяти (я не знаю о Linux, но в Windows это функция VirtualLock) ,

Stephane
источник
mlock(2) linux.die.net/man/2/mlock
Игнасио Васкес-Абрамс