[unix] 재부팅 후 계속하기 위해 전체 프로세스 저장

나는 수학에서 상당히 어려운 문제에 대한 알고리즘을 개발했는데 몇 달이 걸릴 것 같습니다. 리소스가 제한되어 있으므로 Ubuntu 12.04 (x86) 랩톱에서 시작했습니다. 이제 일부 업데이트를 설치하고 실제로 랩톱을 다시 시작하려고합니다 ( “다시 부팅하십시오”메시지는 성가시다).

재부팅 이후에도 계속할 수 있도록 할당 된 메모리를 포함하여 전체 프로세스를 저장하는 방법이 있습니까?

필요한 프로세스에 대한 정보는 다음과 같습니다. 필요한 경우 추가 정보를 요청하십시오.

  • ./binary > ./somefile &“또는 “time ./binary> ./somefile &” 명령을 사용하여 터미널에서 프로세스를 호출 했는데 실제로 기억할 수 없습니다.
  • std :: cerr에 디버그 정보를 인쇄하고 있습니다.
  • 현재 약 600.0 kiB를 사용하고 있으며 이것이 증가하더라도 빠르게 증가하지는 않습니다.
  • 프로세스는 보통 우선 순위로 실행됩니다
  • 커널은 3.2.0-26-generic-pae이고 CPU는 AMD이며 운영 체제는 Ubuntu 12.04 x86입니다.
  • 9 일 14 시간 이후에 실행됩니다 (취소하기에는 너무 깁니다 ;-))


답변

가장 좋고 간단한 솔루션은 상태를 파일에 저장하도록 프로그램을 변경하여 해당 파일을 재사용하여 프로세스를 복원하는 것입니다.

애플리케이션 스냅 샷 에 대한 위키 백과 페이지를 기반으로 여러 대안이 있습니다.

  1. 이 또한 cryopid는 하지만 전혀 관리가되지 않고있는 것 같다.
  2. 리눅스 체크 포인트 / 재시작 은 좋은 선택 인 것 같지만 커널을 CONFIG_CHECKPOINT_RESTORE활성화 해야합니다 .
  3. criu 는 아마도 가장 최신의 프로젝트이고 아마도 가장 좋은 기회 일 것입니다. 그러나 배포판이 설정하지 않은 특정 커널 옵션 에 따라 다릅니다 .

이것은 이미 너무 늦었지만 또 다른 실제 접근 방식은 전용 VM에서 프로세스를 시작하고 전체 가상 머신을 일시 중지하고 복원하는 것입니다. 하이퍼 바이저에 따라 시스템을 다른 호스트간에 이동할 수도 있습니다.

앞으로 장기 실행 프로세스를 실행하는 위치, 프로세스를 병렬화하는 방법 및 전체 디스크, 프로세스 종료 등의 문제를 처리하는 방법에 대해 생각하십시오.


답변

이를 수행하는 상당히 “저렴한”방법은 VM에서 처리하는 것입니다 (예 : VirtualBox 사용). 종료하기 전에 VM을 일시 중단하고 상태를 저장하십시오. 부팅 후 VM 및 상태를 복원하십시오.

이것은 작업을 종료하고 재시작해야한다는 단점이 있습니다. 그러나 실제로 몇 개월 동안 실행되는 경우 9 일의 차이는 사소합니다 (6 개월 동안 5 % 증가).


편집 : 나는 Ulrich가 이미 그의 목록에있는 번호가없는 항목 4에서 이것을 언급했음을 깨달았습니다.

특히 대안이 강력한 솔루션처럼 보이지 않기 때문에이 옵션을 옵션으로 고려하는 것이 좋습니다. 각각 작동하지 않는 이유가 있습니다.

가장 좋은 방법은 그중 하나를 시도하고 작동하지 않으면 VM에서 작업을 다시 시작하는 것입니다.


답변

CryoPID 도구를 살펴보십시오 .

홈 페이지에서 : “CryoPID를 사용하면 Linux에서 실행중인 프로세스의 상태를 캡처하여 파일로 저장할 수 있습니다.이 파일을 사용하여 나중에 재부팅 후 또는 다른 머신에서 프로세스를 나중에 다시 시작할 수 있습니다.”


답변

프로그램을 다시 시작해야하는 경우 나중에 시간을 절약 할 수있는 몇 가지 기능을 코드에 추가하는 것이 좋습니다.

프로세스가 오랫동안 실행되는 경우 시스템을 다시 시작할 때 전체 프로세스 상태를 저장할 수 있다는 것은 프로세스가 실행되는 동안 프로세스가 충돌하는 경우 큰 도움이되지 않을 수 있습니다.

프로그램 “파일 검사 점”데이터로 출력하도록 권장합니다. 이 데이터는 프로그램이 체크 포인트 파일이 저장된 상태에서 재개 될 수있을 정도로 충분해야합니다. 전체 프로세스를 저장할 필요는 없으며 계산에 사용 된 관련 변수의 스냅 샷 만 계산하면 중단 된 위치에서 계산을 다시 시작할 수 있습니다. 또한 코드는 시작 상태를 얻기 위해이 파일에서 데이터를 읽는 방법을 포함해야합니다.

신호를 보낼 때이 체크 포인트 파일 중 하나를 저장하도록 코드를 설정할 수 있으므로 언제든지 계산의 “상태”를 저장할 수 있습니다.

또한 계산이 진행됨에 따라 데이터가 어떻게 변하는 지 확인할 수 있다는 것 자체가 흥미로울 수 있습니다!


답변