Linux에서 프로세스를 '최대 절전 모드'로 전환 할 수 있습니까? 랩톱의 '최대 절전 모드'와 마찬가지로 프로세스에서 사용하는 모든 메모리를 디스크에 쓰고 RAM을 비우고 싶습니다. 그런 다음 나중에 '프로세스를 다시 시작'할 수 있습니다. 즉, 메모리에서 모든 데이터를 읽어서 RAM에 다시 저장하면 프로세스를 계속할 수 있습니까?
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 확인 :
열린 파일은 실제로 가장 일반적인 문제입니다. 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 )
SourceForge에서 사용 가능한 Cryopid2라는 패키지를 생성하는 Cryopid를 확장했습니다. 이렇게하면 프로세스를 마이그레이션 할 수있을뿐만 아니라 최대 절전 모드로 전환 할 수 있습니다 (열린 파일 및 소켓과 함께 소켓 / 파이프의 데이터는 최대 절전 모드에서 프로세스로 빨려 들어가고 프로세스가 다시 시작될 때 다시 여기로 스 패팅됩니다).
내가이 프로젝트에 참여하지 않은 이유는 내가 커널 개발자가 아니기 때문입니다.이 두 가지 (및 / 또는 원래 cryopid) 모두 최신 커널 (예 : Linux 3.x)로 실행할 수있는 사람을 확보해야합니다. .
Cryopid 방법은 작동합니다. 그리고 아마도 제가 접한 Linux에서 범용 프로세스 최대 절전 모드 / 마이그레이션에 대한 최상의 솔루션 일 것입니다.
다른 사람들이 언급했듯이, OS가이 기능을 제공하기는 어렵습니다. 왜냐하면 응용 프로그램은 깨진 스트림을 처리하기 위해 몇 가지 오류 검사가 내장되어 있어야하기 때문입니다.
그러나 참고로 가상 머신을 사용하는 일부 프로그래밍 언어 및 도구는 자체 프로그래밍 언어 와 같이이 기능을 명시 적으로 지원 합니다 .
이것은 일종의 클러스터 운영 체제의 궁극적 인 목표입니다. Mathew Dillon은 Dragonfly BSD 프로젝트 에서 이와 같은 것을 구현하기 위해 많은 노력을 기울였습니다 .
다른 해결 방법 추가 : virtualbox를 사용할 수 있습니다. 일반 가상 머신에서 애플리케이션을 실행하고 원할 때마다 간단히 "머신 상태를 저장"하십시오. 이것이 답이 아니라는 것을 알고 있지만 실제 옵션이 없을 때 유용 할 것이라고 생각했습니다.
어떤 이유로 든 virtualbox가 마음에 들지 않으면 vmware 및 Qemu가 좋습니다.