2013-09-16 1 views
1

Google Appengine 애플리케이션의 백엔드 인스턴스에서 긴 태스크 (약 6 시간)가 실행 중입니다. 여기 Java GAE : 백엔드가 너무 오래 종료되어 프로세스가 종료되었습니다.

백엔드 구성입니다 : 프로세스가 실행되면

<backend name="backend_1"> 
    <class>B4_1G</class> 
    <options> 
     <public>true</public> 
     <dynamic>false</dynamic> 
    </options> 
</backend> 

내가

2013-09-13 18:52:14.677 
Process terminated because the backend took too long to shutdown. 

I를 얻을 임의의 시간 후에 내가 시간 (기본 스레드 또는 병렬 스레드에서, 나는 모두를 시도) 해결책을 찾기 위해 둘러 보았습니다. 제가 구현 한 shutdown Hook for Backend instance에 대해 읽었지 만 작동하지 않는 것 같습니다. 로그 메시지가 표시되지 않습니다

LifecycleManager.getInstance().setShutdownHook(new ShutdownHook() 
{ 
    public void shutdown() 
    { 
     log().info("Shutting down..."); 
     LifecycleManager.getInstance().interruptAllRequests(); 
    } 
}); 

, 나는 또한 isShuttingDown을 구현

에만 Process terminated because... 메시지가 내 프로세스의 모든 사이클에서

LifecycleManager.getInstance().isShuttingDown(); 

을 확인

, 내가 확인 먼저는 경우입니다 백엔드가 종료되지만이 플래그는 절대로 사실이 아닙니다.

과정은 내가 "밖으로 메모리의"오류에 대해 생각

(어쩌면 내가 작업이 재개 미래에 대한 몇 가지 데이터를 저장 중지 할 수 있습니다)하지만 난 항상 "잔인"종료를 제어 할 수있는 후크없이 중단 메모리에 "큰"객체를 저장하지 않습니다. 또한 매주기마다 인스턴스 변수가 NULL로 설정되어 메모리를 강제로 릴리스합니다. 이

내가 이런 종류의 문제가 발생 뿐이야 문제의 경우

또한, 나는이

Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space 

과 같은 오류를 기대하고있어?

이미 this article을 읽을 수 있지만 솔루션

답변

0

나는 파이썬과 같은 문제가없는입니다. 내 경우에는 내가 본 모든 메시지가 종료되었습니다. cpu, 메모리 사용량 n을 모두 확인해도 문제가 없습니다. 결코 덜 형편없고 더 적은 메모리 소비를 가져 왔습니다. 아직도 똑같은 걸 본다. 귀하의 경우 그것은 메모리 문제를 말하고, 당신은 귀하의 코드를 프로파일 링하고 메모리 풋 프린트를 낮출 수 있습니다. 다시 말하지만, 약 50 회의 백엔드 실행에서 종료 핸들러가 호출되는 것은 아닙니다. Google 개발자는 백엔드의 Google IO 비디오에서이를 명확하게 설명합니다.

언젠가는이 오류를 쫓아 내면 AppEngine 개발 패러다임이 시간, 메모리 등에 제한이있는 URL 처리기를 중심으로 돌아가고있는 것으로 보입니다. 이는 장기 실행 작업에도 적용됩니다. 나는 장기적인 과제를 수행하기 위해 나의 장기적인 과제를 재검토했다. 작업 대기열은 다음 작업을 대기열에 넣기 전에 실행되는 작은 작업을 실행합니다. 한 번도 실패하지 않았어!

이점은 작업 대기열이 거대한 크론 작업보다 더 나은 안전 장치/핸드 오버를 제공한다는 것입니다. 하나의 작업이 실패하더라도 나머지 작업 목록이 실패 함을 의미하지는 않습니다.

큐를 사용하여 백엔드에 접근 할 때도 종료 훅이 완벽하게 작동합니다. 때때로 cron 작업에 비해 때때로 해고 당합니다.

관련 문제