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

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

4 ответа

Решение

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

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

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

swapoff -a

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам