Я думал, что вся суть подкачки заключается в том, чтобы действовать как временная сеть безопасности хранения, когда ОЗУ заполнена, но мой раздел подкачки постоянно используется, хотя иногда у меня бывает до 3 ГБ свободной ОЗУ. Это нормально?
Я думал, что вся суть подкачки заключается в том, чтобы действовать как временная сеть безопасности хранения, когда ОЗУ заполнена, но мой раздел подкачки постоянно используется, хотя иногда у меня бывает до 3 ГБ свободной ОЗУ. Это нормально?
Ответы:
Вы можете попробовать изменить значение "swappiness":
Из FAQ по Ubuntu Swap :
Что такое подкачка и как мне ее поменять?
Параметр swappiness контролирует стремление ядра перемещать процессы из физической памяти на диск подкачки. Поскольку диски намного медленнее, чем ОЗУ, это может привести к более медленному времени отклика для системы и приложений, если процессы слишком агрессивно перемещаются из памяти.
swappiness может иметь значение от 0 до 100
swappiness = 0 говорит ядру избегать выгрузки процессов из физической памяти как можно дольше. Для версии ядра 3.5 и новее это отключает подкачку.
swappiness = 100 говорит ядру агрессивно выгружать процессы из физической памяти и перемещать их в кеш подкачки
По умолчанию в Ubuntu используется swappiness = 60. Снижение значения swappiness по умолчанию, вероятно, улучшит общую производительность типовой установки Ubuntu на рабочем столе. Рекомендуется значение swappiness = 10, но не стесняйтесь экспериментировать. Примечание. Установки сервера Ubuntu предъявляют различные требования к производительности для настольных систем, и значение по умолчанию 60, вероятно, более подходит.
Чтобы проверить значение swappiness
cat /proc/sys/vm/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
sudo sysctl --load=/etc/sysctl.conf
после редактирования файла, чтобы применить изменения
Есть несколько разных аспектов вашего вопроса.
Во-первых, каково ваше определение «бесплатный». На самом деле это не так просто, как кажется в Linux (или любой современной операционной системе).
Как Linux использует оперативную память (очень упрощенно)
Каждое приложение может использовать часть вашей памяти. Linux использует всю остальную незанятую память (кроме последних нескольких Мб) в качестве «кэша». Это включает в себя кэш страниц, кэши узлов и т. Д. Это хорошо - это помогает ускорить работу кучи. Как запись на диск, так и чтение с диска могут быть значительно ускорены кэшем.
В идеале у вас достаточно памяти для всех ваших приложений, и у вас еще есть несколько сотен Мбайт для кеша. В этой ситуации, пока ваши приложения не увеличивают использование памяти и система не пытается получить достаточно места для кэша, не требуется никакой подкачки.
Как только приложения требуют больше оперативной памяти, они просто уходят в часть пространства, которое использовалось кешем, сокращая кеш. Распределение кеша является дешевым и достаточно простым, что выполняется просто в режиме реального времени - все, что находится в кеше, является либо просто второй копией того, что уже находится на диске, поэтому его можно просто мгновенно освободить, либо это то, что мы бы сделали все равно пришлось записать на диск в течение следующих нескольких секунд .
Это не специфическая ситуация для Linux - все современные операционные системы работают таким образом. Различные операционные системы могут просто сообщать о свободной оперативной памяти по-разному: некоторые включают кэш как часть того, что они считают «свободным», а некоторые - нет.
Когда вы говорите о свободной оперативной памяти, гораздо важнее включить кэш, потому что он практически бесплатный - он доступен, если любое приложение запросит его. В Linux free
команда сообщает об этом обоими способами - первая строка включает кэш в столбце используемой оперативной памяти, а вторая строка включает кэш (и буферы) в свободном столбце.
Как Linux использует своп (еще более упрощенный)
После того, как вы израсходовали достаточно памяти, которой недостаточно для бесперебойной работы кэша, Linux может решить перераспределить часть неиспользуемой памяти приложения из ОЗУ для замены.
Это не делает это в соответствии с определенным отключением. Это не значит, что вы достигли определенного процента распределения, тогда Linux начинает меняться. У него довольно «нечеткий» алгоритм. Принимается во внимание множество вещей, которые лучше всего можно описать как «насколько сильно давление для выделения памяти». Если существует большое «давление» для выделения новой памяти, то это увеличит шансы, что некоторые из них будут заменены, чтобы освободить место. Если будет меньше «давления», это уменьшит эти шансы.
Ваша система имеет настройку «swappiness», которая помогает вам настроить, как рассчитывается это «давление». Обычно не рекомендуется изменять это вообще, и я бы не рекомендовал вам изменять это. Обмен в целом - очень хорошая вещь - хотя есть несколько крайних случаев, когда это снижает производительность, если вы посмотрите на общую производительность системы, это чистая выгода для широкого круга задач. Если вы уменьшите объем перестановки, вы позволите уменьшить объем кеш-памяти немного больше, чем это было бы в противном случае, даже если это действительно может быть полезно. Является ли это достаточно хорошим компромиссом для любой проблемы, с которой вы сталкиваетесь при обмене, зависит от вас. Вы должны просто знать, что вы делаете, вот и все.
Существует хорошо известная ситуация, когда своп действительно снижает воспринимаемую производительность в настольной системе, и это происходит из-за того, как быстро приложения могут снова реагировать на пользовательский ввод после долгого простоя и большого количества фоновых процессов в IO (таких как ночное резервное копирование) запустить. Это очень заметная медлительность, но ее недостаточно, чтобы оправдать отключение свопа, и ее очень трудно предотвратить в любой операционной системе. Отключите подкачку, и эта первоначальная медлительность после резервного копирования / проверки на вирусы может не произойти, но система может работать немного медленнее в течение всего дня. Эта ситуация не ограничивается Linux.
При выборе того, что следует перенести на диск, система пытается выбрать память, которая фактически не используется - для чтения или записи. Он имеет довольно простой алгоритм для расчета этого, который выбирает большую часть времени.
Если у вас есть система с огромным объемом ОЗУ (на момент написания 8 ГБ - это огромный объем для типичного дистрибутива Linux), то вы очень редко попадете в ситуацию, когда подкачка вообще нужна. Вы можете даже попробовать отключить своп. Я никогда не рекомендую делать это, но только потому, что вы никогда не знаете, когда больше оперативной памяти может спасти вас от сбоя некоторых приложений. Но если вы знаете, что вам это не понадобится, вы можете это сделать.
Но как обменяться может ускорить мою систему? Разве обмен не замедляет вещи?
Передача данных из оперативной памяти в swap - это медленная операция, но она выполняется только тогда, когда ядро почти уверено, что общее преимущество перевесит это. Например, если память вашего приложения выросла до такой степени, что у вас почти не осталось кеша, и ваш ввод-вывод очень неэффективен из-за этого, вы можете на самом деле добиться гораздо большей скорости из своей системы, освободив часть памяти, даже после первоначальной стоимости обмена данными, чтобы освободить их.
Это также последнее средство, если ваши приложения действительно запрашивают больше памяти, чем у вас есть. В этом случае обмен необходим для предотвращения ситуации нехватки памяти, которая часто приводит к сбою приложения или его принудительному уничтожению.
Подкачка связана только со временем, когда ваша система работает плохо, потому что это происходит в то время, когда у вас заканчивается неиспользуемая оперативная память, что может замедлить работу вашей системы (или сделать ее нестабильной), даже если у вас не было подкачки. Таким образом, чтобы упростить вещи, обмен происходит, потому что ваша система увязла, а не наоборот.
Когда данные в свопе, когда они выходят снова?
Перенос данных из подкачки (по крайней мере для традиционных жестких дисков) так же трудоемок, как и вставка их туда. Понятно, что ваше ядро будет так же неохотно удалять данные из свопинга, особенно если они на самом деле не используются (то есть читаются или записываются). Если у вас есть данные в обмене , и это не используется, то на самом деле это хорошо, что она остается в своп, так как она оставляет больше памяти для других вещей , которые являются используются, потенциально ускорения вашей системы.
free -m
.
Установка значения подкачки не работает в каждой ситуации. Если это работает для вас, отлично. Если нет, я написал скрипт для периодической очистки свопа, выключая и снова включая его.
Переключение с переключением немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной оперативной памяти для хранения всего в оперативной памяти, а также всего содержимого подкачки, попытка отключить подкачку приведет к тому, что ваша система перестанет отвечать на запросы. Мой сценарий сначала проверяет, достаточно ли свободной оперативной памяти (что занимает немного времени, так как фактический объем свободной оперативной памяти отличается от того, что free
сообщается как свободная), а затем только переключает своп, если это так. Но, если у вас мало оперативной памяти, не запускайте другой важный процесс во время работы скрипта. Вот:
#!/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
). Этот скрипт не оставит вашу систему без ответа; если у вас недостаточно оперативной памяти, он не сможет переключить своп. Я использовал этот скрипт без проблем в течение почти пяти лет.
Обычно своп остается неиспользуемым в современных системах. По моему опыту, процессы, которые выполняются в течение долгого времени без интенсивных операций, переключаются на Linux подкачки.
Это приводит к тому, что несколько затронутых программ работают медленно.
Если у вас много оперативной памяти, вы можете выключить своп, выполнив команду:
swapoff -av
(вам понадобятся sudo
права на нее.)
Если вам не нравится своп, вы можете включить его, используя симметричную команду:
swapon -av
( снова sudo
требуется).
Как только своп используется для программы, он имеет тенденцию оставаться отображенным на весь срок действия программы. У многих программ есть код (и данные), который используется редко. Как только память выгружается, она вряд ли будет выгружена.
Один из способов принудительно перенести эти страницы в память - отключить устройство подкачки. Если у вас есть два, вы можете выключить один, включить его снова, а затем выключить второй. Если своп действительно нужен, он будет перемещаться между устройствами. Вы можете просто отключить устройство подкачки (или файл), но если вам действительно нужно пространство подкачки, могут произойти радикальные вещи.
Помимо обычных вещей в памяти, tempfs использует пространство подкачки и будет выгружаться, как и остальная часть памяти. Если вы запускаете что-то, что требует много временного диска, это может привести к замене страниц. Созданные временные файлы больше не могут использоваться через пару минут и являются хорошими кандидатами для переноса на устройство подкачки.
В крайнем случае вы можете использовать файл в качестве устройства подкачки. Это полезно, если вам нужно дополнительное пространство подкачки временно.
Я отредактировал скрипт Scott Severance, чтобы он соответствовал более новым версиям free, которые уже включают в себя поле общей доступной памяти.
#!/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
free -m
,top -b 1