Это плохая идея создать скрипт cron, который очищает своп каждый час?

26

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

Я сделал короткую cronкоманду, чтобы автоматизировать это, и у меня хорошие результаты:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

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

Иван Срака
источник
29
Прошу прощения за мое невежество, но что именно вы имеете в виду, говоря, что пространство SWAP увеличивается со временем и освобождается в ОЗУ выделенной памяти ? Обычно вы выделяете некоторое пространство как своп для системы и никогда больше не слышите об этом. Кого волнует, сколько свопа фактически занято? В чем проблема?
десерт
5
Почему ты вообще хочешь это сделать? Почему вы думаете, что использование свопа это плохо? О каком количестве свопов мы говорим?
marcelm
25
Я немного озадачен. Вы продолжаете говорить о «проблеме», но на самом деле не описываете какие-либо негативные последствия. Почему вы считаете это проблемой?
Дэвид Шварц
17
Если что-то попадает в своп и остается там, это потому, что ничто его не использует. И если ничего не использует его, то лучше пусть RAM будет использоваться для чего - то , что имеет доступ, как кэш, чем поменять местами данные обратно в.
Hobbs
12
Как это лучше, чем просто оставить своп?
user253751

Ответы:

51

Используя это так: да, плохо. Вам действительно нужно проверить, достаточно ли памяти, прежде чем выключать своп. Смотрите /ubuntu//a/90399/15811 для лучшей версии.

Также: ты уверен в этом? Распределение свопа не означает использование свопа. Команда vmstat, столбцы si(поменять местами) и so(поменять местами). Если те остаются 0, у вас есть другая проблема. По моему опыту, своп вряд ли используется, и вы, возможно, не используете его, думая, что он не опустошает его, но нечего опустошать.

Rinzwind
источник
3
Чего ждать? Если для успешного свопинга недостаточно памяти, убийца ООМ сначала убивает свопф. Да, они фактически жестко запрограммированы (это проверяется системным вызовом).
Иисус Навин
@ Джошуа уверен, но он хочет, чтобы все работало автоматически. Не ошибка.
Rinzwind
4
Чтобы уточнить, не вдаваясь в написание собственного ответа, использование свопов со временем не так уж и плохо . Это означает, что ядро ​​медленно выясняет, какой мусор потребляет память, никогда не используется, и перемещает его для замены, чтобы память могла использоваться для вещей, которые действительно вам помогают (например, возможность хранить больше кэшированных данных, так что он не должен продолжать сбрасывать его и перечитывать с диска).
R ..
@Rinzwind cron отлично работает с ошибками, а связанный скрипт тоже не использует vmstat.
jpaugh
41

Я бы сказал, что это плохая идея. Если вы считаете, что у вас есть свободная память и активный процесс не перемещается из раздела подкачки в ОЗУ, то либо у вас недостаточно свободной памяти, чем вы думаете, либо процесс не так активен, как вы думаете является.

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

Мур
источник
1
+1: в чем дело? Никогда не меняйте работающую систему , я не думаю, что нужно так портить основные функции системы, особенно без необходимости.
десерт
3
У меня иногда возникают проблемы, когда я убиваю процесс с утечкой памяти (которая вынуждает все остальное в swap), оставляя меня с ~ 10% используемой оперативной памяти ... но все работающие программы находятся в swap, пока я не получу доступ к ним снова. Таким образом, каждый раз, когда вы что-то трогаете, задержка составляет две секунды. Я вижу, откуда исходит ОП, и было бы неплохо сделать это автоматически, но это не правильный путь.
Кто-то где-то
1
@SomeoneSomewhere Но это не так, во всяком случае. Если процесс теряет память, то по определению он не использует эту память активно (это не чтение и запись); это просто распределили, случайно. Если вокруг есть другие активные процессы, утечка памяти будет заменена, и это будет ваш обмен, полный мусора, а не физическая память.
Дэвид Ричерби
@DavidRicherby Если у вас есть программа, открытая в фоновом режиме, то эта программа все еще менее активна, чем утечка памяти - и когда вы собираетесь переключиться на нее, она должна выйти из режима подкачки.
Кто-то где-то
@ SomeoneSomewhere Вы, похоже, неправильно поняли, как работает система памяти. Вам не нужно иметь весь процесс в физической памяти: подкачка управляется на уровне отдельных страниц. Любая страница, которая не использовалась в течение некоторого времени, может быть заменена, и страница, полностью состоящая из просочившейся памяти, никогда не будет использоваться снова, поэтому никогда не будет возвращена обратно после ее замены.
Дэвид Ричерби
34

