Вопрос или проблема
Я думал, вся суть swap заключалась в том, чтобы служить временной защитной сетью хранения, когда RAM заполнена, но мой swap-раздел постоянно используется, даже когда у меня иногда есть до 3 ГБ свободной RAM. Это нормально?
Вы можете попробовать изменить значение “swappiness”:
Из Swap FAQ Ubuntu:
Что такое swappiness и как его изменить?
Параметр swappiness контролирует склонность ядра перемещать процессы из физической памяти на swap-диск. Поскольку диски намного медленнее, чем RAM, это может привести к увеличению времени отклика для системы и приложений, если процессы слишком агрессивно вытесняются из памяти.
swappiness может иметь значение от 0 до 100
swappiness=0 говорит ядру избегать swap как можно дольше. Для версий ядра 3.5 и новее это отключает swappiness.
swappiness=100 говорит ядру агрессивно перемещать процессы из физической памяти в swap-кеш
Значение по умолчанию в Ubuntu — swappiness=60. Уменьшение этого значения может улучшить общую производительность типичной десктопной установки 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
Сохраните файл и перезагрузите.
Запустите sudo sysctl --load=/etc/sysctl.conf
после редактирования файла, чтобы применить изменения
Кроме того, вы можете ознакомиться с: https://askubuntu.com/a/103916/54187
В вашем вопросе есть несколько аспектов.
Во-первых, ваше определение “свободного”. На самом деле, это не так просто, как кажется, в Linux (или в любой современной операционной системе).
Как Linux использует RAM (очень упрощенно)
Каждое приложение может использовать часть вашей памяти. Linux использует всю иначе не занятую память (за исключением последних нескольких МБ) как “кеш”. Это включает в себя page cache, inode caches и другие. Это хорошо — это значительно ускоряет вещи. Как запись на диск, так и чтение с диска могут быть значительно ускорены с помощью кеша.
В идеале, у вас достаточно памяти для всех ваших приложений, и у вас все еще есть несколько сотен МБ для кеша. В такой ситуации, пока ваши приложения не увеличивают использование памяти и система не испытывает затруднений с получением достаточно места для кеша, в swap нет необходимости.
Когда приложения требуют больше RAM, это просто идет в часть пространства, используемого кешем, уменьшая его. Деактивация кеша дешева и проста, так что это делается в реальном времени — все, что находится в кеше, либо просто вторая копия чего-то, что уже на диске, так что это можно просто деактивировать мгновенно, либо это то, что нам все равно пришлось бы сбросить на диск в следующие несколько секунд в любом случае.
Это не ситуация, специфичная для Linux — все современные операционные системы работают так. Различные операционные системы могут просто по-разному сообщать о свободной RAM: некоторые включают кеш как часть того, что они считают “свободным”, а некоторые могут не включать.
Когда вы говорите о свободной RAM, гораздо более значимо включать кеш, потому что он фактически свободен — он доступен, если любое приложение его запросит. В Linux команда free
сообщает об этом обоими способами — в первой строке кеш включен в использованную RAM, во второй строке кеш (и буферы) включены в свободную колонку.
Как Linux использует swap (еще более упрощенно)
Когда вы используете достаточно памяти, чтобы не осталось места для нормально работающего кеша, Linux может решить перенести некоторую неиспользуемую память приложения из RAM в swap.
Он делает это не на основе определенного порога. Это не так, как если бы вы достигли определенного процента использования, и тогда Linux начинает swapping. У него довольно “размытый” алгоритм. Он учитывает множество факторов, что можно описать как “какое давление на выделение памяти”. Если существует много “давления”, чтобы выделить новую память, то это повысит вероятность того, что что-то будет перенесено в swap, чтобы освободить больше места. Если давление меньше, то вероятность уменьшится.
В вашей системе есть настройка “swappiness”, которая помогает вам настраивать, как это “давление” рассчитывается. Обычно не рекомендуется изменять это вообще, и я бы не рекомендовал вам его изменять. Swapping в целом очень полезен – хотя есть несколько пограничных случаев, когда это вредно для производительности, если рассматривать общую производительность системы, это чистая выгода для широкого спектра задач. Если вы уменьшаете swappiness, вы позволяете объему памяти кеш снижаться немного больше, чем это произошло бы в противном случае, даже когда это может быть действительно полезно. Стоит ли это достаточной компенсацией за какую-либо проблему, которую у вас есть с swap, решать вам. Главное, вы должны понимать, что делаете.
Существует хорошо известная ситуация, в которой swap действительно ухудшает восприятие производительности на настольной системе, и это в том, как быстро приложения могут снова реагировать на ввод пользовательских данных после того, как они были оставлены в простое на длительное время, и запущены фоновые процессы с интенсивным вводом-выводом (например, ночное создание резервных копий). Это очень заметное затруднение, но недостаточное, чтобы оправдать полное отключение swap и очень трудно предотвратить в любой операционной системе. Отключите swap, и это начальное затруднение после резервного копирования/проверки вирусов может не случиться, но система может работать немного медленнее весь день. Это не ситуация, ограниченная только Linux.
Когда выбирается, что будет перемещено на диск, система старается выбрать память, которую на самом деле не используют – не читают и не записывают. У нее довольно простой алгоритм для этого, который выбирает хорошо большинство времени.
Если у вас есть система с огромным количеством RAM (на момент написания, 8 ГБ — это огромное количество для типичной дистрибуции Linux), то ситуация, когда потребуется swap, бывает очень редко. Вы можете даже попробовать отключить swap. Я никогда не рекомендую это делать, но только потому, что никогда не знаешь, когда больше RAM может спасти вас от сбоя приложения. Но если вы точно знаете, что вам это не потребуется, вы можете это сделать.
Но как swap может ускорить мою систему? Разве swapping не замедляет работу?
Перенос данных из RAM в swap — это медленная операция, но она выполняется только когда ядро практически уверено, что общая выгода будет перевешивать это. Например, если ваша память приложения увеличилась до такой степени, что у вас почти не осталось кеша, и ваш ввод-вывод очень неэффективен из-за этого, вы можете фактически получить гораздо больше скорости из вашей системы, освободив часть памяти, даже после начальных затрат на перенесение данных в swap.
Swap также является последним средством, если ваши приложения на самом деле запрашивают больше памяти, чем у вас на самом деле есть. В этом случае swap необходим, чтобы предотвратить ситуацию отсутствия памяти, которая часто приводит к сбою приложения или принудительному завершению.
Swap только ассоциируется с моментами, когда раз ваша система работает плохо, потому что это происходит в те моменты, когда у вас заканчивается используемая RAM, что замедлило бы вашу систему (или сделало бы ее нестабильной), даже если бы у вас не было swap. Таким образом, чтобы упростить объяснение, swap происходит потому что ваша система загружается, а не наоборот.
Когда данные попадают в swap, когда они снова извлекаются?
Передача данных из swap (по крайней мере, для традиционных жестких дисков) так же отнимает время, как и их размещение туда. Поэтому, очевидно, ваше ядро будет столь же нежелательно убирать данные из swap, особенно если оно фактически не используется (т.е., не читается и не записывается). Если у вас есть данные в swap, и они не используются, то фактически это хорошо, что они остаются в swap, поскольку это оставляет больше памяти для других вещей, которые используются, потенциально ускоряя вашу систему.
Установка значения swappiness не работает в каждой ситуации. Если это работает для вас, отлично. Если нет, я написал скрипт, который периодически очищает swap, отключая и снова включая его.
Переключение swap немного рискованно, если не быть внимательным. Если у вас недостаточно свободной RAM, чтобы содержать все в RAM плюс все в swap, попытка отключить swap приведет к тому, что система станет неотзывчивой. Мой скрипт сначала проверяет, достаточно ли свободной RAM (что требует некоторых усилий, поскольку фактическое количество свободной RAM отличается от того, что free
сообщает как свободное), затем только переключает swap, если это так. Но если у вас немного не хватает RAM, не запускайте другой крупный процесс, пока скрипт работает. Вот он:
#!/bin/bash
# Убедитесь, что весь текст анализируется на одном языке
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
# Рассчитайте, сколько памяти и swap свободно
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 "Свободная память:\t$total_free kB ($((total_free / 1024)) MB)\nИспользуемый swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
# Выполнение работы
if [[ $used_swap -eq 0 ]]; then
echo "Поздравляем! Swap не используется."
elif [[ $used_swap -lt $total_free ]]; then
echo "Очистка swap..."
swapoff -a
swapon -a
else
echo "Недостаточно свободной памяти. Выход."
exit 1
fi
Вы должны запустить этот скрипт от имени root (например, с помощью sudo
). Этот скрипт не оставит вашу систему неотзывчивой; если у вас недостаточно RAM, он откажется переключать swap. Я использую этот скрипт без проблем уже почти пять лет.
Я отредактировал скрипт Скотта Северенса, чтобы он соответствовал новым версиям free, которые уже включают поле общей доступной памяти.
#!/bin/bash
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"
echo -e "Свободная память:\t$free_mem kB ($((free_mem / 1024)) MiB)\nИспользуемый swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
echo "Поздравляем! Swap не используется."
elif [[ $used_swap -lt $free_mem ]]; then
echo "Очистка swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Недостаточно свободной памяти. Выход."
exit 1
fi
Вообще, swap остался неиспользованным на современных системах. По моему опыту, процессы, которые работают долгое время без интенсивных операций, перемещаются в swap обработчиком linux.
Это заставляет несколько затронутых программ работать медленно.
Если у вас много свободной памяти, вы можете отключить swap с помощью команды:
swapoff -av
(вам понадобятся права sudo
для этого.)
Если вам не нравится отключение swap, вы можете включить его, используя симметричную команду:
swapon -av
(опять же, требуется sudo
).
После того, как swap был использован для программы, он, как правило, остается задействованным на протяжении всей жизни программы. Многие программы содержат код (и данные), которые редко используются. После того как память перемещается в swap, маловероятно, что она будет извлечена обратно.
Один из способов заставить эти страницы вернуться в память — отключить устройство swap. Если у вас их два, вы можете выключить одно, снова включить, а затем выключить второе. Если swap действительно нужен, он переместится между устройствами. Можно просто отключить устройство swap (или файл), но если вам действительно нужно swap пространство, могут произойти серьезные вещи.
Помимо обычных вещей в памяти, tmpfs
использует swap пространство и поведет себя так же, как остальная память. Если вы запускаете что-то, требующее много временного диска, это может вынудить страницы перемещаться в swap. Созданные временные файлы могут больше не использоваться через несколько минут и являются хорошими кандидатами на перемещение в swap устройство.
В экстренной ситуации вы можете использовать файл в качестве устройства swap. Это удобно, если вам временно нужно больше swap пространства.
.
Ответ или решение
Использование swap-памяти, даже когда у вас есть значительное количество свободной оперативной памяти, может вызывать некоторое замешательство. Это обусловлено сложными механизмами управления памятью в современных операционных системах, таких как Linux.
Теория (T – Theory)
Многие пользователи считают, что swap (или подкачка) используется только тогда, когда оперативная память (RAM) заполнена. Однако это не совсем так. Swap предназначен для оптимизации работы системы и может использоваться даже при наличии свободного места в RAM. В Linux использование swap может активироваться в зависимости от параметра "swappiness", который определяет, насколько активно система будет перемещать данные из RAM в swap-память. Значение swappiness варьируется от 0 до 100, где 0 означает, что система будет использовать swap только в крайнем случае, а 100 указывает на активное использование swap наравне с RAM.
Linux также использует все неиспользуемое пространство в RAM для кэша, что улучшает скорость обращения к дисковым ресурсам. Это обычная практика во всех современных операционных системах, ибо кэширование значительно увеличивает производительность операций чтения и записи.
Пример (E – Example)
Предположим, у вас открыт веб-браузер и текстовый редактор. Операционная система может определить, что часть памяти, задействованная веб-браузером, долгое время не используется. В этом случае Linux может перенести эту неактивную память в swap, тем самым освобождая больше оперативной памяти для других активных процессов или кэширования. Этот процесс может произойти даже при наличии 3 ГБ свободной RAM.
Кроме того, существуют сценарии, когда swap может улучшить общую производительность системы. Например, при обработке больших объемов данных, когда требуется много памяти для кратковременных операций, использование swap позволит избежать возникновения ситуации Out of Memory, когда приложения могут аварийно завершиться из-за нехватки памяти.
Применение (A – Application)
Изменение параметра "swappiness" может помочь оптимизировать использование памяти в зависимости от ваших потребностей. Например, для серверов часто рекомендуется оставить значение swappiness по умолчанию (60), тогда как для настольных систем можно попробовать снизить это значение до 10, чтобы уменьшить использование swap и повысить отзывчивость системы.
Для этого:
-
Проверьте текущее значение swappiness с помощью команды:
cat /proc/sys/vm/swappiness
-
Измените значение временно командой:
sudo sysctl vm.swappiness=10
-
Для постоянного изменения отредактируйте файл
/etc/sysctl.conf
, добавив или изменив строку:vm.swappiness=10
-
Примените изменения:
sudo sysctl --load=/etc/sysctl.conf
Стоит отметить, что если вы заметили замедление в ответе системы при переключении между задачами после длительного простоя, это может указывать на недостатки работы swap. В таких случаях можно использовать предложенные скрипты для изменения состояния swap без вашего участия, чтобы тестировать, как это влияет на производительность.
Фактически, swap — это полезный механизм, который может улучшить стабильность и производительность вашей системы, если его правильно настроить и использовать с учетом специфики ваших задач. Необходимо экспериментировать с параметрами и внимательно следить за производительностью, чтобы найти оптимальный баланс между использованием RAM и swap.