如何在运行cronjob PHP脚本时处理CPU IO峰值


How to handle CPU IO spikes while running a cronjob PHP script

嘿,我有一些CPU峰值由于PHP脚本我每30分钟运行一次。Script每天向注册的twitter用户发送tweet,并且有很多用户。所以基本上当PHP脚本发送tweet时,它会导致CPU峰值。

我想问一下我该如何处理这种情况。非常感谢。

ussleep

一个很小的ussleep会将CPU返回给其他可用的进程(CPU调度)。

以这个简单的脚本为例:

<?php
for ($i=0;$i<1000000;$i++) {
    echo "$i'n";
}

此进程平均占用20%的cpu时间。

这个简单的脚本平均只消耗10%的cpu时间。

<?php
for ($i=0;$i<1000000;$i++) {
    echo "$i'n";
    usleep(100);
}

当然,这个脚本花费的时间更长一些,但是CPU得到了更好的调度。睡眠时间越长,CPU的调度能力就越好。例如,usleep(1000)只使用2%的cpu时间。

我在我的Ubuntu Box上测试了这个

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.10
Release:    10.10
Codename:   maverick
消息队列

而且你的操作系统非常擅长调度进程(当然这个进程需要对你的CPU友好),所以我建议你使用消息队列来加快你的工作(发送tweet)。例如,Redis也可以用作消息队列或bean。运行两个处理工作(发送tweet)的工作进程。作为奖励,你不需要为刷出过程付出相对昂贵的代价。在网络上有足够多的信息可以使用消息队列。

n 请求,购买更多的CPU电源或[u] sleep()

您还可以从sys_getloadavg获得CPU负载,并决定是否(以及多少)需要sleep()。请记住,睡眠过多可能会导致每个CRON花费超过30分钟的时间。