Почему используется своп, хотя у меня много свободной оперативной памяти?

Я думал, что вся суть подкачки заключается в том, чтобы действовать как временная сеть безопасности хранения, когда ОЗУ переполнена, но мой раздел подкачки постоянно используется, хотя иногда у меня есть до 3 ГБ свободной ОЗУ. Это нормально?

214
задан 30 June 2012 в 03:19

6 ответов

Как правило, своп остается неиспользуемым в современных системах. По моему опыту, процессы, которые выполняются в течение долгого времени без интенсивных операций, переключаются на Linux подкачки.
Это приводит к медленной работе нескольких уязвимых программ.
Если у вас много оперативной памяти, вы можете отключить обмен, выполнив команду:
swapoff -av (для этого вам понадобятся права sudo).
Если вам не нравится своп, вы можете включить его, используя симметричную команду:
swapon -av (снова sudo требуется).

0
ответ дан 30 June 2012 в 03:19

Установка значения перестановки работает не во всех ситуациях. Если это работает для вас, отлично. Если нет, я написал скрипт для периодической очистки свопа, выключая и снова включая его.

Переключение между переключениями немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной оперативной памяти для хранения всего в оперативной памяти плюс всего подкачки, попытка отключить подкачку приведет к тому, что ваша система перестанет отвечать на запросы. Мой сценарий сначала проверяет, достаточно ли свободной оперативной памяти (что занимает немного времени, поскольку фактический объем свободной оперативной памяти отличается от того, что free сообщает как свободная), а затем только переключает своп, если это так. Но, если у вас мало оперативной памяти, не запускайте другой важный процесс во время работы скрипта. Вот оно:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Вы должны запустить этот скрипт от имени пользователя root (например, с sudo). Этот скрипт не оставит вашу систему без ответа; если у вас недостаточно оперативной памяти, он не сможет переключить своп. Я использовал этот сценарий без проблем в течение почти пяти лет.

0
ответ дан 30 June 2012 в 03:19

Я отредактировал скрипт Скотта Северанса , чтобы он соответствовал более новым версиям free, которые уже включают в себя поле общей доступной памяти.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
0
ответ дан 30 June 2012 в 03:19

Вы можете попробовать изменить значение «swappiness»:

Из FAQ по обмену в Ubuntu :

Что такое swappiness и как его изменить?

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

  1. swappiness может иметь значение от 0 до 100

  2. swappiness = 0 говорит ядру избегать процессов вытеснения из физической памяти как можно дольше , Для версии ядра 3.5 и новее она отключает обмен.

  3. swappiness = 100 приказывает ядру агрессивно выгружать процессы из физической памяти и перемещать их в кеш подкачки

По умолчанию в Ubuntu используется swappiness = 60. Снижение значения swappiness по умолчанию, вероятно, улучшит общую производительность типовой установки Ubuntu на рабочем столе. Рекомендуется значение swappiness = 10, но не стесняйтесь экспериментировать. Примечание. Установки сервера Ubuntu предъявляют различные требования к производительности для настольных систем, и значение по умолчанию 60, вероятно, более подходит.

Для проверки значения подкачки

cat /proc/sys/vm/swappiness

Для изменения значения подкачки Временное изменение (потеря при перезагрузке) с Значение перестановки 10 может быть сделано с помощью

sudo sysctl vm.swappiness=10

Чтобы сделать изменение постоянным , отредактируйте файл конфигурации в своем любимом редакторе:

gksudo gedit /etc/sysctl.conf

Найдите vm.swappiness и измените его значение по желанию. Если vm.swappiness не существует, добавьте его в конец файла следующим образом:

vm.swappiness=10

Сохраните файл и перезагрузитесь.

Также вы можете проверить: https://askubuntu.com/a/103916/54187

0
ответ дан 30 June 2012 в 03:19

В вашем вопросе есть несколько разных аспектов.

Во-первых, каково ваше определение «свободный». На самом деле это не так просто, как кажется в Linux (или любой современной операционной системе).

Как Linux использует RAM (очень упрощено)

Каждое приложение может использовать часть вашей памяти. Linux использует всю незанятую память (за исключением последних нескольких Мб) в качестве «кэша». Это включает в себя кэш страниц, кэши узлов и т. Д. Это хорошо - это помогает ускорить работу кучи. Как запись на диск, так и чтение с диска могут быть значительно ускорены кэшем.

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

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

Это не специфическая ситуация для Linux - все современные операционные системы работают таким образом. Различные операционные системы могут просто сообщать о свободной оперативной памяти по-разному: некоторые включают кэш как часть того, что они считают «свободным», а некоторые - нет.

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

Как Linux использует swap (еще более упрощенно)

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

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

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

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

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

Если у вас есть система, в которой у вас огромный объем ОЗУ (на момент написания 8 ГБ - это огромный объем для типичного дистрибутива Linux), то вы очень редко попадете в ситуацию, когда вообще нужен своп. Вы можете даже попробовать отключить своп. Я никогда не рекомендую делать это, но только потому, что вы никогда не знаете, когда больше оперативной памяти может спасти вас от сбоя некоторых приложений. Но если вы знаете, что вам это не понадобится, вы можете сделать это.

Но как своп может ускорить мою систему? Разве обмен не замедляет процесс?

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

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

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

Когда данные подкачки, когда они снова выходят?

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

0
ответ дан 30 June 2012 в 03:19

Как только своп используется для программы, он имеет тенденцию оставаться отображенным на весь срок действия программы. Многие программы имеют код (и данные), который редко используется. Как только память выгружается, ее вряд ли можно поменять местами.

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

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

В крайнем случае вы можете использовать файл в качестве устройства подкачки. Это полезно, если вам нужно дополнительное пространство подкачки временно.

0
ответ дан 30 June 2012 в 03:19

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

Похожие вопросы: