Zapisz cały proces do kontynuacji po ponownym uruchomieniu


54

Opracowałem algorytm dla dość trudnego problemu w matematyce, którego ukończenie zajmie prawdopodobnie kilka miesięcy. Ponieważ mam tylko ograniczone zasoby, zacząłem to na moim laptopie z systemem Ubuntu 12.04 (x86). Teraz chcę zainstalować niektóre aktualizacje i zrestartować laptop (komunikat „proszę zrestartować komputer” jest po prostu denerwujący).

Czy istnieje sposób na zapisanie całego procesu, w tym przydzielonej pamięci, w celu kontynuacji po ponownym uruchomieniu?

Oto kilka informacji na temat procesu, który może być potrzebny. W razie potrzeby prosimy o dodatkowe informacje.

  • ./binary > ./somefile &Wywołałem ten proces w terminalu poleceniem „ ” lub „time ./binary> ./somefile &”, tak naprawdę nie pamiętam.
  • Drukuje niektóre informacje debugujące do std :: cerr (niezbyt często).
  • Obecnie zużywa około 600,0 kiB i chociaż wzrośnie, raczej nie wzrośnie gwałtownie.
  • proces przebiega z normalnym priorytetem
  • jądro to 3.2.0-26-generic-pae, procesor to AMD, system operacyjny to Ubuntu 12.04 x86.
  • działa od 9 dni i 14 godzin (zbyt długo, aby go anulować ;-))

3
Z ciekawości, co obliczasz?
Viktor Mellgren,

3
@ user1261166: Studiuję problem docelowej wizyty (który jest rozszerzeniem problemu podróżującego sprzedawcy) z podejściem rozgałęzionym. Dlatego muszę znać jak najwięcej aspektów jakiegoś specjalnego wielowymiarowego politopu. Zasadniczo wysadza duży problem w gigantyczny, a następnie próbuje go trochę rozwiązać, aby go później zmniejszyć.
stefan

5
Nie dość odpowiada na twoje pytanie, ale czy zastanawiałeś się nad uruchomieniem swojego kodu w dedykowanym klastrze w przyszłości? Te prawie nie są zamykane i jestem pewien, że masz do dyspozycji pewną siatkę obliczeniową. Nie tylko są włączone przez cały czas, ale także są nieco szybsze (zwłaszcza jeśli możesz równolegle kodować). Możesz nawet spróbować samodzielnie go skonfigurować (zobacz Oracle Grid Engine).
Wojtek Rzepala

Nigdy nie myślałem o tym, że jest to tak popularne pytanie (przynajmniej o wiele bardziej popularne niż każde inne pytanie przeze mnie). Ponieważ proces zakończył się teraz (nieoczekiwanie, ale bez awarii), wkrótce wypróbuję każdą metodę. Dziękuję wszystkim!
Stefan

Odpowiedzi:


41

Najlepszym / najprostszym rozwiązaniem jest zmiana programu w celu zapisania stanu do pliku i ponowne użycie tego pliku w celu przywrócenia procesu.

W oparciu o stronę wikipedii o migawkach aplikacji istnieje wiele alternatyw:

  1. Istnieje również kriopid, ale wydaje się, że jest nieobsługiwany .
  2. Punkt kontrolny / restart Linuksa wydaje się być dobrym wyborem, ale twoje jądro musi być CONFIG_CHECKPOINT_RESTOREwłączone.
  3. criu jest prawdopodobnie najbardziej aktualnym projektem i prawdopodobnie najlepszym strzałem, ale zależy również od pewnych konkretnych opcji jądra, których prawdopodobnie nie ustawiłeś w dystrybucji.

Jest już za późno, ale kolejnym praktycznym podejściem jest rozpoczęcie procesu na dedykowanej maszynie wirtualnej i zawieszenie i przywrócenie całej maszyny wirtualnej. W zależności od hiperwizora możesz także przenosić maszynę między różnymi hostami.

W przyszłości pomyśl o tym, gdzie uruchamiasz swoje długotrwałe procesy, jak je sparaliżować i jak radzić sobie z problemami, np. Pełne dyski, proces ginie itp.


