2010-01-25 8 views
75

Czy można "hibernować" proces w systemie Linux? Podobnie jak "hibernacja" w laptopie, chciałbym zapisać całą pamięć używaną przez proces na dysku, zwolnić pamięć RAM. Później mogę "wznowić proces", tj. Odczytać wszystkie dane z pamięci i wrzucić je do pamięci RAM i kontynuować proces.Jak "hibernować" proces w Linuksie, przechowując jego pamięć na dysku i przywracając go później?

+5

Ciekawe pytanie: D – dangerstat

+0

co opisujesz jest rzeczywiście często określane jako „punktów kontrolnych”, możesz mieć więcej szczęścia Masz z tym terminem. –

+0

To musi być dobra. Hibernacja vs blisko. –

Odpowiedz

43

Zwykłem przechowywać CryoPID, który jest programem, który robi dokładnie to, o czym mówisz. Zapisuje zawartość przestrzeni adresowej programu, VDSO, odwołania do deskryptorów plików i stany do pliku, który później może zostać zrekonstruowany. CryoPID rozpoczęło się, gdy nie było użytecznych haków w Linuksie i działało wyłącznie z przestrzeni użytkownika (w rzeczywistości nadal działa, w zależności od ustawień distro/kernel/security).

Problemy były (rzeczywiście) gniazdami, oczekiwanymi sygnałami RT, licznymi problemami X11, implementacją buforowania getpid() glibc wśród wielu innych. Randomizacja (szczególnie VDSO) okazała się nie do pokonania dla kilku z nas, którzy pracowali nad nią po tym, jak Bernard odszedł od niej. Jednak była to zabawa i stała się tematem wielu prac magisterskich.

Jeśli zastanawiasz się nad programem, który może zapisać jego stan pracy i ponownie uruchomić bezpośrednio w tym stanie, jego ... daleko .. łatwiej jest po prostu zapisać te informacje z poziomu samego programu, być może podczas obsługi sygnału .

+3

Od lipca 2014, niestety, CryoPID nie jest już przechowywany i nie działa na najnowszych jądrach. Ale w międzyczasie rodzą się nowe projekty (niektóre kroki zostały podjęte nawet w przypadku połączenia TCP "hibernacja"). Podałem [answer] (http://stackoverflow.com/a/24991425/1161591) poniżej ze zaktualizowanymi informacjami. Sprawdź to! ;) – dappiu

+0

@dappiu To świetnie - ale CryoPID był tylko _example_ w tej odpowiedzi, aby zilustrować, jak trudne może być, gdzie zaproponowałem, że zajmują się zapisywaniem stanu w samym programie, w taki sposób, że można go łatwo wznowić . Stagnacja CryoPID nie czyni odpowiedzi mniej istotną. –

+0

Oczywiście, nie znaczy to powiedzieć! ;) – dappiu

0

W systemie Linux jest ctrl+z, ale nie jestem pewien, czy oferuje on określone funkcje. Podejrzewam, że zadałeś to pytanie, ponieważ nie jest to

0

Ctrl-Z zwiększa szanse na zamianę stron procesu, ale nie całkowicie uwalnia zasoby procesu. Problem z całkowitym uwolnieniem zasobów procesowych polega na tym, że rzeczy takie jak uchwyty plików, gniazda są zasobami jądra, których proces używa, ale nie wiedzą, jak przetrwać samodzielnie. Więc Ctrl-Z jest tak dobry, jak to tylko możliwe.

12

Problem polega na przywróceniu strumieni - plików i gniazd - które program otworzył.

Gdy cały system operacyjny hibernuje, pliki lokalne i inne mogą oczywiście zostać przywrócone. Połączenia sieciowe nie, ale wtedy kod, który uzyskuje dostęp do Internetu, zazwyczaj powoduje więcej sprawdzania błędów i zachowuje warunki błędu (lub powinien).

Jeśli wykonywałeś program hibernacji (bez obsługi aplikacji), jak obsługiwałbyś otwarte pliki? Co się stanie, jeśli inny proces uzyska dostęp do tych plików w międzyczasie? itp?

Utrzymanie stanu, gdy program nie jest załadowany, będzie trudne.

Po prostu zawieszenie wątków i umożliwienie ich zamiany na dysk miałby taki sam efekt?

Lub uruchom program na maszynie wirtualnej i pozwól zawieszeniu maszyny VM.

0

Było kilka badań dotyczących punktu kontrolnego/przywracania systemu Linux w wersji 2.2 i 2.4 dni, ale nigdy nie udało się go przekroczyć. Możliwe jest (z zastrzeżeniami opisanymi w innych odpowiedziach) pewne wartości możliwe - mogę napisać moduł jądra, aby to zrobić, jest to możliwe. Ale dla wspólnej wartości możliwej (czy mogę zrobić to z powłoki na komercyjnej dystrybucji Linuksa), nie jest to jeszcze możliwe.

11

Krótka odpowiedź brzmi "tak, ale nie zawsze niezawodnie". Sprawdź CryoPID:

http://cryopid.berlios.de/

