2013-01-14 2 views
4

CPU가 50 % 이상 유휴 상태 일 때 어떻게 cron 작업 (bash 스크립트)을 실행할 수 있습니까?머신이 유휴 상태 일 때만 크론 작업 실행

나는

top -b -d 00.10 -n 3 |grep ^Cpu 
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

내 현재 설정입니다 TOP

에서 CPU의 유휴를 얻을 수 있습니다 :

crontab 
0,15,30,45 * * * * /usr/bin/php /home/user/batchprocess.php 
# I could use a bash script here to call PHP, if it is a good solution. 

그리고 CPU 유휴 상태에 대한 PHP 스크립트 검사가 있습니다

batchprocess.php 
proc_nice(10); 
// wait for CPU idle 
do{ 
    $cpu_stat = exec('top -b -d 00.10 -n 3 |grep ^Cpu');  
    $tmp = stristr($cpu_stat,'%id',TRUE); 
    $cpuidle = trim(substr($tmp,strrpos($tmp,',')+1)); 
}while($cpuidle<$min_cpuidle); 
// do actual processing here 

문제를 내 현재 방법은 CPU 사용량에 관계없이 프로그램을 시작하는 것입니다. 그리고 TOP을 실행하는 while 루프는 효율적이지 않습니다. 나는 그것은 단지 시작하고자 할 때 CPU의 유휴> 50

몇 가지 추가 정보 :

  • 를 CentOS 6.2, PHP5.3

  • 나는 종료 적이 몇 EC2 인스턴스를, 그래서 내가 원하는 유휴 상태 일 때 처리 능력을 활용할 수 있습니다. 그러나 서버를 심하게로드하지 마십시오. (리던던시 DB 인스턴스, 개발 인스턴스, NAT 인스턴스)

  • EC2 자동 스케일링, 스팟 인스턴스를 알고 있습니다. 여분의 용량을 사용하고 싶습니다.

  • 백그라운드 작업은 이미지 압축 (CPU 집중, 그리 많지 않은 I/O 또는 네트워크)입니다.

모든 의견을 환영합니다. 미리 감사드립니다!


아래의 입력을 바탕으로, "좋은"이 제 경우에는 더 나은 해결책이라는 것을 깨달았습니다. CPU 사용률을 추적하는 대신 서버에 미치는 영향을 최소화하기 위해 제 목표를 다시 조정해야합니다.

그래서 새로운 설정은 다음과 같습니다

crontab 
0,15,30,45 * * * * nice -20 /usr/bin/php /home/user/batchprocess.php 

그리고 PHP 스크립트를

batchprocess.php 
if ($cpuidle < 50) 
    exit(0); 
// do actual processing here 

나는 그것을 테스트하고 내 연구 결과를 다시 게시합니다.


보고서 백 :이 코드는 DEV/PRD에 넣었으므로 매우 잘 작동합니다. TOCTOU의 문제는 해결되지 않지만 지금은 충분합니다.

+2

유휴 1 초 100 % 그 다음으로, 당신의 우선 순위를 설정하는 데 cronjob을 사용하는 법은 어떨까요? –

+0

@Dagon 나는 더 나은 해결책이 없으므로 런타임시 점검은 적어도 아무것도하지 않는 것보다 낫습니다. 예 : 시스템이 이미 사용 중이면 작업을 시작합니다. – Reed

+0

이것은 여기 또는 거기에 없지만 왜 당신은 PHP에서 cronjobs을 쓰고 있습니까 – Eevee

답변

6

이것은 일반적인 경우 일 수 있습니다. 시스템이 유휴 상태인지 확인한 후 프로세스를 시작합니다.하지만 프로세스가 시작되기 전 또는 확인되기 전에 시스템의 다른 프로세스가 시작되어 사용자가 필요한만큼 시스템을로드하십시오.

이렇게하려면 "올바른"방법은 nice 명령을 사용하여 프로세스의 우선 순위를 낮추는 것입니다. 그런데 CPU 사용량을 확인하는 루프는 100 % CPU를 사용하므로 유휴 상태인지 처음으로 확인하지 않으면 작동하지 않을 수 있습니다.

이미 "proc_nice (10)"가 있으므로 작업을 수행해야합니다.나는 시스템이 바쁜 지 아닌지를 확인하는데 지출을 할 필요가 없다.

당신은 당신은 같은 것을 할 수있는 코드에서 적절한 지점에서,에 watned 경우

if (check_cpu_usage() > 50%) sleep(1second); 

을하지만 그건 많이 사용입니다 있는지 확실하지 않습니다 - 시스템은 "좋은"바쁜 경우 프로세스는 많은 CPU 시간을받지 않으므로 높은 우선 순위로 실행되는 다른 프로세스와 경쟁하지 않습니다.

+0

확장 정보 주셔서 감사합니다. 나는 그 과정이 실제로 얼마나 좋은지 고려하지 않고 있었다. 더 높은 우선 순위 프로세스가 오랫동안 중단 될 것입니까? 예 : 전체 DB 백업 실행 – Reed

+0

"매우 좋음"(명령 행에서'nice -n 20')하면 CPU가 거의 사용되지 않을 것입니다. _IF_ 실행할 다른 것이 있습니다. 나는 내가 좋아했던 계산을 위해이 작업을 해왔다. 리눅스 커널을 컴파일 할 때의 차이점은 눈에 띄지 않지만, 컴파일이 끝나자 마자 계산이 다시 시작될 것이다. –

+0

cron과 우선 순위가 낮은 작업을 조합하면 이론적으로 동시에 여러 실행 인스턴스가 동시에 실행될 수 있습니다. – crishoj

1

시스템로드가있을 때마다 스크립트를 실행하기 만하면됩니다. 2.0 이하이면 다음과 같은 쉘 스크립트를 사용할 수 있습니다.

#!/bin/sh 
LOAD=`cat /proc/loadavg | cut -d" " -f1` 
THRESHOLD=2.0 
if [ $(bc <<< "$LOAD <= $THRESHOLD") -eq 1 ]; then 
    [email protected] 
fi 

예 : /usr/local/bin/if-idle 및 crontab 파일의 명령 앞에 if-idle을 붙이십시오.

+0

그것은 여전히 ​​"지금 시스템이 무엇을하고 있는가"이며, 다음 클럭 틱에서 잘 바뀔 수 있습니다. –

+0

사실이 접근법에도 유효한 유스 케이스가 있습니다. cron 작업이 공유 리소스에 대한 잠금을 유지해야하는 상황을 상상해보십시오. 이 경우'nice -20'으로 작업을 실행하면 임의의 시간 동안 공유 자원을 잠글 위험이 있습니다. – crishoj

+0

이것은 하나의 CPU 집중적 인 계산 배치를 실행하고, 첫 번째 계산이 끝나면 다음 시점의 시작을 연기하고, 실행 시점을 알지 못하고 실행중인 터미널에 대한 액세스 권한이없는 경우에 유용합니다 . – eudoxos

관련 문제