Когда я открываю приложение с интенсивным использованием ОЗУ (для VirtualBox установлено 2 ГБ ОЗУ), обычно используется некоторое пространство подкачки, в зависимости от того, что еще у меня было открыто в тот момент.
Однако, когда я закрываю это последнее приложение, 2 ГБ ОЗУ освобождается, но остается то же самое пространство подкачки.
Например, сейчас, примерно через два часа после закрытия VirtualBox, у меня 1,6 ГБ свободной оперативной памяти и еще 770 МБ в разделе подкачки.
Как я могу сказать Ubuntu прекратить использовать этот своп и вернуться к использованию оперативной памяти?
То, что своп выделен, не означает, что он "используется". В то время как такие программы как системный монитор и top покажут часть выделенного места под своп (в вашем примере 770MB), это не означает, что система активно производит подкачку.
Чтобы выяснить, происходит ли какая-либо замена входа/выхода, можно воспользоваться командой 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
После пары дней болтания с swappiness, я пришел к выводу, что ядро следует оставить на собственных устройствах. Оно знает, что делает, и оно оптимизировано, чтобы дать вам лучший опыт.
Если у вас нет действительно веской причины хотеть этот диск обратно, я бы оставил его.
Ядро Linux, лежащее в основе Ubuntu, автоматически "меняет" эти страницы с диска на оперативную память по мере необходимости, так что, в общем, я бы сказал, пусть это происходит естественным путём.
Однако, если вы действительно чувствуете, что вам нужно это сделать, (я вижу сценарий, в котором вы хотели бы знать, что система будет реагировать позже), вы можете мгновенно отключить и снова включить swap
sudo swapoff -a
sudo swapon -a
Или, альтернативно, в виде одной строки
sudo swapoff -a; sudo swapon -a
Будьте осторожны, так как это может сделать вашу систему нестабильной, особенно, если она уже имеет низкий уровень оперативной памяти.
Это не повлияет на производительность, если ваше место подкачки занято. Единственный штраф за перформанс - это вход/выход свопа. Если ничего не меняется в/изменяется, то Вам не о чем беспокоиться.
Я обнаружил, что очистка подкачки может очень помочь в системах с медленными дисками и ограниченными БАРАН. Конечно, как уже упоминалось, для этого нужно запустить 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
Вы также можете установить значение "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 ГБ памяти, а мой swap установлен на 0. На данный момент у меня работает 3 виртуальных машины, мое использование памяти составляет 7,1 из 7,7 ГБ, мой использованный swap составляет только 576 КБ. 952 МБ, и все системы работают без сбоев!
Параметр swappiness контролирует тенденцию ядра перемещать процессы из физической памяти на диск подкачки. Поскольку диски намного медленнее, чем ОЗУ, это может привести к более медленному времени отклика для системы и приложений, если процессы слишком активно перемещаются из памяти.
- swappiness может иметь значение от 0 до 100
- swappiness = 0 сообщает ядро, чтобы избежать подкачки процессов из физической памяти как можно дольше
- swappiness = 100 указывает ядру агрессивно выгружать процессы из физической памяти и перемещать их в кеш подкачки
Ниже приведены основные инструкции по проверке подкачки, освобождая вашу swap и изменение swappiness на 0:
Чтобы проверить значение swappiness:
cat /proc/sys/vm/swappiness
Чтобы временно установить swap на 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[12135 providedAdd this line vm.swappiness = 0
sudo shutdown -r now
# restart system * С версией ядра 3.5+ установив swappiness на 0 полностью отключает его, а значение 1 рекомендуется, если вам нужен алгоритм с наименьшей заменой. источник: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/