Tec*_*lco 33 php mysql apache cron overlap
我有一个每60分钟运行一次的cronjob但由于某种原因,最近它运行缓慢.
环境:centos5 + apache2 + mysql5.5 + php 5.3.3/raid 10/10k HDD/16gig ram/4 xeon处理器
这是cronjob的作用:
解析最后60分钟的数据
a)1个进程解析用户代理并将数据保存到数据库
b)1个流程解析网站上的展示次数/点击次数并将其保存到数据库中
来自步骤1中的数据
a)构建一个小报告并向管理员/商务发送电子邮件
b)将报告保存到每日表中(可在管理部分中找到)
我在运行命令时看到了8个进程(同一个文件)ps auxf | grep process_stats_hourly.php(在stackoverflow中找到了这个命令)
从技术上讲,我应该只有1而不是8.
在Cent OS中是否有任何工具或我可以做的事情以确保我的cronjob每小时运行而不会与下一个重叠?
谢谢
Boo*_*eus 46
您的硬件似乎足以处理此问题.
1)检查您是否已经挂起过程.使用ps auxf(请参阅tcurvelo答案),检查是否有一个或多个进程占用了太多资源.也许你没有足够的资源来运行你的cronjob.
2)检查您的网络连接:如果您的数据库和您的cronjob位于不同的服务器上,您应该检查这两台计算机之间的响应时间.也许你有网络问题让cronjob等待网络发回包.
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)检查数据库:确保数据库具有正确的索引并确保您的查询已优化.阅读有关explain命令的这篇文章
如果一个包含数十万条记录的查询需要执行时间会影响你的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
验证cronjob的一个好方法是跟踪你的cronjob脚本:根据你的cronjob进程,放一些调试跟踪,包括多少内存,执行最后一个进程花了多少时间.例如:
<?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";
Run Code Online (Sandbox Code Playgroud)
通过这样做,您可以轻松找到哪个进程占用了多少内存以及执行它需要多长时间.
6)外部服务器/ Web服务调用您的cronjob是否调用外部服务器或Web服务?如果是这样,请确保尽快加载这些.如果您从第三方服务器请求数据,并且此服务器需要几秒钟才能返回一个将影响您的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]
^^^^^^^
(...)
Run Code Online (Sandbox Code Playgroud)
或者您可以自定义输出:
$ ps axfo start,command
STARTED COMMAND
18:55 [ktrheadd]
(...)
Run Code Online (Sandbox Code Playgroud)
因此,您可以确定它们是否重叠.