Otwarte pliki rzeczywiście będzie najczęstszym problemem. CryoPID wyraźnie stwierdza:

Otwarte pliki i przesunięcia są przywracane. Pliki tymczasowe, które zostały odłączone i nie są dostępne w systemie plików , są zawsze zapisywane w obrazie . Inne pliki, które nie istnieją po wznowieniu nie zostały jeszcze przywrócone. Obsługa zapisywania zawartości plików dla takich sytuacji jest planowana.

Te same problemy będą również wpływać na połączenia TCP, chociaż CryoPID obsługuje tcpcp do wznowienia połączenia.

+3

Po naciśnięciu przycisku "Wyślij" zdaję sobie teraz sprawę, że czyta się to bardzo podobnie do spamu/reklamy CryoPID. Nie jest - jestem po prostu zadowolonym użytkownikiem narzędzia, naprawdę. –

0

To jest ostateczny cel klastrowego systemu operacyjnego. Mathew Dillon wkłada wiele wysiłku, aby zaimplementować coś takiego w swoim projekcie Dragonfly BSD.

+0

Czy ta funkcja została w pełni zaimplementowana w Dragonfly BSD? –

+0

Nie sądzę, że jest to "ostateczny" cel ... –

2

Jak zauważyli inni, systemowi trudno jest zapewnić tę funkcjonalność, ponieważ aplikacja musi mieć wbudowane sprawdzanie błędów w obsłudze uszkodzonych strumieni.

Jednak na marginesie niektóre języki programowania i narzędzia korzystające z maszyn wirtualnych jawnie obsługują tę funkcję, na przykład Self programming language.

18

W odpowiedziach dotyczących ctrl-z mówi się o zatrzymaniu procesu za pomocą sygnału, w tym przypadku SIGTSTP. Można wydać sygnał stop z kill:

kill -STOP <pid> 

To będzie wstrzymanie wykonania procesu. Nie zwolni natychmiast pamięci używanej przez nią, ale ponieważ pamięć jest wymagana dla innych procesów, pamięć używana przez zatrzymany proces będzie stopniowo zamieniana.

Kiedy chcesz się obudzić go ponownie użyć

kill -CONT <pid> 

bardziej skomplikowanych rozwiązań, jak CryoPID są naprawdę potrzebne tylko jeśli chcesz zatrzymał proces, aby móc przetrwać zamykania systemu/restart - to nie brzmi tak, jak tego potrzebujesz.

3

Rozszerzyłem Cryopid produkując pakiet o nazwie Cryopid2 dostępny z SourceForge. To może migrować proces, a także hibernować go (wraz z dowolnymi otwartymi plikami i gniazdami - dane w gniazdach/rurach są zasysane do procesu w stanie hibernacji i splunął z powrotem do nich po ponownym uruchomieniu procesu).

Powodem nie były aktywne w ten projekt jest nie jestem programistą jądra - zarówno to (i/lub oryginalny cryopid) trzeba znaleźć kogoś na pokładzie, którzy mogą je dostać działa z najnowszymi jądrami (np. Linux 3.x).

Metoda Cryopid działa - i jest prawdopodobnie najlepszym rozwiązaniem do ogólnego celu procesu hibernacji/migracji w Linuksie Znalazłem.

18

Chciałbym umieścić aktualizację statusu tutaj, od 2014.

Przyjęta odpowiedź sugeruje CryoPID jako narzędzie do wykonywania Checkpoint/Restore, ale uznałem, że projekt jest niezmienny i niemożliwy do skompilowania z ostatnimi jądrami. Teraz znalazłem dwa aktywnie stworzone projekty zapewniające funkcję punktu kontrolnego aplikacji.

Pierwszy, jeden Proponuję bo mam więcej szczęścia działa to, że jest CRIU wykonuje kontrolny/przywracania głównie w przestrzeni użytkownika i wymaga opcji jądra CONFIG_CHECKPOINT_RESTORE włączone do pracy.

Checkpoint/Restore w przestrzeni użytkownika, lub CRIU (wymawiane Kree-oo, IPA:/krɪʊ /, rosyjski: криу), to narzędzie dla systemu operacyjnego Linux. Za pomocą tego narzędzia można zatrzymać uruchomioną aplikację (lub jej część) i sprawdzić ją na dysku twardym jako zbiór plików. Następnie można użyć tych plików, aby przywrócić i uruchomić aplikację z punktu, w którym została zamrożona. Charakterystyczną cechą projektu CRIU jest to, że jest on głównie wdrażany w przestrzeni użytkownika.

Ta ostatnia to DMTCP; cytowanie z ich strony głównej:

DMTCP (Distributed MultiThreaded Checkpointing) to narzędzie do przezroczystego kontrolowania stanu wielu równoczesnych aplikacji, w tym wielowątkowych i rozproszonych aplikacji. Działa bezpośrednio na pliku wykonywalnym binarnym użytkownika, bez żadnych modułów jądra Linuksa ani innych modyfikacji jądra.

Jest też ładny strony Wikipedia na argumencie: Application_checkpointing

Powiązane problemy