Как очистить своп при наличии свободной оперативной памяти?
Когда я открываю приложение с интенсивным использованием ОЗУ (для 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 и все системы работают без сбоев!
Параметр swappiness контролирует стремление ядра перемещать процессы из физической памяти на диск подкачки. Поскольку диски намного медленнее, чем ОЗУ, это может привести к более медленному времени отклика для системы и приложений, если процессы слишком агрессивно перемещаются из памяти.
- swappiness может иметь значение от 0 до 100
- swappiness = 0 говорит ядру избегать выгрузки процессов из физической памяти как можно дольше
- 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:
sudoedit /etc/sysctl.conf
- Добавить эту строку
vm.swappiness = 0
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
Это не влияет на производительность, если ваше пространство подкачки занято. Единственное ухудшение производительности - это то, что происходит вход / выход из свопа. Если ничего не выгружается или не выгружается, вам не о чем беспокоиться.