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

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

Вы могли бы попробовать изменить свое значение "swappiness":

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

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

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

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

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

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

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

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

cat /proc/sys/vm/swappiness

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

sudo sysctl vm.swappiness=10

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

gksudo gedit /etc/sysctl.conf

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

vm.swappiness=10

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

Бежать sudo sysctl --load=/etc/sysctl.conf после редактирования файла необходимо применить изменения

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

В вашем вопросе есть несколько различных аспектов.

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

Как Linux использует оперативную память (очень упрощенно)

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

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

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

Это не специфичная ситуация для Linux - все современные операционные системы работают таким образом. Разные операционные системы могут просто по-разному сообщать о свободной оперативной памяти: некоторые включают кэш как часть того, что они считают "свободным", а некоторые могут и нет.

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

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

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

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

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

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

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

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

Но как swap может ускорить мою систему? Разве обмен не замедляет процесс?

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

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

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

Как только данные будут подкачаны, когда они снова появятся?

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

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

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

#!/bin/bash# Make sure that all text is parsed in the same languageexport LC_MESSAGES=en_US.UTF-8export LC_COLLATE=en_US.UTF-8export LANG=en_US.utf8export LANGUAGE=en_US:enexport LC_CTYPE=en_US.UTF-8# Calculate how much memory and swap is freefree_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 workif [[ $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 -aelse    echo "Not enough free memory. Exiting."    exit 1fi

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

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

#!/bin/bashfree_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 -aelse    echo "Not enough free memory. Exiting."    exit 1fi

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

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

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

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

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

Пожалуйста, поделитесь содержимым или выводом следующих команд / файлов, чтобы лучше помочь нам устранить вашу проблему (*инструкции в этом ответе *): free -m, `top -b 1’

Я должен отредактировать заголовок, чтобы добавить “… но я слишком хочу спать, чтобы беспокоиться прямо сейчас, так что вы, ребята, тоже вздремните” : P

Завтра я обновлю вопрос с помощью вставок этих команд. Сейчас 12 часов ночи :frowning: