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


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

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

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

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


249
2017-08-06 06:43


Источник


Простейшая вещь перезагрузите устройство и сэкономьте время на то, чтобы справиться с плунжером и освободить энергию экономии энергии ноутбука и процессора - Mohamed Slama
Большое предположение, что переполнение всего материала на вашем компьютере занимает меньше времени. - jQwierdy


Ответы:


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

147
2017-08-06 10:04



«Нет причин беспокоиться», вплоть до того момента, когда я продолжаю использовать какое-то приложение, которое было заменено. то весь ад разрывается. - törzsmókus
Это сообщение не отвечает на вопрос. - emchristiansen
Предпосылка вопроса основана на неправильных представлениях. В этом сообщении рассматриваются неправильные представления. - popey
Я не вижу заблуждения, я вижу несогласие с тем, что означает «используемое». Вы имеете в виду «использовать», чтобы ссылаться на активную замену в / в, в то время как исходный вопрос представляется с «используемым» значением, означающим, что есть данные, которые были заменены, что впоследствии может быть заменено обратно. действительные причины, чтобы захотеть сбросить своп после события, которое обменивает много другой памяти, по существу предотвращая активную подкачку, которую пользователь знает, произойдет позже (особенно если более поздняя «деобстановка» может произойти, пока диск находится под нагрузкой по другим причинам). - drfrogsplat
После запуска приложения с интенсивным использованием памяти мои другие приложения не реагируют, когда я переключаюсь на них, по-видимому, из-за их замены. Некоторый способ сообщить системе об отказе как можно больше данных (за которым следует кофе-брейк) было бы лучше, чем ждать 20 секунд каждый раз, когда я Alt + Tab. - Mark K Cowan


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

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

sudo swapoff -a
sudo swapon -a

ИЛИ в качестве одной команды

swapoff -a && swapon -a

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


338
2017-08-06 06:47



Это сделал трюк, своп был скопирован на баран. Думаю, вам просто нужно убедиться, что по крайней мере количество подкачки, используемое в качестве бесплатного бара, перед запуском swapoff, не так ли? - jfoucher
Обмен не был скопирован в ОЗУ. Это было просто отключено. Прежде чем делать это, вы должны убедиться, что коробка не заменяется. Если вы это сделаете, ядро ​​увидит, что память исчезнет, ​​и OOM-Killer, вероятно, начнет произвольно убивать приложения. Нет причин, по которым вам нужно будет «очистить» своп таким образом. (см. мой другой комментарий) :) - popey
На самом деле своп, в основном, скопирован на баран, или, точнее, страницы заменяются обратно с диска на ОЗУ, прежде чем своп может быть отключен. - SpamapS
Страницы копируются в ОЗУ только в том случае, если они по-прежнему необходимы для некоторых процессов. Иногда поменявшаяся страница принадлежит процессу, который уже завершен, и ядро ​​не хочет немедленно удалять эти страницы из swap. - BrunoJCM
Это должен быть правильный ответ, так как это способ вернуть обмениваемые страницы в ОЗУ и затем освободить память подкачки - Alfonso Jiménez


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

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

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

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

Из Ubuntu SwapFAQ:

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

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

Ниже приведены основные инструкции для проверки 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, если вы хотите использовать алгоритм с наименьшей спасимостью. источник: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


118
2018-06-11 14:10



Это должен быть принятый ответ. - quant
Я просто обновил ответ, включив в него постоянный способ установить swappiness. Не уверен, как это получилось так много, я предполагаю, что никто его не проверял. - Elijah Lynn
Более хорошее чтение о swappiness в этом ответе => askubuntu.com/a/103916/11929 - Elijah Lynn
Добавлена ​​заметка о поведении swappiness = 0 с ядром Linux версии 3.5+. - Elijah Lynn
Я не уверен, что это было доступно, когда автор первоначально опубликовал ответ, но значение swapiness «60» установлено для установки сервера ubuntu, поскольку у этой среды есть другой набор спецификаций для производительности. help.ubuntu.com/community/... - Frito


Я обнаружил, что перезапуск 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 $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

45
2017-12-25 16:35



Это было действительно полезно, спасибо! - Luke Cousins
Эй, это лучшее решение. Благодаря! - Fabio A. Correa
Удивительно, я искал что-то вроде этого. Возможно, чтобы быть немного более безопасным, вы можете представить количество и проценты, а затем спросить, просто быть абсолютно уверенным. - Atherion
Я обновляю код и создаю основы gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c - Jekis
Это вывод, который я сделал после прочтения всех советов, так как нужно как-то убедиться в достаточной памяти, прежде чем убить своп. Спасибо, сэр, замечательный сценарий. Должен быть включен в Ubuntu по умолчанию (не шутите, это действительно musthave.) - Shiki


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

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


23
2017-08-06 16:34



У меня было кое-что в свопе, vmstat показал мне, что происходит swapin и swapout, а Chrome был немного отстающим, а мой процессор почти не использовался. Хорошая причина, нет? - Xerus


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


1
2017-08-11 19:35



Да, но если что-то является поменялся делает влияют на производительность, следовательно, этот вопрос. - quant