2010-05-02 3 views
3

SSH와 nohup을 통해 실행되는 PHP 스크립트를 작성했습니다. 데이터베이스에서 레코드를 처리하고 처리해야합니다 (예 : 일부 이미지 처리, 일부 행 업데이트).메시지없이 CLI cli 스크립트가 응답하지 않습니다.

작은로드에서 최대 10k 레코드까지 정상적으로 작동합니다. 나는 약 40k 레코드를 처리하는 좀 더 큰 데이터 세트를 가지고있다. (많이는 아니지만, 각 레코드가 다운로드하고 50 이미지를 처리해야 할 때 많은 작업을 추가한다.)

큰 데이터 세트는 처리하는 데 며칠이 걸릴 수 있습니다. 때로는 디버그 로그에 메모리 오류가 있음을 알 수 있습니다.이 오류는 충분히 명확합니다. 그러나 때로는 스크립트가 "죽어"나타나거나 좀비로가는 경우가 있습니다. 디버깅 로그의 내 꼬리가 멈추고 오류 메시지없이 nohup 로그의 끝 부분이 오류없이 끝나고 프로세스는 여전히 다음과 같은 ps 목록에 표시됩니다.
26075 pts/0 S 745 : 01/usr/bin/php ./import.php
하지만 아무런 작업도 이루어지지 않았습니다.

아무도 프로세스가 종료되는 이유에 대해 나에게 아이디어를 줄 수 있습니까? 필자가 알 수있는 한 뻔한 일들 (PHP 스크립트 타임 아웃 및 메모리 문제와 같은)은 하나의 요소가 아닙니다. 어떤 조언

에 대한

덕분에 PS--이는 GoDaddy와 VDS (나의 선택)를 호스팅하고 있습니다. 나는 코드에서 재정의 한 것 (set_time_limit (0);)에도 불구하고 godaddy가 어떤 종류의 제한을 가지고 있다고 의심합니다.

+0

(1) 처리를 작은 청크로 분할 할 수 없습니까? (2) 화면 대신에 nohup을 사용하는 이유는 무엇입니까? –

+0

음, 한 번에 500 레코드 씩 실행됩니다. 부하를 분산시키는 다른 전술이있을 것이라고 확신하지만, 합리적인 것처럼 보입니다. 단지 시간이 많이 소요됩니다. 초기 가져 오기 후에는 레코드 업데이트가 훨씬 작고 관리하기 쉽습니다. 화면에 대해 읽었지만 경험이 없습니다. 화면을 사용하면 어떤 이점이 있습니까? 감사합니다 – julio

답변

2

매우 가능성이있는 OOM killer입니다. 정말로, 루트과 같이 존재하지 않으려면 -17/proc/self/oom_adj으로 작성하십시오. 주의 : 커널이 일반적으로 잘 알고 있습니다. OOM 킬러를 피하면 실제로 쿼리하는 것과 동일한 RDBMS를 손상시킬 수 있습니다. 얼마나 악순환이 되겠습니까 :)

/proc/loadavg/proc/meminfo에서 읽은 내용에 따라 쿼리를 시차를두고 싶을 것입니다. 로드를 늘리거나 기하 급수적으로 스왑 할 때는 특히 백그라운드 프로세스로 백 오프해야합니다.

또한 실행하는 동안 IOWAIT을 모니터링하십시오. 시스템을 부팅 한 시간과 비교할 때 평균은 /proc/stat 일 수 있습니다. 당신이 시작할 때 그리고 당신이 진보 할 때 그것을 기록하십시오.

유감스럽게도 OOM 킬러라고하는 연쇄 살인범은 커널 메시지를 구문 분석 할 수있는 본문 수를 유지하지 않습니다.

또는 cron 작업은 할당 된 힙의 양을 ulimit 번씩 계속 유지합니다. 어느 쪽이든, 당신의 일은 적절한 시간에 물러나거나, 일하기 전에 자신의 종말을 (위에서 지적한대로) 막아야합니다.

부수적 인 점은 공유 호스팅에서 수행중인 작업을하지 않아야한다는 것입니다. 그만큼 큰 경우, VPS (최소한)를 얻을 수있는 시간은 어떤 프로세스가 무엇을 할 수 있는지에 대해 어느 정도 제어 할 수 있습니다.

+0

또한 syscall 또는 PHP 내부에 걸려 있는지 보려면 'strace'가 있습니다 –

+0

@Marc - 가능하지만 가능성이 없습니다. 'Internal to PHP'는 디스크 잠을 자거나 오류가 발생했을 수 있습니다. 둘 중 하나가 눈에.니다. –

+0

@Marc - 아니면 그냥 좀비 프로세스 –