Я запустил то, что заняло много памяти, а теперь все сильно тормозит. Я предполагаю, что память всех приложений ушла на свопинг, чтобы освободить место для процесса, интенсивно использующего память, и теперь все медленно возвращается в ОЗУ при доступе.
Есть ли способ явно переместить все возможное из свопа обратно в ОЗУ? А может не все, а только какие-то конкретные данные о процессах?
Я бы рекомендовал разрешить обычную подкачку управления памятью 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'