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


54

나는 수학에서 상당히 어려운 문제에 대한 알고리즘을 개발했는데 몇 달이 걸릴 것 같습니다. 리소스가 제한되어 있으므로 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 시간 이후에 실행됩니다 (취소하기에는 너무 깁니다 ;-))

3
호기심에서 당신은 무엇을 계산하고 있습니까?
빅토르 멜 그렌

3
@ user1261166 : Branch-and-Cut 방식으로 대상 방문 문제 (여행 판매원 문제의 확장)를 연구합니다. 따라서 가능한 한 특수한 고차원 폴리 토프의 여러 측면을 알아야합니다. 기본적으로 거대한 문제에 큰 문제를 일으킨 다음 조금만 해결하려고 노력합니다.
stefan

5
귀하의 질문에 대답하지는 않지만 향후 전용 클러스터에서 코드를 실행하는 것을 고려 했습니까? 그것들은 거의 종료되지 않았으며 사용 가능한 컴퓨팅 그리드가 있다고 확신합니다. 그것들은 항상뿐만 아니라 상당히 빠릅니다 (특히 코드를 병렬화 할 수있는 경우). 직접 설정하는 것도 가능합니다 (Oracle Grid Engine 참조).
Wojtek Rzepala

나는이 인기있는 질문에 대해 결코 생각하지 못했습니다 (적어도 나에 의한 다른 모든 질문보다 훨씬 더 인기가 있습니다). 프로세스가 지금 완료되었으므로 (예상치 않게 충돌은 없지만) 각 방법을 곧 시도해 보겠습니다. 모두 감사합니다!
스테판

답변:


41

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

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

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

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

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


20

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

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


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

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

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


15

CryoPID 도구를 살펴보십시오 .

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


4
리눅스 상자에서 실행되는 파이썬 스크립트의 상태를 저장하고 FreeBSD 상자로 옮기고 다시 시작하기 전에 이것을 사용했습니다. 일부 신비한 마법이 진행되고 있습니다.)
Tim

FreeBSD와 Linux가 바이너리와 호환되는지 몰랐습니다. 그것은 내가 방금 배운 매우 흥미로운 것입니다. 그러나 이것이 정확히 동일한 메모리 모델을 가지고 있다는 것을 의미합니까? 그들은 동일한 syscall 규칙, 동일한 libc (fbsd는 glibc 사용), asm 레벨에서의 동일한 정확한 호출 규칙 등을 가지고 있다는 것이 나에게 믿어지지 않습니다. 윈도우 박스에; 정말 놀랍습니다.
고양이

최근에 이것을 시도한 사람이 있습니까? 사이트가 사라졌고 .deb를 찾을 수 없으며 소스에서 빌드하는 등의 문제가 발생했습니다. 더 이상 지출하기 전에 가능한지 알고 싶습니다. 중요한 경우 데비안에 있습니다.
John P

1
@JohnP 그것은 지금 GitHub의에서 사용할 수 : github.com/maaziz/cryopid
starbeamrainbowlabs

7

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.