почему используется часть моего пространства подкачки, когда у меня все еще есть неиспользуемая оперативная память?

скорее любопытство, чем проблема; и, признаюсь, что-то вроде смущающе основного вопроса:

Я заметил, что во многих случаях на моей машине Linux у меня будет ~500 МБ пространства подкачки, хотя у меня есть ~600 МБ неиспользуемой оперативной памяти.

мой наивный высокого уровня понимания, подкачки не начнется, пока ОЗУ исчерпан.

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

что приводит к вопросу, зачем ядру использовать пространство подкачки? Это часть алгоритма настройки производительности? Является ли это обмен на дисковые части памяти, к которым он считает наименее вероятным (возможно, схема LRU)? Если это так, не было бы просто иметь смысл оставить все в оперативной памяти, и только тогда, когда приближается исчерпание, то и только тогда поменять части LRU из оперативной памяти в пространство подкачки?

Я должен уточнить, мой linux-сервер имеет 2 ГБ оперативной памяти и 2 ГБ подкачки.

28
задан user35997
28.04.2023 12:43 Количество просмотров материала 3677
Распечатать страницу

4 ответа

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

11
отвечен Didier Trosset 2023-04-29 20:31

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

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

7
отвечен Xr. 2023-04-29 22:48

2 причинам:

  1. (@dtrosset) Linux будет менять местами неиспользуемые биты программ, чтобы дать больше кэша и буферов.
  2. вы, возможно, использовали больше памяти в прошлом, и поменяли некоторые вещи, и они не были заменены, потому что они не были использованы, хотя все, что вытеснило его, теперь исчезло.
7
отвечен Douglas Leeder 2023-04-30 01:05

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

перерасход памяти и боязнь убийцы OOM не являются необходимыми частями опыта Linux, однако. Просто установка параметра sysctl vm / overcommit_memory в 2 отключает поведение overcommit и держит убийцу OOM навсегда в страхе. В большинстве современных систем должно быть достаточно места на диске, чтобы большинство ситуаций. Вместо того, чтобы пытаться уберечь процессы pet от уничтожения при исчерпании избыточной памяти, может быть проще просто избежать ситуации в целом. [передышка от ООМ убийцы]

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

поскольку процессы представлены с их собственным адресным пространством или "представлением" (в первую очередь так работает swap), ядро имеет большую свободу действий в том, как оно управляет этим. Используя пример форка также из статьи, связанной выше, так как это гораздо более вероятно, чтобы иметь общие страницы памяти, чем это недавно выделить большой объем неиспользуемой Памяти, памяти может быть выделенное копирование при записи, увеличивающее количество использования подкачки. Когда он фактически записывается (что может не произойти), то этот "фиксированный своп" может быть заменен любым неиспользуемым ОЗУ (затем увеличение использования ОЗУ и уменьшение использования свопа). Представьте себе процесс с выделенным 500 МБ, который разветвляется на машине со всей или почти всей используемой оперативной памятью. Если в swap доступно 500 МБ (и дисковое пространство дешево, насколько велик 1% современных дисков ТБ? : P), никакая память не должна быть скопирована (пока, и, возможно, никогда), но ядро может гарантировать, что эти выделения "успешны" и продолжают использовать страницы общей памяти как можно дольше.

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

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

1
отвечен Roger Pate 2023-04-30 03:22

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх