Как остановить процесс Linux для последующего выполнения, выгрузив его память

19

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

Я знаю , что часть CPU достижима с использованием SIGSTOPи SIGCONT сигналами , но возможно на страницу-ауте (своп-в случае процесс грязных страниц) сразу же частный RSS память о (остановленном) процессе?

idelvall
источник
1
Что за этим стоит? Вы хотите, чтобы процесс возобновился быстрее? Или вы хотите предотвратить запись конфиденциальных данных на диск? Или что-то другое? Если мы знаем намерение, мы могли бы дать лучшие ответы.
Оливер
13
ОС сделает это автоматически. Там действительно нет причин делать что-то конкретное.
Дэвид Шварц
@oliver Я создаю пакетный планировщик ( github.com/brutusin/wava ). Текущая реализация предлагает планирование без упреждения, но я хочу перейти к упреждающему (возможность остановки выполнения заданий), чтобы избежать излишних тупиковых ситуаций, когда все выполняющиеся задания зависят от заданий, поставленных в очередь. Мне нужно именно то поведение, о котором
идет речь
1
@DavidSchwartz, это рискованное утверждение
idelvall
@idelvall Тогда звучит так, будто ты не хочешь делать ничего особенного с памятью.
Дэвид Шварц

Ответы:

11

Вы можете изучить технику, называемую контрольная точка / восстановление. Это позволит вам запустить запущенный процесс и сохранить его состояние в виде набора файлов, а затем восстановить его позднее.
Чтобы использовать его, начните с установки программы criu [ git , wiki ] ( yum install criuили apt install criu).

Чтобы проверить запущенный процесс, создайте пустой каталог для хранения его файлов и перейдите в этот каталог.

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

Теперь проверьте работу запущенного процесса. В этом случае я использую --shell-job, так как мой процесс выполняется в оболочке со связанным tty.

criu dump -t 404 --shell-job

404 pid процесса, который я хочу проверить. Когда я делаю это, я вижу, что мой запущенный процесс уничтожается, а в моем каталоге / var / tmp / checkpoint заполняется набор файлов, необходимых для его восстановления.

Чтобы восстановить процесс, я должен убедиться, что нахожусь в каталоге с файлами контрольных точек и выполнить восстановление.

cd /var/tmp/checkpoint
criu restore --shell-job

Процесс запустится с того места, где остановился в терминале, где он был запущен. Если я остановлю этот запущенный процесс и запустлю criu restore --shell-jobснова, процесс вернется к контрольной точке и запустится снова.

Надеюсь это поможет.

Virtex
источник
4
Это не делает то, что, как утверждает ОП, они хотят сделать. Попробуйте - не будет сокращения используемой памяти. Он просто переключится с частной памяти процесса на дисковый кеш (из-за записи набора файлов). Это просто делает дополнительный шаг сохранения и дополнительный шаг восстановления, и та же самая память используется (и извлекается) таким же образом. Фактически, это может усугубить ситуацию, поскольку некоторая память дублируется из-за генерации всего нового для записи.
Дэвид Шварц
хех, хороший момент @David, особенно если /tmpэто tmpfs (поддерживаемый памятью / пространством подкачки). Если вы установили контрольную точку на обычную файловую систему на диске, вы можете использовать ее vmtouch -eдля удаления страниц из кэша страниц, но она все еще временно использует дополнительную оперативную память. (Если только у вас criuнет возможности сделать прямой ввод / вывод (с O_DIRECT) ...)
Питер Кордес
1
Трудно понять, хочет ли это ОП или нет, потому что ОП требует конкретного решения, а не объясняет, какую проблему он пытается решить. Это может быть идеальный ответ или он может быть бесполезен для него, мы не можем сказать.
Дэвид Шварц
Я еще не рассматривал это подробно, но, похоже, восстановленный процесс - это новый процесс (другой pId), и это не совсем то, что мне нужно ...
idelvall
1
@idelvall: Так работает большинство разновидностей контрольной точки / восстановления. Одним из основных вариантов использования является сохранение прогресса в расчете при перезагрузке.
Питер Кордес