Linux: как явно отменить все возможное?


59

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

Есть ли способ явно перенести все возможное из свопа обратно в оперативную память? Или, может быть, не все, а только некоторые конкретные данные процессов?

Ответы:


59

Я бы порекомендовал разрешить обычную замену памяти в Linux для вещей, которые фактически используются, по мере их использования.

Единственное, что я могу придумать, это выключить, а потом снова включить

sudo swapoff -a
sudo swapon -a

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


4
Работает, правда очень медленно :) Спасибо! Но все же я верю, что есть более элегантное решение :)
kolypto

7
Осторожнее с этим решением, оно принудительно вытащит все из свопинга ... если оно не умещается в физической памяти, ядро ​​запустит смертельного убийцу OOM. Я не знаю ни одной приятной команды «попытаться переместить все в ОЗУ, но изящно провалиться, если это невозможно».
Джулиано

1
Я попробовал это и обнаружил, что это работает очень медленно. Таким образом, можно отслеживать свободную оперативную память и убивать ее, swapoffесли объем памяти
уменьшается

2
Я не уверен, что убийство свопофа действительно остановит операцию. Зависит от того, как это реализовано.
Дуглас Лидер

3
Кажется, что команда swapoff делает что-то вроде «не разрешать замену новых записей», в то время как любой другой запущенный процесс (который использовал / использует swap) все еще может «освободить swap». Это может быть, почему это происходит так медленно. Кажется, это не вызывает OOM, как сказал другой человек (я использую Ubuntu Bionic) - вероятно, это будет иметь место только в том случае, если «дополнительные (или существующие) процессы начнут использовать новую память» (то есть, реальные OOM). Таким образом, в целом swapoff / swapon - отличное решение. Нежный / стабильный. Это предполагает, что вы не инициируете больше памяти, используя процессы (или не увеличиваете потребление работающих).
Роэль Ван де Паар

13

Вы можете настроить его, отображая некоторое число от 0 до 100 в /proc/sys/vm/swappiness.

Этот элемент управления используется для определения того, насколько агрессивно ядро ​​будет менять страницы памяти. Более высокие значения увеличат агрессивность, более низкие значения уменьшат объем обмена . Значение 0 указывает ядру не запускать своп до тех пор, пока количество свободных страниц и страниц с файловой поддержкой не станет ниже отметки верхнего уровня в зоне.

Значение по умолчанию - 60.


13
Не используйте / proc / sys напрямую, используйте sysctlкоманду вместо этого. В этом случае это так sysctl vm.swappiness=x.
Джулиано

7
Я не думаю, что даже обмен нуля приведет к тому, что страницы, которые уже были заменены, будут явно перенесены в основную память?
Дуглас Лидер

1
@ Дуглас прав. vm.swappiness будет в основном контролировать решение о том, следует ли перемещать объекты для обмена или уменьшать количество кэшей и буферов, когда требуется память.
Джулиано

@ Джулиано, почему нельзя использовать / proc / sys?
Джеймс

@James Потому что / proc / sys - это интерфейс более низкого уровня, используемый для изменения и запроса конфигурации ядра (это «детали реализации»). Linux предоставляет команду более высокого уровня sysctlдля взаимодействия с пользователем. Конечный результат тот же, но обычно интерфейсы более высокого уровня предпочтительны для непосредственного взаимодействия пользователя. Вроде как запуск двигателя путем короткого замыкания проводов зажигания (нижний уровень) вместо простого поворота ключа (более высокий уровень).
Джулиано,

5

Linux отлично справляется с управлением памятью, и вы не должны стоять на пути. Настройка vm.swappiness (упомянутая ранее) не мешает. Вы, скорее всего, будете испытывать странные проблемы, поступая иначе.

Что вы запустили, что было так жадно до памяти? Это можно настроить? Если у него нет своих собственных директив по ограничению памяти, вы также можете посмотреть на ulimit.


В моем случае это было convert -density 200 file.pdf jpegs/file.jpg. По какой-то причине он использует много памяти, но вы правы: его можно настроить. В любом случае, ситуация возможна с любым приложением :)
kolypto

1
Я согласен с этим ответом - вам, вероятно, следует оставить обычные операции на машине, чтобы поменять то, что действительно необходимо.
Дуглас Лидер

