Вопрос Почему используется своп, хотя у меня много свободной памяти?


Я думал, что вся суть свопа заключается в том, чтобы действовать как временная система хранения данных, когда RAM заполнена, но мой раздел подкачки постоянно используется, хотя иногда я имею 3 ГБ свободной памяти. Это нормально?


183
2018-06-29 22:16


происхождения


Пожалуйста, поделитесь содержимым или результатом следующих команд / файлов, чтобы лучше помочь нам устранить проблему (инструкции в этом ответе): free -m, top -b 1 - ish
Завтра обновит вопрос с помощью пастихинов этих команд. Сейчас 12 часов :( - Mysterio
Я должен отредактировать заголовок, чтобы добавить «... но я слишком сонлив, чтобы ухаживать прямо сейчас, поэтому вы, ребята, тоже вздремните»: P - ish


ответы:


Вы можете попробовать изменить свое значение «swappiness»:

Из Часто задаваемые вопросы по Ubuntu:

Что такое swappiness и как я могу ее изменить?

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

  1. swappiness может иметь значение от 0 до 100

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

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

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

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

cat /proc/sys/vm/swappiness

Чтобы изменить значение swappiness Временное изменение (потерянное при перезагрузке) со значением swappiness 10 может быть выполнено с

sudo sysctl vm.swappiness=10

Сделать постоянным изменение, отредактируйте файл конфигурации с помощью вашего любимого редактора:

gksudo gedit /etc/sysctl.conf

Найдите vm.swappiness и измените его значение по желанию. Если vm.swappiness не существует, добавьте его в конец файла следующим образом:

vm.swappiness=10

Сохраните файл и перезагрузитесь.

Также вы можете проверить: https://askubuntu.com/a/103916/54187


161
2018-06-29 23:10



Беспроблемная спекуляция: на самом деле это может быть полезно для производительности - страницы, которые не были доступны через некоторое время, могут быть скопированы для замены места, что позволяет ОС быстро выселить их, если ему когда-либо понадобится память, но содержимое страницы остается в памяти , - Simon Richter
@SimonRichter Да, это идея. Swappiness of 60, вероятно, слишком агрессивен в современных системах, хотя это означает, что вы начинаете заменять, когда у вас все еще есть несколько концертов свободной памяти. - Brendan Long
Бег sudo sysctl --load=/etc/sysctl.conf после изменения файла для применения изменений - deFreitas


На ваш вопрос есть несколько разных аспектов.

Во-первых, каково ваше определение «свободный». На самом деле это не так просто, как кажется в Linux (или любой современной операционной системе).

Как Linux использует ОЗУ (очень упрощенный)

Каждое приложение может использовать часть вашей памяти. Linux использует все в остальном незанятой памяти (за исключением последних нескольких Mb) в качестве «кеша». Это включает кеш страниц, тайники inode и т. Д. Это хорошо - это помогает ускорить работу. Как запись на диск, так и чтение с диска могут быть значительно ускорены кешем.

В идеале у вас достаточно памяти для всех ваших приложений, и у вас все еще осталось несколько сотен Mb для кеша. В этой ситуации, пока ваши приложения не увеличивают использование своей памяти, и система не изо всех сил пытается получить достаточное пространство для кеша, нет необходимости в каком-либо обмене.

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

Это не та ситуация, которая характерна для Linux - все современные операционные системы работают таким образом. Различные операционные системы могут просто сообщать о бесплатной ОЗУ по-разному: некоторые из них включают кеш как часть того, что они считают «свободным», а некоторые - нет.

Когда вы говорите о свободной ОЗУ, это намного более значимо для включают кеш, потому что он практически свободен - он доступен, если любое приложение запросит его. В Linux, free команда сообщает об этом в обоих направлениях - первая строка включает кеш в используемом столбце ОЗУ, а вторая строка содержит кеш (и буферы) в свободном столбце.

Как Linux использует swap (еще более упрощенный)

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

Он не делает этого в соответствии с определенным отсечением. Это не похоже на то, что вы достигли определенного процента распределения, тогда Linux начинает замену. Он имеет довольно «нечеткий» алгоритм. Это учитывает много вещей, которые лучше всего можно описать словами «сколько давления для распределения памяти». Если есть много «давления», чтобы выделить новую память, это увеличит шансы, что некоторые будут заменены, чтобы сделать больше места. Если будет меньше «давления», это уменьшит эти шансы.

В вашей системе есть параметр «swappiness», который помогает вам настроить, как рассчитывается это «давление». Обычно не рекомендуется изменять это вообще, и я бы не рекомендовал вам его изменять. Переключение в целом - очень хорошая вещь - хотя есть несколько краевых случаев, когда это наносит вред производительности, если вы посмотрите на общую производительность системы, это чистая выгода для широкого круга задач. Если вы уменьшите swappiness, вы позволите уменьшить объем памяти кэш-памяти немного больше, чем в противном случае, даже если это действительно может быть полезно. Является ли это достаточно хорошим компромиссом для любой проблемы, с которой вы сталкиваетесь при обмене, зависит от вас. Вы должны просто знать, что делаете, вот и все.

Существует хорошо известная ситуация, когда обмен действительно вредит воспринимаемой производительности на настольной системе, и именно в том, как быстро приложения могут реагировать на ввод пользователя снова после длительного простоя и иметь фоновые процессы, тяжелые в IO (например, ночная резервная копия). Это очень заметная медлительность, но недостаточно для того, чтобы оправдывать сворачивание свопа все вместе и очень сложно предотвратить в любой операционной системе. Отключите подкачку и эту начальную вялость после того, как резервное копирование / проверка на вирусы может не произойти, но система может работать немного медленнее в течение всего дня. Это не та ситуация, которая ограничена Linux.

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

Если у вас есть система, в которой у вас огромное количество оперативной памяти (на момент написания статьи, 8 ГБ - огромная сумма для типичного дистрибутива Linux), то вы редко будете когда-либо сталкиваться с ситуацией, когда требуется своп. Вы даже можете попытаться отключить swap. Я никогда не рекомендую это делать, но только потому, что вы никогда не знаете, когда большее количество оперативной памяти может спасти вас от сбоя приложения. Но если вы знаете, что вам это не понадобится, вы Можно сделай это.

Но как можно поменять скорость моей системы? Не меняет медленные вещи?

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

Это также последний случай, когда ваши приложения действительно запрашивают Больше чем на самом деле. В этом случае замена необходима для предотвращения ситуации с отсутствием памяти, которая часто приводит к сбою приложения или его принудительному уничтожению.

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

Как только данные будут заменены, когда он снова выйдет?

Передача данных из подкачки (как минимум, для традиционных жестких дисков) столь же трудоемка, как и ее размещение. Понятно, что ваше ядро ​​будет так же неохотно удалять данные из swap, особенно если оно фактически не используется (то есть читается или записывается). Если у вас есть данные в swap и он не используется, то на самом деле хорошо, что он остается в swap, поскольку он оставляет больше памяти для других вещей, которые находятся который может ускорить вашу систему.


83
2017-07-04 03:50



+1 для подробного объяснения. Я также хотел бы сохранить своп 2GiB на своих компьютерах. Если что-то пойдет не так - утечки памяти и т. Д., Тогда вы можете увидеть, что своп идет вверх и ищет проблему до того, как возникнет нехватка памяти. Это система безопасности, а также инструмент для повышения производительности. - Joe
На моем нетбуке, который имеет только 2 ГБ оперативной памяти, я держу 4 ГБ свопа. Это связано с тем, что я использую нетбук для гораздо большего, чем он предназначен, и для моих программ часто требуется более 2 ГБ памяти. Поскольку Linux ведет себя очень плохо в ситуациях с недостаточной памятью, я предпочитаю иметь большую систему безопасности. И у меня много дискового пространства. - Scott Severance
Если вашим программам часто требуется более 2 ГБ памяти, я бы подумал о том, чтобы там было больше памяти (это ультра-дешево!), Потому что изнурительная оперативная память будет вредить производительности. В интересах других читателей: сделайте так, чтобы вы не просто смотрели на кэш-память, которая предполагаемый загрузить оперативную память - см. другие ссылки на free -m, - thomasrutter
@neon_overload: Я должен просто отметить, что, согласно HP, максимальная оперативная память моего нетбука составляет 1 ГБ. У меня сейчас 2 ГБ, и интернет-источники предполагают, что 2 ГБ - это фактический максимум. Таким образом, необходимость такого рода обходных решений. - Scott Severance
@thomasrutter: как ваш ответ меняется для больших серверов, один из моих имеет 1TB (да один полный терабайт) RAM и все еще использует swap; какая настройка swappiness и какой раздел подмены размера вы бы порекомендовали? - chrisinmtown


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

Переключение swap немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной памяти для хранения всего в ОЗУ плюс все в свопе, пытаясь отключить обмен, приведет к тому, что ваша система перестанет реагировать. Мой скрипт сначала проверяет, достаточно ли свободной ОЗУ (что занимает немного времени, поскольку фактическое количество свободной ОЗУ отличается от того, что free отчеты как бесплатные), тогда только переключает swap, если это так. Но, если вы немного отстаете от ОЗУ, не запускайте еще один важный процесс во время работы скрипта. Вот:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Вы должны запустить этот скрипт как root (например, с помощью sudo). Этот скрипт не оставит вашу систему невосприимчивой; если у вас недостаточно ОЗУ, он откажется переключать swap. Я использовал этот скрипт без проблем уже около пяти лет.


21
2017-07-04 02:38



+1 для скрипта. Возможно, вам захочется немного модернизировать его, изменив MB на MiB на выходах. Я написал подобный сценарий без всех (хороших) тестов безопасности, которые вы включили. На моей старой тетради, где был использован обмен, потребовалось некоторое время, чтобы бежать - через минуту или две, но ничего не повредило. Через некоторое время он потерпит неудачу, потому что для его работы недостаточно свободной памяти, но это не вызвало дополнительных проблем. Я должен был перезагрузиться, чтобы разобраться, когда это произошло. Это связано с тем, что выглядело как утечка памяти в передаче (с тех пор, как я полагаю) и имеет только 2GiB RAM. - Joe
Если что-то было перенесено на замену, и оно остается в свопе, это обычно хорошо - это означает, что данные фактически не используются, и он освобождает часть вашего ОЗУ для других вещей, что приводит к потенциальному повышению скорости. Что заставило вас поверить, что эти данные не должны быть заменены, и вместо этого следует использовать более ценную ОЗУ? Обычно ядро ​​хорошо понимает, что не используется, и которое может безопасно оставаться в swap, чтобы освободить RAM. - thomasrutter
@neon: Имейте в виду, что мои машины имеют 2 ГБ и 3 ГБ оперативной памяти, соответственно, что в наши дни довольно мало. Свидетельство в исполнении. Например, воссоздание меню или программ переключения может быть медленным из-за замены, также как и эффекты Compos visoal. Эта медлительность вылечивается путем переключения свопа, демонстрируя тем самым, что по крайней мере в некоторых ситуациях алгоритмы оптимизации ядра являются субоптимальными. Я не могу спорить с повторным опытом. - Scott Severance
Уф !! Это только увеличилось до 0% от обмена. У меня не было много времени, чтобы изучить этот полный вопрос и его ответ, но я любил его читать, когда я получаю свободное время. - AzkerM
Почему бы вам просто не поставить swappiness на низкое значение? Это, похоже, делает то же, что и ваш сценарий, но гораздо более контролируемым образом. - jhfrontz


Обычно своп остается неиспользованным в современных системах. По моему опыту, процессы, которые работают в течение длительного времени без интенсивных операций, переносятся на swap с помощью linux.
Это заставляет несколько затронутых программ работать медленно.
Если у вас много свободного места, вы можете отключить своп, выполнив команду:
swapoff -av (вам понадобиться sudo права на это.)
Если вам не нравится своп, вы можете включить его, используя симметричную команду:
swapon -av (еще раз sudo обязательный).


4
2018-06-29 22:24



Поворот смены полностью переполнен, так как swapiness = 0 делает то же самое, но безопаснее (если вы делать в конечном итоге слишком много материала в памяти, оно что-то подбросит в swap). - Brendan Long
@BrendanLong Fair point .. Спасибо, что научил меня. :) - drake01


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

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

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

В крайнем случае вы можете использовать файл как своп-устройство. Это полезно, если вам требуется дополнительное пространство подкачки временно.


3
2018-06-30 04:02





Я редактировал сценарий Скотта Северанса чтобы соответствовать новым версиям бесплатных, которые уже содержат общее доступное поле памяти.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

2
2017-10-03 13:37