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

208

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

Мистерио
источник
3
Пожалуйста , поделитесь содержанием или выходом из следующих команд / файлы , чтобы лучше помочь нам решить проблему ( инструкции в этом ответе ) : free -m,top -b 1
иш
Завтра обновлю вопрос со вставками этих команд. Сейчас 12 часов утра :(
Mysterio
Я должен отредактировать заголовок, чтобы добавить «... но я слишком сонный, чтобы беспокоиться, так что вы, ребята, тоже вздремните»: P
Иш

Ответы:

188

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

Из FAQ по Ubuntu Swap :

Что такое подкачка и как мне ее поменять?

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

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

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

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

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

Чтобы проверить значение swappiness

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

jpetersen
источник
1
Бесполезные предположения: это на самом деле может быть выгодно для производительности - страницы, к которым не обращались в течение некоторого времени, могут быть скопированы в пространство подкачки, что позволяет ОС быстро их удалять, если ей когда-либо понадобится память, но содержимое страницы остается в памяти ,
Саймон Рихтер
7
@SimonRichter Да, это идея. Однако в современных системах замена на 60, вероятно, слишком агрессивна, поскольку это означает, что вы начинаете менять местами, когда у вас еще есть несколько гигабайт свободной памяти.
Брендан Лонг
1
Запустите sudo sysctl --load=/etc/sysctl.confпосле редактирования файла, чтобы применить изменения
deFreitas
92

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

thomasrutter
источник
5
+1 для подробного объяснения. Я также хотел бы сохранить 2GiB своп на моих компьютерах. Если что-то идет не так - утечки памяти и т. Д., Вы можете увидеть, как происходит своп, и искать проблему до того, как произойдет нехватка памяти. Это сеть безопасности, а также инструмент производительности.
Джо
1
На моем нетбуке, который имеет только 2 ГБ оперативной памяти, я сохраняю 4 ГБ подкачки. Это потому, что я использую нетбук гораздо больше, для чего он предназначен, и моим программам часто требуется более 2 ГБ памяти. Поскольку Linux ведет себя очень плохо в ситуациях нехватки памяти, я предпочитаю иметь большую сеть безопасности. И у меня много места на диске.
Скотт Северанс
Если вашим программам часто требуется больше 2 ГБ памяти, я бы подумал о том, чтобы увеличить объем оперативной памяти (это очень дешево!), Потому что исчерпание ОЗУ повредит производительности. Для удобства других читателей: убедитесь, что вы не просто смотрите на кеш-память, которая должна занимать доступную оперативную память, - смотрите другие ссылки на free -m.
Томасруттер
2
@neon_overload: Я должен только отметить, что согласно HP максимальный объем ОЗУ моего нетбука составляет 1 ГБ. У меня там сейчас 2 ГБ, и интернет-источники предполагают, что 2 ГБ - это фактический максимум. Таким образом, необходимость такого рода обходных путей.
Скотт Северанс
@thomasrutter: Как меняется ваш ответ для больших серверов, один из моих имеет 1 ТБ (да, один полный терабайт) оперативной памяти и все еще использует swap; Какие настройки подкачки и размер раздела подкачки вы бы порекомендовали?
chrisinmtown
24

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

Переключение с переключением немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной оперативной памяти для хранения всего в оперативной памяти, а также всего содержимого подкачки, попытка отключить подкачку приведет к тому, что ваша система перестанет отвечать на запросы. Мой сценарий сначала проверяет, достаточно ли свободной оперативной памяти (что занимает немного времени, так как фактический объем свободной оперативной памяти отличается от того, что 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). Этот скрипт не оставит вашу систему без ответа; если у вас недостаточно оперативной памяти, он не сможет переключить своп. Я использовал этот скрипт без проблем в течение почти пяти лет.

Скотт Северанс
источник
+1 за скрипт. Возможно, вы захотите немного модернизировать его, изменив значение MB на MiB в выходных данных. Я написал аналогичный сценарий без всех (хороших) тестов безопасности, которые вы включили. На моем старом ноутбуке, где интенсивно использовался своп, для запуска потребовалось некоторое время - минута или две, но ничего не пострадало. Время от времени он терпел неудачу, потому что не хватало свободной памяти для его работы, но это не вызывало дополнительных проблем. Я должен был перезагрузиться, чтобы прояснить ситуацию, когда это произошло. Это было связано с тем, что в Transmission выглядело как утечка памяти (я полагаю, это было исправлено) и имея только 2 ГБ ОЗУ.
Джо
6
Если что-то было перемещено для обмена, и оно остается в режиме обмена, это, как правило, хорошо - это означает, что данные фактически не используются, и они освобождают часть вашей ОЗУ для других операций, что может привести к увеличению скорости. Что заставило вас поверить, что эти данные не должны быть подкачкой и должны занимать более ценную оперативную память? Обычно ядро ​​достаточно хорошо знает, что не используется, и что может безопасно оставаться в режиме подкачки для освобождения оперативной памяти.
Томасруттер
@neon: Имейте в виду, что мои машины имеют 2 ГБ и 3 ГБ ОЗУ соответственно, что в наши дни довольно мало. Доказательства в исполнении. Например, запуск меню или переключение программ может быть медленным из-за подкачки, как и эффекты Compos visoal. Эта медлительность устраняется переключением свопа, демонстрируя тем самым, что, по крайней мере, в некоторых ситуациях алгоритмы оптимизации ядра являются неоптимальными. Я не могу спорить с повторным опытом.
Скотт Северанс
Уф !! Это просто снизило до 0% свопа .... У меня не было много времени, чтобы разобраться в этом полном вопросе и его ответе, но я предпочел его прочитать, когда у меня будет немного свободного времени.
AzkerM
Почему бы вам просто не установить своппинг на низкое значение? Казалось бы, это делает то же самое, что и ваш сценарий, но гораздо более контролируемым образом.
Jhfrontz
4

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

drake01
источник
12
Включение свопа от полностью является излишним , так как swapiness = 0 делает то же самое, но более безопасным (если вы делаете в конечном итоге слишком много вещей в памяти, он будет бросать то в свопе).
Брендан Лонг
@BrendanLong Честная точка зрения. Спасибо, что научили меня. :)
drake01
3

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

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

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

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

BillThor
источник
2

Я отредактировал скрипт Scott Severance, чтобы он соответствовал более новым версиям 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
derberlinersmurf
источник