Как очистить своп при наличии свободной оперативной памяти?

315

Когда я открываю приложение с интенсивным использованием ОЗУ (для VirtualBox установлено 2 ГБ ОЗУ), обычно используется некоторое пространство подкачки, в зависимости от того, что еще у меня было открыто в данный момент.

Однако, когда я закрываю это последнее приложение, 2 ГБ ОЗУ освобождаются, но остается то же самое пространство подкачки.

Например, сейчас, примерно через два часа после закрытия VirtualBox, у меня 1,6 ГБ свободной оперативной памяти и еще 770 МБ подкачки.

Как я могу сказать Ubuntu прекратить использовать этот своп и вернуться к использованию оперативной памяти?

jfoucher
источник
Самая простая вещь - перезагрузить устройство и сэкономить время, чтобы справиться с оперативной памятью, а свободная оперативная память - сэкономить энергию ноутбука и температуру процессора
Mohamed Slama
5
Большое предположение, что повторное заселение всего содержимого на вашем компьютере занимает меньше времени.
jQwierdy
Ubuntu 16.04, по крайней мере, может продолжать использовать swap еще долго после того, как он был необходим, таким образом, делая вашу систему на порядок медленнее, полагаясь на файл подкачки, даже если это больше не требуется. Поэтому ручное вмешательство может быть полезным. Перезагрузка не всегда вариант.
Мат

Ответы:

167

То, что своп выделен, не означает, что он «используется». В то время как такие программы, как system monitor и top, покажут часть выделенного пространства подкачки (в вашем примере 770 МБ), но это не означает, что система активно выгружается / выгружается.

Чтобы выяснить, происходит ли что-то в обмене, вы можете использовать vmstatкоманду. Оставьте его на несколько секунд, чтобы успокоиться и наблюдать за siколонками (swapin) и so(swapout). Если ничего не происходит, то нет причин для беспокойства.

Вот результат работы vmstat 1, где вы можете видеть, что моя машина не переставляет вообще.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Тем не менее, здесь topвы можете видеть, что у меня есть место подкачки: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
попей
источник
32
«Нет причин для беспокойства», вплоть до того момента, когда я продолжаю использовать какое-то приложение, которое было заменено. тогда весь ад вырвется на свободу.
törzsmókus
207
Этот пост не отвечает на вопрос.
emchristiansen
18
Суть вопроса основана на неправильных представлениях. Этот пост устраняет заблуждения.
Попей
30
Я не вижу заблуждение, я вижу разногласия по поводу того, что означает «подержанный». Вы имеете в виду «использованный» для обозначения активного обмена входами / выходами, в то время как исходный вопрос, по-видимому, задается как «использованный», что означает, что есть данные, которые были заменены, которые в дальнейшем, возможно, потребуется заменить обратно. веские причины хотеть очистить подкачку после события, которое вытесняет много другой памяти, по существу, предотвращая активную подкачку, которая, как известно пользователю, произойдет позже (особенно, если более поздняя «подкачка» может произойти, пока диск загружен по другим причинам).
drfrogsplat
39
После запуска приложения, интенсивно использующего память, другие приложения перестают отвечать на запросы, когда я переключаюсь на них, вероятно, из-за замены. Какой-то способ сказать системе, чтобы она удаляла как можно больше данных (после перерыва на кофе), была бы лучше, чем ждать 20 секунд каждый раз, когда я нажимаю Alt + Tab.
Марк К Коуэн
425

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

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

sudo swapoff -a
sudo swapon -a

ИЛИ альтернативно в виде одной строки

swapoff -a; swapon -a

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

SpamapS
источник
8
Это добилось цели, своп был скопирован в оперативную память. Я думаю, вам просто нужно убедиться, что хотя бы количество свопа использовалось в качестве свободного барана перед запуском swapoff, верно?
jfoucher
12
Своп не был скопирован в RAM. Это было просто отключено. Вы должны убедиться, что коробка не меняет местами перед этим. Если вы это сделаете, то ядро ​​увидит исчезновение памяти, и OOM-Killer, вероятно, начнет произвольно убивать приложения. Нет причины, по которой вам нужно «чистить» своп как этот. (см. мой другой комментарий) :)
popey
51
Фактически, подкачка, в основном, копируется в оперативную память, или, если быть более точным, страницы обмениваются обратно с диска на ОЗУ, прежде чем своп можно будет отключить.
SpamapS
14
Страницы копируются в ОЗУ только в том случае, если они все еще необходимы для какого-либо процесса. Иногда подкачанная страница относится к процессу, который уже был завершен, и ядро ​​не хочет немедленно удалять эти страницы из подкачки.
BrunoJCM
6
Это должен быть правильный ответ, так как это способ вернуть перекачанные страницы обратно в ОЗУ, а затем очистить память подкачки
Альфонсо Хименес
144

Вы также можете установить значение «swappiness» по умолчанию, равное 60, таким образом, своп не будет увеличиваться с самого начала. Почему доставка по умолчанию установлена ​​на 60, когда рекомендуемое значение 10 озадачивает меня. От Ubuntu SwapFAQ :

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

