[linux] 메모리를 디스크에 저장하고 나중에 복원하여 Linux에서 프로세스를 “최대 절전 모드”하는 방법은 무엇입니까?

Linux에서 프로세스를 ‘최대 절전 모드’로 전환 할 수 있습니까? 랩톱의 ‘최대 절전 모드’와 마찬가지로 프로세스에서 사용하는 모든 메모리를 디스크에 쓰고 RAM을 비우고 싶습니다. 그런 다음 나중에 ‘프로세스를 다시 시작’할 수 있습니다. 즉, 메모리에서 모든 데이터를 읽어서 RAM에 다시 저장하면 프로세스를 계속할 수 있습니까?



답변

나는 CryoPID 를 유지하는데 사용 했는데 , 이것은 당신이 말하는 것을 정확하게 수행하는 프로그램입니다. 프로그램의 주소 공간, VDSO, 파일 설명자 참조 및 상태의 내용을 나중에 재구성 할 수있는 파일에 기록합니다. CryoPID는 Linux 자체에 사용 가능한 후크가 없었을 때 시작되었으며 완전히 사용자 공간에서 작동했습니다 (실제로 배포판 / 커널 / 보안 설정에 따라 여전히 작동합니다).

문제는 (실제로) 소켓, 보류중인 RT 신호, 수많은 X11 문제, glibc 캐싱 getpid () 구현이었습니다. 무작위 화 (특히 VDSO)는 버나드가 그것을 떠난 후에 작업하는 우리 중 소수에게 극복 할 수없는 것으로 판명되었습니다. 하지만 재미 있고 여러 석사 논문의 화제가되었습니다.

실행 상태를 저장하고 해당 상태로 직접 다시 시작할 수있는 프로그램을 고려 중이라면 신호를 서비스 할 때 프로그램 자체에서 해당 정보를 저장하는 것이 훨씬 쉽습니다.


답변

2014 년 현재 상태 업데이트를 여기에 추가하고 싶습니다.

받아 들여진 대답은 CryoPID를 Checkpoint / Restore를 수행하는 도구로 제안하지만 프로젝트가 관리되지 않고 최신 커널로 컴파일 할 수 없음을 발견했습니다. 이제 애플리케이션 체크 포인트 기능을 제공하는 두 개의 적극적으로 관리되는 프로젝트를 발견했습니다.

첫 번째는 내가 그것을 실행하는 데 더 나은 운이 있기 때문에 제안하는 것은
주로 사용자 공간에서 체크 포인트 / 복원을 수행하는 CRIU 이며 작동하려면 커널 옵션 CONFIG_CHECKPOINT_RESTORE가 필요합니다.

Checkpoint / Restore In Userspace, 또는 CRIU (kree-oo로 발음, IPA : / krɪʊ /, 러시아어 : криу)는 Linux 운영 체제 용 소프트웨어 도구입니다. 이 도구를 사용하면 실행중인 응용 프로그램 (또는 그 일부)을 고정하고 파일 모음으로 하드 드라이브에 체크 포인트 할 수 있습니다. 그런 다음 파일을 사용하여 고정 된 지점에서 응용 프로그램을 복원하고 실행할 수 있습니다. CRIU 프로젝트의 특징은 주로 사용자 공간에서 구현된다는 점입니다.

후자는 DMTCP입니다 . 메인 페이지에서 인용 :

DMTCP (Distributed MultiThreaded Checkpointing)는 다중 스레드 및 분산 응용 프로그램을 포함한 여러 동시 응용 프로그램의 상태를 투명하게 검사하는 도구입니다. Linux 커널 모듈이나 기타 커널 수정없이 사용자 바이너리 실행 파일에서 직접 작동합니다.

인수에 대한 멋진 Wikipedia 페이지도 있습니다. Application_checkpointing


답변

언급 된 답변 ctrl-z은 실제로 신호로 프로세스를 중지하는 것에 대해 이야기하고 SIGTSTP있습니다. 다음을 사용하여 정지 신호를 보낼 수 있습니다 kill.

kill -STOP <pid>

그러면 프로세스 실행이 일시 중단됩니다. 사용 된 메모리를 즉시 해제하지는 않지만 다른 프로세스에 메모리가 필요하므로 중지 된 프로세스에서 사용하는 메모리는 점차적으로 교체됩니다.

다시 깨우려면 다음을 사용하십시오.

kill -CONT <pid>

CryoPID와 같은 더 복잡한 솔루션은 중지 된 프로세스가 시스템 종료 / 재시작 후에도 유지되기를 원하는 경우에만 실제로 필요합니다. 필요한 것 같지 않습니다.


답변

문제는 프로그램이 연 스트림 (파일 및 소켓)을 복원하는 것입니다.

전체 OS가 최대 절전 모드로 전환되면 로컬 파일 등이 분명히 복원 될 수 있습니다. 네트워크 연결은 그렇지 않지만 인터넷에 액세스하는 코드는 일반적으로 오류 검사가 더 많고 오류 조건에서 살아남습니다 (또는 그래야합니다).

프로그램 별 최대 절전 모드 (응용 프로그램 지원 없음)를 수행 한 경우 열린 파일을 어떻게 처리합니까? 다른 프로세스가 중간에 해당 파일에 액세스하면 어떻게됩니까? 기타?

프로그램이로드되지 않았을 때 상태를 유지하는 것은 어려울 것입니다.

스레드를 일시 중단하고 디스크로 교체하는 것만으로도 동일한 효과가 있습니까?

또는 가상 머신에서 프로그램을 실행하고 VM이 일시 중지를 처리하도록합니다.


답변

짧은 대답은 “예,하지만 항상 신뢰할 수있는 것은 아닙니다”입니다. CryoPID 확인 :

http://cryopid.berlios.de/

열린 파일은 실제로 가장 일반적인 문제입니다. CryoPID는 다음과 같이 명시합니다.

열린 파일 및 오프셋이 복원됩니다. 링크가 해제되어 파일 시스템에서 액세스 할 수없는 임시 파일은 항상 이미지에 저장됩니다. 재개에 존재하지 않는 다른 파일은 아직 복원되지 않습니다. 이러한 상황에 대한 파일 내용 저장 지원이 계획되어 있습니다.

CryoPID가 연결 재개를 위해 tcpcp를 지원하지만 동일한 문제가 TCP 연결에도 영향을 미칩니다.


답변

Linux 커널은 이제 부분적으로 체크 포인트 / 재시작 미래를 구현했습니다 : https://ckpt.wiki.kernel.org/ , 상태는 여기 입니다.

lwn (linux weekly net)에 유용한 정보가 있습니다.
http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ……

그래서 대답은 “예”입니다.


답변

짧은 대답은 “예”입니다. 몇 가지 아이디어를 위해 이것을 살펴 보는 것으로 시작할 수 있습니다 : 핵심 이미지에서 ELF 실행 파일 재구성 ( http://vx.netlux.org/lib/vsc03.html )