Это плохая идея.

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

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

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

Ядро также всегда будет использовать пространство подкачки, как только физическая память заполнится более чем на 50%, поэтому эти цифры будут отличны от нуля, даже если у вас достаточно памяти.

Саймон Рихтер
источник
4
всегда : я полагаю, вы предполагаете, что для /proc/sys/vm/swappinessнего оставлено значение по умолчанию 70, что хорошо для серверов и довольно агрессивно выводит грязные страницы из процессов, которые их не трогали какое-то время, чтобы освободить место для дополнительного кэша страниц. Это часто плохо для настольных компьютеров, потому что alt-tab может работать медленно.
Питер Кордес
@PeterCordes, если страницы действительно были удалены, то кеши видели больше обращений, чем рассматриваемые страницы приложения, поэтому использование их в качестве дисковых кешей принесло чистую выгоду. Я вижу, как производительность Alt-Tab более заметна для пользователя, чем, например, время компиляции для большого проекта, но мне трудно сформулировать политику, гарантирующую мгновенный ответ без ущерба для производительности.
Саймон Рихтер
1
Другими словами: ядро ​​настроено на использование outputput ( swappiness=70), но задержка важнее для взаимодействия с пользователем на рабочем столе. Это компромисс. Если вы регулярно компилируете вещи, которые немного слишком велики, чтобы оставаться в кэше страниц, то, конечно, оставьте swappinessнемного выше, например, 20 или 30 вместо 5 или 10. См. Также akitaonrails.com/2017/01/17/optimizing-linux-for медленные компьютеры . Значение vm.vfs_cache_pressureниже 100 также способствует кэшированию метаданных inode / directory над страницами данных, что также хорошо для отзывчивости пользовательского интерфейса.
Питер Кордес
1
Другие параметры: пороги обратной записи lonesysadmin.net/2013/12/22/… . Они управляют тем, как быстро Linux начинает запись на диск после того, как что-то записывается в файлы, и сколько грязных страниц разрешено. (т.е. сколько памяти можно потратить на кеширование записи)
Питер Кордес,
21

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

У вас есть два случая:

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

Итак, есть два основных момента:

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

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

Если вы хотите настроить поведение ядра, смотрите параметр swappiness .

Два дополнительных ресурса предоставлены @ peter-cordes:

Если вы действительно хотите иметь пустой своп, вы можете отключить своп навсегда. Я не понимаю, почему его включение в течение часа, а затем его опустошение имеет преимущества по сравнению с отсутствием свопинга.

алло
источник
1
См. Также akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers и lonesysadmin.net/2013/12/22/… для получения дополнительных рекомендаций по настройке / деталей.
Питер Кордес
5

Вы можете достичь тех же результатов, сказав ядру освободить кеши:

echo 3 > /proc/sys/vm/drop_caches

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

Алекс С
источник
0

Вопреки общему мнению, SWAP сам по себе неплохой .
Что на самом деле замедляет работу вашей системы, так это активность ядра, которая перемещает Данные из ОЗУ в SWAP и обратно в ОЗУ swappiness.
Система делает это автоматически, так как она настроена с помощью swappiness.
Это приводит к тому, что память из неактивных процессов сбрасывается в раздел жесткого диска.
Я сам в течение многих лет работал с машиной, на которой не было такого большого количества оперативной памяти, и у меня всегда было немного используемой памяти SWAP. Тем не менее, моя машина работала нормально, пока вы не начали перемещать память обратно в ОЗУ, возможно, пытаясь закрыть открытое приложение. Затем рабочая нагрузка начала увеличиваться.

  • Таким образом, благодаря постоянной очистке памяти SWAP рабочая нагрузка на ваш компьютер значительно возрастет.
  • Запуск приложений, чья память находится в разделе SWAP, может привести к повреждению при их выполнении.

Скорее, я бы посоветовал вам внимательно изучить, какое приложение использует вашу память в командной строке вместе с htopприложением, и решить закрыть какое-либо приложение. Это gnome-system-monitorможет дать вам хорошее понимание, в его вкладке Process.
Если у вас большие приложения, которые используют много оперативной памяти. Не запускайте их все сразу.

Бодо Хьюго Барвич
источник