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

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

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

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

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

7 ответов

Решение

То, что своп выделен, не означает, что он "используется". В то время как такие программы, как 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

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

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

sudo swapoff -a
sudo swapon -a

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

swapoff -a && swapon -a

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

Вы также можете установить значение "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/

Я обнаружил, что очистка подкачки может сильно помочь в системах с медленными дисками и ограниченной оперативной памятью. Конечно, как уже упоминалось, способ сделать это запустить 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

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

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

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

      sudo sysctl vm.swappiness=10

или даже не меняйте местами, насколько это возможно,

      sudo sysctl vm.swappiness=0

Пожалуйста, прочитайте документацию файла подкачки здесь: https://help.ubuntu.com/community/SwapFaq

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

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