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

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

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

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

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

411
задан 11 December 2013 в 19:05

6 ответов

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

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

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

25
ответ дан 11 December 2013 в 19:05

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

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

sudo swapoff -a
sudo swapon -a

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

sudo swapoff -a; sudo swapon -a

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

539
ответ дан 11 December 2013 в 19:05

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

-2
ответ дан 11 December 2013 в 19:05

Я обнаружил, что очистка подкачки может очень помочь в системах с медленными дисками и ограниченными БАРАН. Конечно, как уже упоминалось, для этого нужно запустить 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
54
ответ дан 11 December 2013 в 19:05

Вы также можете установить значение "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 МБ, и все системы работают без сбоев!

Из Ubuntu SwapFAQ :

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

  1. swappiness может иметь значение от 0 до 100
  2. swappiness = 0 сообщает ядро, чтобы избежать подкачки процессов из физической памяти как можно дольше
  3. 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:

  1. sudoedit /etc/sysctl.conf[12135 providedAdd this line vm.swappiness = 0
  2. 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/

160
ответ дан 11 December 2013 в 19:05

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

Похожие вопросы: