Збережіть весь процес для продовження після перезавантаження


54

Я розробив алгоритм досить важкої проблеми з математики, яка, ймовірно, потребує декількох місяців, щоб закінчити. Оскільки у мене обмежені ресурси, я почав це на своєму ноутбуці Ubuntu 12.04 (x86). Тепер я хочу встановити деякі оновлення та фактично перезапустити ноутбук (повідомлення "будь ласка перезавантажте" просто дратує).

Чи є спосіб зберегти весь процес, включаючи виділену йому пам'ять, для продовження після перезавантаження?

Ось деякі відомості про процес, який вам може знадобитися. Будь ласка, не соромтеся запитати додаткову інформацію, якщо це потрібно.

  • Я викликав процес у терміналі командою " ./binary > ./somefile &" або "час ./binary> ./somefile &", я не можу реально згадати.
  • Це друк деякої інформації про налагодження до std :: cerr (не дуже часто).
  • Наразі він використовує приблизно 600,0 кіБ, і хоча це збільшиться, навряд чи швидко зросте.
  • процес працює з нормальним пріоритетом
  • ядро 3.2.0-26-generic-pae, процесор - AMD, операційна система - Ubuntu 12.04 x86.
  • він працює з 9 днів і 14 годин (настільки довго, щоб скасувати його ;-))

3
З цікавості, що ви обчислюєте?
Віктор Мелгрен

3
@ user1261166: Я вивчаю цільову проблему відвідування (яка є розширенням проблеми мандрівного продавця) з підходом "Відключити". Тому мені потрібно знати якомога більше граней якихось спеціальних високомірних багатогранників. В основному, це роздуває велику проблему до гігантської, а потім намагається вирішити лише трохи, щоб зменшити її згодом.
stefan

5
Це не зовсім відповідає вашому запитанню, але ви розглядали можливість запуску коду на виділеному кластері в майбутньому? Їх навряд чи закрити, і я впевнений, що у вас є якась обчислювальна сітка. Вони не тільки постійно працюють, але і досить швидко (особливо, якщо ви можете паралелізувати свій код). Ви навіть можете попрацювати з налаштуванням себе (шукайте Oracle Grid Engine).
Войтек Жепала

Я ніколи не замислювався над цим популярним питанням (принаймні, більш популярним, ніж будь-яке інше запитання для мене). Оскільки процес закінчився зараз (несподівано, хоча і без збоїв), я незабаром спробую кожен метод. Дякую всім!
Стефан

Відповіді:


41

Найкраще / найпростіше рішення - змінити програму, щоб зберегти стан до файлу повторного використання цього файлу для відновлення процесу.

На основі сторінки вікіпедії щодо знімків додатків існує декілька альтернатив:

  1. Також є кріопід, але він, здається, не збережений.
  2. Контрольна точка / перезапуск Linux, здається, є хорошим вибором, але ваше ядро ​​має бути CONFIG_CHECKPOINT_RESTOREвключеним.
  3. criu - це, мабуть, найсучасніший проект і, мабуть, ваш найкращий знімок, але залежить також від деяких конкретних варіантів ядра, які ваш дистрибутив, ймовірно, не встановлений.

Це вже пізно, але ще один практичний підхід полягає в тому, щоб запустити процес у спеціальній віртуальній машині та просто призупинити та відновити всю віртуальну машину. Залежно від вашого гіпервізора, ви також можете переміщати апарат між різними хостами.

На майбутнє подумайте про те, де ви запускаєте свої тривалі процеси, як їх паралельно розібратися і як вирішити проблеми, наприклад, повні диски, процес вбивається і т.д.


20

Досить «дешевим» способом це було б зробити обробку у віртуальній машині (наприклад, з VirtualBox). Перед тим, як вимкнути функцію, призупиніть VM та збережіть стан. Після завантаження відновіть VM & стан.

У цього є недолік вимагати вбивства та перезавантаження роботи. Але якщо це дійсно буде працювати протягом декількох місяців, то дев'ять днів різниця стає дрібницею (5% збільшується за 6 місяців).


Редагувати: Я щойно зрозумів, що Ульріх уже згадував про це у нумерованому пункті 4 у своєму списку.

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

Я вважаю, що найкраще зробити це спробувати один із них, і якщо це не спрацює, перезавантажте роботу у вітчизняній машині.


15

Погляньте на інструмент CryoPID .

З домашньої сторінки: "CryoPID дозволяє зафіксувати стан запущеного процесу в Linux і зберегти його у файл. Цей файл потім може бути використаний для відновлення процесу згодом, або після перезавантаження або навіть на іншій машині."


4
Використовували це раніше, щоб зберегти стан сценарію python, який працює на вікні Linux, і перемістив його у вікно FreeBSD і відновив там. Там відбувається якась магічна таємниця;)
Тім

Я не знав, що FreeBSD та Linux є бінарними сумісними; це щось дуже цікаве, що я тільки що дізнався. Але чи означає це, що вони мають абсолютно однакові моделі пам'яті? Мені здається недовірливим те, що вони мають однакові умови syscall, той самий libc (я думаю, що fbsd використовує glibc), такі ж точні умови виклику на рівні asm і т. Д. Невідповідності звучать для мене так, ніби ви взяли процес MacOS і скинули на вікно Windows; це справді досить дивовижно.
кіт

Хтось пробував це нещодавно? Сайт відсутній, я не можу знайти .deb, будівництво з джерела виходить з ладу і т. Д. Я хотів би знати, чи можливо це, перш ніж витрачати більше на нього. Я на Debian, якщо це має значення.
Джон П

1
@JohnP Доступний на GitHub зараз: github.com/maaziz/cryopid
starbeamrainbowlabs

7

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

Якщо процес буде запускатися протягом тривалого часу, можливість збереження всього стану процесу при перезавантаженні машини, можливо, не дуже корисна, якщо ваш процес вийде з ладу під час роботи.

Я б радив вам, щоб ваша програма виводила дані про "контрольну точку" файлу. Цих даних має бути достатньо, щоб ваша програма змогла відновити стан, у якому вона була, коли був збережений файл контрольної точки. Вам не потрібно зберігати весь процес, а лише короткий знімок відповідних змінних, які використовуються у вашому розрахунку, достатній для того, щоб ваш розрахунок відновився там, де він припинився. Ваш код також повинен містити певний спосіб зчитування в даних цього файлу, щоб отримати його початковий стан.

Ви можете налаштувати свій код, тому коли ви надсилаєте йому сигнал, він зберігає один із цих файлів контрольної точки, тож ви можете зберегти "стан" свого розрахунку в будь-якій точці.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.