Приостановить / возобновить отдельный процесс на / с диска

22

Иногда нам хотелось бы приостановить процессы с интенсивным использованием памяти на наших серверах Ubuntu и OS X, чтобы временно освободить часть оперативной памяти для других заданий. Если бы все, что нас беспокоило, это загрузка процессора, то все Ctrl-Zбыло бы просто . Тем не менее, мы должны иметь возможность освободить ОЗУ (записав его на диск) и затем перезапустить процесс (диск -> ОЗУ) или, другими словами, «спящий» отдельный процесс. Любые подсказки о том, как это сделать? (Желательно из CLI.) Спасибо.

Майк Ковингтон
источник
7
Я полагаю, что когда процесс находится в приостановленном состоянии, его используемая память является кандидатом для подкачки на диск, если это необходимо, и это должно быть сделано автоматически из ядра.
энзотиб
1
@enzotib - я понятия не имею, происходит ли это, и, теоретически, это звучит хорошо. Тем не менее, я только что провел грубое испытание, и на практике это не работает. Любые новые процессы, порождаемые во время приостановки «пожирателей ОЗУ», чрезвычайно вялые, и я не обнаруживаю никаких действий с диском, которые можно было бы ожидать, если бы ОЗУ было перенесено на диск.
Майк Ковингтон,
1
@frozenwithjoy Я могу подтвердить, что это происходит. Единственные причины, по которым я могу думать о том, что приостановленный процесс не будет постепенно заменен, это то, что он запрашивает не подлежащую замене память (довольно редко и (в основном) зарезервированную для root), или если память, которую он отображает, используется совместно с другим активным процессом. ,
Жиль "ТАК - перестань быть злым"
1
Термин, который может помочь здесь, - «контрольная точка» (да, уродливая форма глагола). Как правило, это трудная проблема, потому что программа может использовать некоторые ресурсы, которые могут изменить состояние, пока программа спит. Решение этой проблемы было одним из различий между Big Iron и маленькими неудобными компьютерами.
dmckee

Ответы:

8

Не существует общего средства для гибернации одного процесса, только всей системы.

Однако, если вас не волнует, что образ процесса не выдержит перезагрузки, есть встроенная возможность сохранения образа процесса на диск: замена. Убедитесь, что у вас достаточно места подкачки, и если в памяти есть нагрузка, а процесс не активен (например, потому что он приостановлен), его память будет выгружена.

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

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

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

Жиль "ТАК - перестань быть злым"
источник
13

Вы ищете термин « контрольная точка приложения ».

Я знаю, что для этого можно использовать инструменты CryoPID и CryoPID2 .

Оба инструмента предназначены только для Linux.

Я не знаю аналогичного инструмента для BSD или OS X.

Ikem
источник
2
Еще одно приложение для использования - DMTCP: dmtcp.sourceforge.net
Охотник на оленей,
5

Убедитесь, что у вас есть достаточно места подкачки. Убедитесь, что ваша система настроена на замену неактивных страниц ( vm.swappiness = 100 ). Тогда должно быть достаточно приостановить процесс. Ядро предпочтет поменять неактивные страницы.

Дэвид Шварц
источник
-1

В Mac OS X вы можете попытаться использовать purgeкоманду (поставляется с Xcode) для освобождения некоторого (неактивного) ОЗУ.

vm_stat
purge
vm_stat
jefz
источник
2
purgeне поможет здесь. Он удаляет дисковый кеш, но это не приведет к тому, что память процесса будет выгружена, и это не ускорит получение оперативной памяти другим процессом.
Жиль "ТАК - перестать быть злым"