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

175

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

    
задан Mysterio 29.06.2012 в 22:16
источник

6 ответов

149

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

Из FAQ по обмену Ubuntu :

  

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

     

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

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

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

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

  6.   

Значение по умолчанию в 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      

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

Также вы можете проверить: Ссылка

    
ответ дан jpetersen 29.06.2012 в 23:10
источник
81

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как только данные находятся в swap, когда он снова появляется?

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

ответ дан thomasrutter 04.07.2012 в 03:50
источник
20

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

Переключение swap немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной памяти для хранения всего в RAM plus всего в свопе, попытка отключить 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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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. Я использовал этот скрипт без проблем уже около пяти лет.

    
ответ дан Scott Severance 04.07.2012 в 02:38
источник
4

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

    
ответ дан drake01 29.06.2012 в 22:24
источник
3

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

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

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

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

ответ дан BillThor 30.06.2012 в 04:02
источник
2

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

#!/bin/bash

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

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
    
ответ дан derberlinersmurf 03.10.2017 в 13:37
источник

Ознакомьтесь с другими вопросами по меткам