Назад | Перейти на главную страницу

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

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

Есть ли способ явно переместить все возможное из свопа обратно в ОЗУ? А может не все, а только какие-то конкретные данные о процессах?

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

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

sudo swapoff -a
sudo swapon -a

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

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

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

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

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

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

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

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

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

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

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

Я бы не советовал пытаться перехитрить подсистему ВМ в ядре. КРАЙНЕ маловероятно, что у вас на самом деле достаточно информации для принятия лучших решений, чем у вас. И если вы каким-то образом заставите его делать неправильные вещи, то в конечном итоге вы просто сделаете вещи еще медленнее.

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

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

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

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

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

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

$ 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
    
  • Чтобы освободить pagecache, dentries и inodes:

    $ 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'