Изменяя это значение на 10 или даже на 0, вы можете добавить значительное и ощутимое увеличение скорости для более старой системы с медленным движением. Установка этого значения в 0 не отключает своп для ядра Linux 3.4 и ниже, но для 3.5+ это делает так, что вы захотите использовать значение 1, если хотите сохранить его на самом низком уровне *.

Я не вижу причин не устанавливать это значение на 0, поскольку все, что попадает на диск, работает медленнее, чем ОЗУ. У меня есть 8 виртуальных ядер, быстрый SSD и 8 ГБ памяти, и мой подкачка установлена ​​на 0. На данный момент у меня работает 3 виртуальные машины, мое использование памяти составляет 7,1 из 7,7 ГБ, мой используемый подкачка составляет всего 576 КБ 952MB и все системы работают без сбоев!

От Ubuntu SwapFAQ :

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

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

Ниже приведены основные инструкции для проверки подкачки, очистки свопинга и изменения подмены на 0:

Чтобы проверить значение перестановки:

cat /proc/sys/vm/swappiness

Чтобы временно установить своп на 0 ( как рекомендует SpamapS ):

Это очистит ваш своп и перенесет весь своп обратно в память. Сначала убедитесь, что у вас достаточно памяти, перейдя на вкладку ресурсов gnome-system-monitor, ваша свободная память должна быть больше используемой подкачки. Этот процесс может занять некоторое время, используйте gnome-system-monitor для мониторинга и проверки прогресса.

sudo swapoff --all

Чтобы установить новое значение на 0:

sudo sysctl vm.swappiness=0 

Чтобы снова включить своп:

sudo swapon --all

Чтобы навсегда установить swappiness на 0:

  1. sudoedit /etc/sysctl.conf
  2. Добавить эту строку vm.swappiness = 0
  3. sudo shutdown -r now # перезагрузить систему

* В версии ядра 3.5+ установка swappiness на 0 отключает его полностью, и рекомендуется установить значение 1, если вы хотите использовать алгоритм наименьшей загрузки. источник: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

Элайджа Линн
источник
1
Я только что обновил ответ, чтобы включить постоянный способ установки swappiness. Не уверен, как за него так много проголосовали, наверное, никто не проверял.
Элайджа Линн
1
Больше хорошего прочтения о перестановках в этом ответе => askubuntu.com/a/103916/11929
Элайджа Линн
3
Я не уверен, было ли это доступно, когда автор первоначально опубликовал ответ, но для установок сервера Ubuntu установлено значение «60», так как эта среда имеет другой набор спецификаций для производительности. help.ubuntu.com/community/…
Frito
1
Этот параметр очень эффективен при управлении размером свопа. Моя система имеет 16G RAM и 16G swap. Иногда я работаю на виртуальных машинах, и некоторые из моих приложений выгружаются. Когда я закрываю виртуальные машины, использование оперативной памяти падает, но использование подкачки остается прежним, и моя система отстает при смене приложений. Изменение swapiness улучшило производительность для меня.
Капад
1
Это должен быть принятый ответ действительно. Подробное объяснение проблемы и ее решения, а также ссылки и решение для сохранения памяти подкачки, но в первую очередь помогают держать ее под контролем. Потрясающие вещи. Благодарю. :)
Jack_Hu
53

Я обнаружил, что очистка подкачки может сильно помочь в системах с медленными дисками и ограниченной оперативной памятью. Конечно, как уже упоминалось, способ сделать это - запустить sudo swapoff -a; sudo swapon -a. Проблема здесь в том, что, если недостаточно ОЗУ, это вызовет всевозможные проблемы.

Я написал сценарий, который я называю toggle_swap, который работал для меня в течение последних нескольких лет. Он проверяет, достаточно ли свободной оперативной памяти перед тем, как отключить своп. Вот:

#!/bin/bash

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)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
Скотт Северанс
источник
Круто, я искал что-то подобное. Может быть, для большей безопасности вы могли бы представить число и проценты, а затем спросить, просто чтобы быть абсолютно уверенным.
Atherion
2
Я обновил
Jekis
К такому выводу я пришел после прочтения всех советов, как будто нужно как-то убедиться, что на самом деле достаточно оперативной памяти перед тем, как убить своп. Спасибо, сэр, замечательный сценарий. Должен быть включен в Ubuntu по умолчанию (не шучу, это действительно необходимость).
Apache
За исключением того, что если вы запустите какую-либо новую вещь, выключив своп и прежде чем он снова включится - памяти не хватит.
barteks2x
Это зависит от того, сколько у вас свободной памяти. Если свободной памяти достаточно для хранения всего подкачки и нового процесса, тогда проблем нет. Если нет, то ты прав.
Скотт Северанс
25

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

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

Erigami
источник
2
У меня были некоторые вещи в swap, vmstat показал мне, что происходит swapin и swapout, а Chrome зависал, а мой процессор почти не использовался. Достаточно веская причина, нет?
Xerus
Определенно, есть случаи, когда свопинг на рабочем столе делает его медленным. (не во время обмена, а также после того, как ОЗУ будет достаточно в течение длительного времени после этого.) Так что в лучшем случае этот ответ - только субъективный опыт, который случается в некоторых случаях.
Крэй
-1

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

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