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

228

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

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

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

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

    
задан jfoucher 06.08.2010 в 08:43
источник

6 ответов

139

Только потому, что swap выделен, это не значит, что он используется. В то время как программы, такие как системный монитор и верхний, будут отображать часть вашего пространства подкачки (в вашем примере 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
    
ответ дан popey 06.08.2010 в 12:04
источник
299

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

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

sudo swapoff -a
sudo swapon -a

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

swapoff -a && swapon -a

Будьте осторожны, так как вы можете сделать вашу систему нестабильной, особенно если она уже не работает в ОЗУ.

    
ответ дан SpamapS 06.08.2010 в 08:47
105

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

  

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

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

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

Из Ubuntu SwapFAQ :

  

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

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

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

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

cat /proc/sys/vm/swappiness

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

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

sudo swapoff --all

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

sudo sysctl vm.swappiness=0 

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

sudo swapon --all

Чтобы постоянно установить swappiness на 0:

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

* С версией ядра 3.5 + установка swappiness на 0 полностью отключает ее, и рекомендуется использовать настройку 1, если вы хотите использовать алгоритм наименьшего смирения. источник: Ссылка

    
ответ дан Elijah Lynn 11.06.2012 в 16:10
41

Я обнаружил, что перезапуск swap может очень помочь в системах с медленными дисками и ограниченной оперативной памятью. Конечно, как уже упоминалось, способ сделать это - запустить 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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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
    
ответ дан Scott Severance 25.12.2011 в 17:35
23

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

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

ответ дан Erigami 06.08.2010 в 18:34
1

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

    
ответ дан Rory 11.08.2010 в 21:35