Сохранить весь процесс для продолжения после перезагрузки

54

Я разработал алгоритм для довольно сложной задачи по математике, которая, вероятно, потребуется несколько месяцев, чтобы закончить. Поскольку у меня только ограниченные ресурсы, я начал это на своем ноутбуке Ubuntu 12.04 (x86). Теперь я хочу установить некоторые обновления и фактически перезагрузить ноутбук (сообщение «пожалуйста, перезагрузите» просто раздражает).

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

Вот некоторая информация о процессе, который вам может понадобиться. Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, если это необходимо.

  • Я вызвал процесс в терминале с помощью команды " ./binary > ./somefile &" или "time ./binary> ./somefile &", я не могу вспомнить.
  • Он выводит некоторую отладочную информацию в std :: cerr (не очень часто).
  • В настоящее время он использует примерно 600,0 КБ и, хотя он будет увеличиваться, вряд ли будет быстро расти.
  • процесс выполняется с обычным приоритетом
  • ядро 3.2.0-26-generic-pae, процессор AMD, операционная система Ubuntu 12.04 x86.
  • он работает с 9 дней и 14 часов (слишком долго, чтобы отменить его ;-))
Штефана
источник
3
Из любопытства, что вы рассчитываете?
Виктор Меллгрен
3
@ user1261166: Я изучаю Целевую проблему с посещением (которая является расширением задачи коммивояжера) с использованием подхода «Ветка и разрез». Поэтому мне нужно знать как можно больше граней какого-то особого многомерного многогранника. По сути, это превращает огромную проблему в гигантскую, а затем пытается решить ее чуть позже.
Стефан
5
Это не совсем отвечает на ваш вопрос, но вы рассматривали возможность запуска своего кода на выделенном кластере в будущем? Они вряд ли закрыты, и я уверен, что вам доступна какая-то вычислительная сеть. Они не только включены постоянно, но и немного быстрее (особенно если вы можете распараллелить свой код). Вы даже можете сами его настроить (посмотрите Oracle Grid Engine).
Войтек Жепала
Я никогда не думал, что это такой популярный вопрос (по крайней мере, куда более популярный, чем любой другой мой вопрос). Поскольку процесс завершился сейчас (неожиданно, но без сбоев), я вскоре опробую каждый метод. Всем спасибо!
Стефан
1
stackoverflow.com/questions/2134771/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Ответы:

41

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

Основываясь на странице википедии о снимках приложений, существует несколько альтернатив:

  1. Существует также криопид, но он не поддерживается.
  2. Linux checkpoint / restart кажется хорошим выбором, но ваше ядро ​​должно быть CONFIG_CHECKPOINT_RESTOREвключено.
  3. Criu , вероятно, самый современный проект и, вероятно, ваш лучший шанс, но зависит также от некоторых конкретных опций ядра, которые ваш дистрибутив, вероятно, не установил.

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

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

Ульрих Дангел
источник
20

Довольно «дешевый» способ сделать это - выполнить обработку на виртуальной машине (например, с помощью VirtualBox). Перед выключением приостановите ВМ и сохраните состояние. После загрузки восстановите ВМ и состояние.

Это имеет тот недостаток, что требует убийства и возобновления работы. Но если он действительно будет работать в течение нескольких месяцев, тогда разница в девять дней станет тривиальной (увеличение на 5% за 6 месяцев).


Редактировать: Я только что понял, что Ульрих уже упоминал об этом в ненумерованном пункте 4 в своем списке.

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

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

bahamat
источник
15

Взгляните на инструмент CryoPID .

С домашней страницы: «CryoPID позволяет вам записывать состояние запущенного процесса в Linux и сохранять его в файл. Этот файл затем можно использовать для возобновления процесса позже, после перезагрузки или даже на другом компьютере».

Тим
источник
4
Использовал это раньше, чтобы сохранить состояние скрипта Python, работающего на Linux-боксе, и переместил его в FreeBSD-бокс и возобновил там. Некоторая тайная магия происходит там;)
Тим
Я не знал, что FreeBSD и Linux были двоично-совместимыми; это что-то очень интересное, я только что узнал. Но значит ли это, что они имеют абсолютно идентичные модели памяти? Мне кажется невероятным, что у них одинаковые соглашения о системных вызовах, тот же libc (я полагаю, fbsd использует glibc), точно такие же соглашения о вызовах на уровне asm и т. Д. Несовместимость звучит для меня так, как если бы вы взяли процесс MacOS и сбросили это на коробку Windows; это действительно довольно удивительно.
кот
Кто-нибудь пробовал это недавно? Сайт пропал, я не могу найти .deb, сборка из исходного кода не удалась и т. Д. Я хотел бы знать, возможно ли это, прежде чем тратить на него больше. Я на Debian, если это имеет значение.
Джон П
1
@JohnP Теперь он доступен на GitHub: github.com/maaziz/cryopid
starbeamrainbowlabs
7

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

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

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

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

Кроме того, возможность увидеть, как данные изменяются в процессе вычислений, может быть интересна сама по себе!

Джеймс Уомак
источник