2017-01-19 1 views
1

대용량 (예약 된) 태스크가 짧은 시간 동안 엄청난 양의 메모리를 소비하지만 작업자 프로세스가 풀 수명 (MAX_TASKS_PER_CHILD=None)으로 인해 생기는 Python Celery (다중 프로세싱 사용)에 문제가 있습니다. 메모리가 가비지 수집되지 않습니다 (예 : "높은 물"예약 됨).다중 처리 : 포킹의 단점?

(이 문제는 더욱 성능이 저하 메모리 할당 많은 일정 금액을보고 스왑으로 바뀝니다 Heroku가,에 의해 악화된다.) 우리는 MAX_TASKS_PER_CHILD=1를 설정하여, 우리는 새로운 포크 것을 발견했다

프로세스 (셀러리 작업자 인스턴스)마다 작업이 완료되고 메모리가 제대로 가비지 수집됩니다. 단!

그러나 동일한 솔루션을 제안하는 기사는 많이 있지만 단점은 확인하지 못했습니다. 모든 작업 후에 새 프로세스를 포킹 할 때 잠재적 인 단점은 무엇입니까?

내 추측은 다음과 같습니다 제외
1. CPU 오버 헤드 (그러나 아마 작은 양) 분기 때
2. 잠재적 인 오류 (하지만이에 대한 모든 문서를 찾을 수 없습니다)

답변

2

(작업자가 작업 당 충분한 작업을 수행하는 경우 큰 문제는 아니지만) 반복되는 분기 작업에서 CPU 오버 헤드의 명백한 증가에서 부모 프로세스가 계속 커질 경우 한 가지 단점이 있습니다. 그렇다면 모든 하위 프로세스 (크고 큰 상위 프로세스를 포크하는 프로세스)의 크기가 커집니다. 이것은별로 중요하지 않으며 (따라서 메모리가 거의 작성되지 않을 것이므로 복사가 거의 필요하지 않으며 실제 메모리 사용은 중요한 문제가 아닐 것입니다), IIRC, Linux overcommit heuristics는 COW 메모리가 결국 근처에 있지 않더라도 실제로이 비공개 페이지와 관련하여 휴리스틱 한도를 초과하지 않더라도 OOM 킬러를 호출 할 수 있습니다.

Python 3.4 이상에서는 프로그램 시작시 명시 적으로 setting your multiprocessing start method to forkserver (작업자가 의존하지 않는 작업을 수행하기 전에)에서이 문제를 피할 수 있습니다. 이로 인해 작업자가 별도의 서버 프로세스에서 작업량을 크게 늘리지 않아도됩니다. 크기.