Cent OS 5에서 느린 cronjobs
나는 60분마다 실행되는 크론잡 1개를 가지고 있지만, 최근에는 어떤 이유에서인지 느리게 실행되고 있습니다.
환경: centos5 + apache2 + mysql5.5 + php5.3.3 / raid 10/10k HDD / 16gigram / 4 xeon 프로세서
크론 작업은 다음과 같습니다.
지난 60분간의 데이터를 파싱합니다.
a) 1프로세스 사용자 에이전트 구문 분석 및 데이터를 데이터베이스에 저장
b) 1개의 프로세스로 웹사이트에 인상/이미지를 파싱한 후 데이터베이스에 저장
1단계의 데이터에서
a) 작은 보고서를 작성하고 관리자/기업에 이메일을 보냅니다.
b) 보고서를 일별 테이블에 저장합니다(관리 섹션에서 사용 가능).
을 하면 의 한 됩니다 한 의 을 하면 ps auxf | grep process_stats_hourly.php
오버플로에서 이 수 있음) 택서음을을수이)음수을(을서택이 )
엄밀히 말하면 8개가 아니라 1개만 있어야 합니다.
Cent OS에 cronjob이 매시간 실행되고 다음 작업이 겹치지 않도록 할 수 있는 도구가 있습니까?
감사해요.
당신의 하드웨어는 이것을 처리하기에 충분해 보입니다.
1)이미 행잉된 공정이 있는지 확인합니다.사용.ps auxf
(곡선 답변 참조), 리소스가 너무 많이 소요되는 하나 이상의 프로세스가 있는지 확인합니다.크론 작업을 실행하기에 충분한 리소스가 없을 수도 있습니다.
2)네트워크 연결을 확인합니다.데이터베이스와 cronjob이 다른 서버에 있는 경우 이 두 시스템 간의 응답 시간을 확인해야 합니다.cronjob이 네트워크에서 패키지를 다시 보낼 때까지 기다리게 만드는 네트워크 문제가 있을 수 있습니다.
다음을 사용할 수 있습니다.넷캣, 이퍼프, mtr or ttcp
3)서버 구성 서버가 올바르게 구성되었습니까?운영체제, MySQL이 올바르게 설정되어 있습니까?다음 기사를 읽는 것을 추천합니다.
http://www3.wiredgorilla.com/content/view/220/53/
http://www.vr.org/knowledgebase/1002/Optimize-and-disable-default-CentOS-services.html
http://dev.mysql.com/doc/refman/5.1/en/starting-server.html
http://www.linux-mag.com/id/7473/
4)데이터베이스를 확인합니다.데이터베이스에 올바른 인덱스가 있는지 확인하고 쿼리가 최적화되었는지 확인합니다.설명 명령에 대한 이 기사 읽기
수십만 개의 레코드가 포함된 쿼리를 실행하는 데 시간이 걸리는 경우 나머지 cronjob에 영향을 미치며, 루프 내에 쿼리가 있는 경우에는 더욱 악화됩니다.
다음 기사 보기:
http://dev.mysql.com/doc/refman/5.0/en/optimization.html
http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/
http://blog.fedecarg.com/2008/06/12/10-great-articles-for-optimizing-mysql-queries/
5)추적하고 최적화된 PHP 코드?PHP 코드가 가능한 빨리 실행되는지 확인합니다.
다음 기사 보기:
http://phplens.com/lens/php-book/optimizing-debugging-php.php
http://code.google.com/speed/articles/optimizing-php.html
http://ilia.ws/archives/12-PHP-Optimization-Tricks.html
크론잡을 검증하는 좋은 기술은 크론잡 스크립트를 추적하는 것입니다. 크론잡 프로세스를 기반으로 메모리 양, 마지막 프로세스를 실행하는 데 걸린 시간 등 디버그 추적을 넣으십시오.예:
<?php
echo "\n-------------- DEBUG --------------\n";
echo "memory (start): " . memory_get_usage(TRUE) . "\n";
$startTime = microtime(TRUE);
// some process
$end = microtime(TRUE);
echo "\n-------------- DEBUG --------------\n";
echo "memory after some process: " . memory_get_usage(TRUE) . "\n";
echo "executed time: " . ($end-$start) . "\n";
이렇게 함으로써 어떤 프로세스가 메모리의 양과 실행에 걸리는 시간을 쉽게 파악할 수 있습니다.
6)외부 서버/웹 서비스 호출 cronjob 호출이 외부 서버입니까 아니면 웹 서비스입니까?만약 그렇다면 이것들이 가능한 한 빨리 적재되었는지 확인합니다.타사 서버에 데이터를 요청할 경우 이 서버가 cronjob의 속도에 영향을 미치는 응답을 반환하는 데 몇 초가 소요됩니다.
그렇게 해보고 무엇을 찾는지 알려주세요.
ps
의 에도 가 된 이 됩니다 됩니다 이 의 된 에도 가 STARTED
).
$ ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT STARTED TIME COMMAND
root 2 0.0 0.0 0 0 ? S 18:55 0:00 [ktrheadd]
^^^^^^^
(...)
또는 출력을 사용자 정의할 수 있습니다.
$ ps axfo start,command
STARTED COMMAND
18:55 [ktrheadd]
(...)
따라서 이들이 중첩되어 있는지 여부를 확인할 수 있습니다.
프로세스_stats_hourly 내에서 잠금 파일 메커니즘을 사용해야 합니다.php 스크립트.너무 복잡할 필요는 없습니다. 프로세스를 시작하는 PID를 /var/mydir/process_stats_hourly와 같은 파일에 php로 작성하게 할 수 있습니다.txt. 따라서 stats를 처리하는 데 한 시간 이상이 걸리고 cron이 process_stats_hourly의 다른 인스턴스를 시작합니다.php 스크립트, 잠금 파일이 이미 존재하는지 확인할 수 있고, 존재하지 않으면 실행되지 않습니다.
그러나 잠금 파일을 찾아서 시작할 수 없는 경우 시간당 스크립트를 "다시 대기열"하는 방법에 대한 문제가 발생합니다.
사용해도 좋습니다.strace -p 1234
여기서 1234는 너무 오래 실행되는 프로세스 중 하나의 관련 프로세스 ID입니다.아마 여러분은 왜 그렇게 느리는지, 혹은 막혔는지 이해할 것입니다.
Cent OS에 cronjob이 매시간 실행되고 다음 작업이 겹치지 않도록 할 수 있는 도구가 있습니까?
네. 센트OS의 표준입니다.util-linux
package는 파일 시스템 잠금을 위한 명령줄 편의성을 제공합니다.Digital Precision이 제안했듯이 잠금 파일은 프로세스를 동기화하는 쉬운 방법입니다.
다음과 같이 cronjob을 호출해 봅니다.
flock -n /var/tmp/stats.lock process_stats_hourly.php || logger -p cron.err 'Unable to lock stats.lock'
경로를 편집하고 $PATH를 적절히 조정해야 합니다.호출은 잠금을 시도합니다.stats.lock
, 성공하면 통계 스크립트를 생성하고, 그렇지 않으면 포기하고 실패를 기록합니다.
또는 당신의 스크립트는 PHP의 플록 자체를 호출하여 같은 효과를 얻을 수 있지만,flock(1)
효용은 이미 당신에게 있습니다.
그 로그 파일은 얼마나 자주 회전합니까?
로그 구문 분석 작업이 평소보다 갑자기 길어지는 것은 로그가 회전되지 않는 것처럼 들리기 때문에 구문 분석기가 효율적으로 처리하기에는 너무 큽니다.
로그 파일을 재설정해 보고 작업 실행 속도가 더 빨라지는지 확인합니다.그것이 문제를 해결한다면, 향후 문제를 예방하기 위한 수단으로 logrotate를 추천합니다.
cronjob에 단계를 추가하여 위 명령의 출력을 확인할 수 있습니다.
ps auxf | grep process_stats_hourly.php
명령어가 아무것도 반환하지 않고 프로세스가 실행되지 않음을 나타낼 때까지 루프를 계속한 다음 나머지 코드를 실행하도록 허용합니다.
언급URL : https://stackoverflow.com/questions/7894266/slow-cronjobs-on-cent-os-5
'sourcecode' 카테고리의 다른 글
asp.net mvc: ajax를 사용하여 페이지 호출 시 탐지하는 방법 (0) | 2023.09.16 |
---|---|
Excel 파일을 열면 "워크북 내용 복구" 메시지 상자가 나타납니다. (0) | 2023.09.16 |
mysql join two table, 그리고 0이 아닌 값을 가진 일치하는 레코드의 필드 이름을 가져옵니다. (0) | 2023.09.16 |
os.system() 호출에서 벗어나는 방법? (0) | 2023.09.11 |
ctrl+c를 사용하여 python 중지 (0) | 2023.09.11 |