20

Dość „tanim” sposobem na wykonanie tego byłoby przetwarzanie na maszynie wirtualnej (np. Za pomocą VirtualBox). Przed zamknięciem zawiesz maszynę wirtualną i zapisz stan. Po uruchomieniu przywróć VM i stan.

Ma to tę wadę, że wymaga zabicia i ponownego uruchomienia zadania. Ale jeśli faktycznie będzie działał przez kilka miesięcy, to różnica dziewięciu dni stanie się banalna (wzrost o 5% w ciągu 6 miesięcy).


Edycja: Właśnie zdałem sobie sprawę, że Ulrich wspomniał o tym już w nienumerowanym punkcie 4 na swojej liście.

Nadal zachęcam do rozważenia tego jako opcji, zwłaszcza że żadna z alternatyw nie wydaje się solidnym rozwiązaniem. Każdy ma powód, dla którego może nie działać.

Przypuszczam, że najlepszą rzeczą do zrobienia byłoby wypróbowanie jednego z nich, a jeśli to nie zadziała, uruchom ponownie zadanie na maszynie wirtualnej.


15

Rzuć okiem na narzędzie CryoPID .

Ze strony głównej: „CryoPID umożliwia przechwycenie stanu uruchomionego procesu w systemie Linux i zapisanie go w pliku. Pliku tego można następnie użyć do wznowienia procesu później, po ponownym uruchomieniu lub nawet na innym komputerze.”


4
Użyłem tego wcześniej, aby zapisać stan skryptu Pythona działającego na Linux-ie, przeniosłem go do FreeBSD i tam wznowiłem. Tam dzieje się magia magiczna;)
Tim

Nie wiedziałem, że FreeBSD i Linux są kompatybilne binarnie; właśnie tego bardzo się nauczyłem. Ale czy to oznacza, że ​​mają dokładnie identyczne modele pamięci? Wydaje mi się niewiarygodne, że mają te same konwencje syscall, te same libc (chyba fbsd używa glibc), te same konwencje wywoływania dokładnie na poziomie asm itp. Niezgodności brzmią dla mnie tak, jakbyś wziął proces MacOS i zrzucił na polu Windows; to naprawdę niesamowite.
kot

Czy ktoś ostatnio tego próbował? Witryna zniknęła, nie mogę znaleźć pliku .deb, nie powiodło się budowanie ze źródła itp. Chciałbym się dowiedzieć, czy to możliwe, zanim wydam na nią więcej. Jestem na Debianie, jeśli to ma znaczenie.
John P

1
@JohnP Jest już dostępny na GitHubie
starbeamrainbowlabs

7

Jeśli będziesz musiał zrestartować program, zachęcam do poświęcenia trochę czasu na dodanie do kodu pewnych funkcji, które mogą zaoszczędzić czas w przyszłości.

Jeśli proces ma być uruchamiany przez długi czas, możliwość zapisania całego stanu procesu po ponownym uruchomieniu komputera może nie jest bardzo pomocna, jeśli proces ulegnie awarii podczas działania.

Zachęcam cię, aby Twój program wyświetlał dane w postaci pliku „punktu kontrolnego”. Te dane powinny być wystarczające, aby Twój program mógł wznowić pracę od stanu, w jakim był w momencie zapisania pliku punktu kontrolnego. Nie musisz zapisywać całego procesu, wystarczy migawka odpowiednich zmiennych używanych w obliczeniach, wystarczająca do wznowienia obliczeń w miejscu, w którym zostało przerwane. Twój kod musiałby również zawierać sposób odczytu danych z tego pliku, aby uzyskać jego stan początkowy.

Możesz ustawić swój kod, aby po wysłaniu sygnału zapisał jeden z tych plików punktów kontrolnych, aby w dowolnym momencie zapisać „stan” obliczeń.

Dodatkowo możliwość zobaczenia, jak zmieniają się dane w trakcie obliczeń, może sama w sobie być interesująca!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.