【发布时间】:2012-12-28 20:08:50
【问题描述】:
如何仅在 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的问题,但现在已经足够了。
【问题讨论】:
-
空闲一秒 100% 下一秒,如何在你的 cronjob 上使用 nice 来设置它的优先级
-
@Dagon 因为我没有更好的解决方案,所以在运行时检查至少比什么都不做要好。例如当系统已经很忙时开始工作。
-
这既不是这里也不是那里,但是天哪,你为什么要在 php 中编写 cronjobs
-
@Eevee 批处理作业使用 amazon AWS sdk、mySQL 和 imagick。所以 PHP 是我可以让它工作的方式。不幸的是,我不知道任何 ruby/perl/python。
标签: php linux bash cron centos