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

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

183
задан 30 June 2012 в 04:19

41 ответ

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

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

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

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

3
ответ дан 6 August 2018 в 00:35

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

4
ответ дан 7 August 2018 в 18:01

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

21
ответ дан 7 August 2018 в 18:01

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

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

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

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

3
ответ дан 7 August 2018 в 18:01

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

4
ответ дан 10 August 2018 в 06:49

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

21
ответ дан 10 August 2018 в 06:49

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

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

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

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

3
ответ дан 10 August 2018 в 06:49

Я отредактировал скрипт Скотта Северанса , чтобы он соответствовал более новым версиям 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
21
ответ дан 15 August 2018 в 18:45
  • 1
    +1 за скрипт. Возможно, вы захотите немного модернизировать его, изменив значение MB на MiB в выходных данных. Я написал аналогичный сценарий без всех (хороших) тестов безопасности, которые вы включили. На моем старом ноутбуке, где интенсивно использовался своп, для запуска потребовалось некоторое время - минуту или две, но ничего не повредило. Время от времени это не удавалось, потому что не хватало свободной памяти для его работы, но это не вызывало дополнительных проблем. Я должен был перезагрузиться, чтобы прояснить ситуацию, когда это произошло. Это было связано с тем, что в Transmission выглядело как утечка памяти (с тех пор, как она исправлена, я считаю) и имея только 2 ГБ ОЗУ. – Joe 4 July 2012 в 23:36
  • 2
    Если что-то было перемещено для обмена, и оно остается в режиме обмена, это, как правило, хорошо - это означает, что данные фактически не используются, и они освобождают часть вашей ОЗУ для других операций, что может привести к увеличению скорости. Что заставило вас поверить, что эти данные не должны быть подкачкой и должны занимать более ценную оперативную память? Обычно ядро ​​достаточно хорошо знает, что не используется, и что может безопасно оставаться в режиме подкачки для освобождения оперативной памяти. – thomasrutter 6 July 2012 в 05:37
  • 3
    @neon: Имейте в виду, что мои машины имеют 2 ГБ и 3 ГБ ОЗУ соответственно, что в наши дни довольно мало. Доказательства в исполнении. Например, запуск меню или переключение программ может быть медленным из-за подкачки, как и эффекты Compos visoal. Эта медлительность устраняется переключением свопа, демонстрируя тем самым, что по крайней мере в некоторых ситуациях алгоритмы оптимизации ядра являются неоптимальными. Я не могу спорить с повторным опытом. – Scott Severance 6 July 2012 в 09:31
  • 4
  • 5
    Почему бы вам просто не установить своппинг на низкое значение? Казалось бы, это делает то же самое, что и ваш сценарий, но гораздо более контролируемым образом. – jhfrontz 9 February 2016 в 19:49

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

4
ответ дан 15 August 2018 в 18:45
  • 1
    Полное отключение свопа - это излишне, так как swappiness = 0 делает то же самое, но безопаснее (если у вас do слишком много вещей в памяти, он что-то выбрасывает в своп). – Brendan Long 30 June 2012 в 06:33
  • 2
    @BrendanLong Честная точка зрения. Спасибо за то, что научили меня. :) – drake01 30 June 2012 в 12:26

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

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

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

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

3
ответ дан 15 August 2018 в 18:45

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

Переключение свопа немного рискованно, если вы не будете осторожны. Если у вас недостаточно свободной оперативной памяти для хранения всего в оперативной памяти плюс всего в разделе подкачки, попытка отключить подкачку приведет к тому, что ваша система перестанет отвечать на запросы. Мой скрипт сначала проверяет, достаточно ли свободной оперативной памяти (что занимает немного времени, так как фактический объем свободной оперативной памяти отличается от того, что 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). Этот скрипт не оставит вашу систему без ответа; если у вас недостаточно оперативной памяти, он не сможет переключить своп. Я использовал этот скрипт без проблем вот уже пять лет.

21
ответ дан 18 August 2018 в 21:36
  • 1
    +1 за скрипт. Возможно, вы захотите немного модернизировать его, изменив значение MB на MiB в выходных данных. Я написал аналогичный сценарий без всех (хороших) тестов безопасности, которые вы включили. На моем старом ноутбуке, где интенсивно использовался своп, для запуска потребовалось некоторое время - минуту или две, но ничего не повредило. Время от времени это не удавалось, потому что не хватало свободной памяти для его работы, но это не вызывало дополнительных проблем. Я должен был перезагрузиться, чтобы прояснить ситуацию, когда это произошло. Это было связано с тем, что в Transmission выглядело как утечка памяти (с тех пор, как она исправлена, я считаю) и имея только 2 ГБ ОЗУ. – Joe 4 July 2012 в 23:36
  • 2
    Если что-то было перемещено для обмена, и оно остается в режиме обмена, это, как правило, хорошо - это означает, что данные фактически не используются, и они освобождают часть вашей ОЗУ для других операций, что может привести к увеличению скорости. Что заставило вас поверить, что эти данные не должны быть подкачкой и должны занимать более ценную оперативную память? Обычно ядро ​​достаточно хорошо знает, что не используется, и что может безопасно оставаться в режиме подкачки для освобождения оперативной памяти. – thomasrutter 6 July 2012 в 05:37
  • 3
    @neon: Имейте в виду, что мои машины имеют 2 ГБ и 3 ГБ ОЗУ соответственно, что в наши дни довольно мало. Доказательства в исполнении. Например, запуск меню или переключение программ может быть медленным из-за подкачки, как и эффекты Compos visoal. Эта медлительность устраняется переключением свопа, демонстрируя тем самым, что по крайней мере в некоторых ситуациях алгоритмы оптимизации ядра являются неоптимальными. Я не могу спорить с повторным опытом. – Scott Severance 6 July 2012 в 09:31
  • 4
    Уф !! Это просто снизило до 0% от свопа .... У меня не было много времени, чтобы разобраться в этом полном вопросе и его ответе, но я предпочел его прочитать, когда у меня будет немного свободного времени. – AzkerM 12 April 2014 в 15:25
  • 5
    Почему бы вам просто не установить своппинг на низкое значение? Казалось бы, это делает то же самое, что и ваш сценарий, но гораздо более контролируемым образом. – jhfrontz 9 February 2016 в 19:49

Другие вопросы по тегам:

Похожие вопросы: