仅当 CPU 空闲 >50% 时,如何运行 cron 作业(bash 脚本)?
我可以从 TOP 让 cpu 空闲
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
我目前的设置是:
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.
我让 PHP 脚本检查 CPU 空闲:
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 实例,所以我想在空闲时利用它们的处理能力。但永远不要重载服务器。(冗余数据库实例、开发实例、NAT 实例)
我知道 EC2 自动缩放,现货实例。只是想使用额外的容量。
后台工作是图像压缩(CPU 密集型,没有太多 I/O 或网络)。
欢迎任何建议。提前致谢!
根据下面的输入,我意识到在我的情况下“nice”是一个更好的解决方案。我应该重新调整我的目标,以尽量减少对服务器的影响,而不是跟踪 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 的问题,但现在已经足够了。