convertимеет -limitаргумент для управления памятью и использованием диска, и вам следует ознакомиться с ними. Настройка -limit memory 512MBили подобное было бы хорошо. Вероятно, было бы также хорошо указать явный MAGICK_TEMPORARY_PATH и очистить его после выполнения команды.
рабство

3

Если у вас есть память, доступная для всех ваших приложений, можно установить значение подкачки равным 0, чтобы ничего не поменялось. Например, qemu-kvm - это большая цель, которую VMM должен выгружать, потому что он «кажется» большую часть времени простаивает. Я вижу, что до 80% памяти памяти qemu-kvm записывается подкачку. Виртуальные машины, работающие в qemu-kvm, станут почти не отвечать на запросы, потому что у них заканчивается своп (хотя гость не знает, что это происходит). Гостевая виртуальная машина будет думать, что она работает превосходно, хотя на самом деле она тянет ужасно. Когда я работаю с несколькими виртуальными машинами и начинаю что-то делать, это может увеличить среднюю нагрузку до 30, даже на оборудовании корпоративного уровня с достаточным количеством быстрой памяти и диска. Я предполагаю, что это ошибка в готовом дизайне qemu-kvm.

Надеюсь, это кому-нибудь поможет.


Боюсь, это не совсем точно.
23 марта 1977 г.,

2

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


9
В некоторых случаях я хочу делать то, что хочет ОП. Если я случайно позволил процессу запустить бунт и занял весь мой RAM + swap, то я могу либо подождать 15 секунд каждый раз, когда я переключаю приложения, чтобы его память вышла из свопа, либо просто принудительно заставить его работать так же быстро, как обычно.
Алекс

Ну ... я хочу, чтобы "отмена" происходила во время перерыва на кофе, а не каждый раз, когда я пытаюсь переключать приложения. Является ли это «обдумыванием подсистемы ВМ», когда я хочу сообщить ей о препятствующем перерыве на кофе?
Klaws

1

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


1

Чтобы скопировать часть моего ответа на этот вопрос .

Так что вы знаете, как работает переменная перестановки. Это работает, сообщая подсистеме VM, что нужно искать страницы, которые нужно поменять местами, когда% памяти, сопоставленный таблицам страниц процесса + значение подкачки> 100. Таким образом, значение 60 заставит систему начать выгружать устаревшие страницы из таблицы страниц процесса. когда он использует более 40% памяти вашей системы. Если вы хотите, чтобы ваши программы использовали больше памяти за счет кэша, вам нужно уменьшить значение подкачки.


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

0

Процесс все еще работает? Откройте терминал и посмотрите, сможете ли вы определить процессы, которые были запущены. (ps aux | grep имя_процесса может сделать это немного проще) Используйте kill -9 PID, чтобы убить их, если они все еще работают. Будьте осторожны с тем, что вы убиваете. Если вы не знаете, что это за процесс, не убивайте его! Кроме того, опубликуйте вывод free -m, чтобы мы могли увидеть, действительно ли вы все еще используете много свопов.

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


0

Я полагаю, что не существует какого-либо действительно хорошего способа заставить Linux разархивировать данные с диска в память. Когда swapoff / swapon - это рабочее решение, но оно грязное и легко может сделать вашу систему нестабильной. В тех случаях, когда в разделе подкачки данных больше, чем свободной памяти, трудно представить какую-либо эффективную политику, которую Linux может использовать для определения того, какие части данных перемещаются в память, а какие хранятся на диске.

Резюме: Просто позвольте Linux постепенно восстанавливать свою производительность обычным способом. Ее подсистема ВМ организована таким образом, что она стремится и постоянно движется к некоему идеальному сбалансированному состоянию.


-2

Очистка буфера кеша

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

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

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

ПРИМЕЧАНИЕ: очистите память от ненужных вещей (ядро 2.6.16 или новее). Всегда сначала запускайте синхронизацию, чтобы записать полезные вещи на диск !!!

  • Чтобы освободить кеш страницы:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Чтобы освободить дентрии и иноды:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Чтобы освободить страничный кеш, дентри и иноды:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Вышеуказанное предназначено для запуска от имени пользователя root. Если вы пытаетесь сделать это с помощью sudo, вам нужно немного изменить синтаксис примерно так:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.