问题:Centos 5 上的慢 cron 作业

我有 1 个每 60 分钟运行一次的 cronjob,但由于某种原因,最近它运行缓慢。

环境:centos5 + apache2 + mysql5.5 + php 5.3.3 / raid 10/10k HDD / 16gig ram / 4 xeon 处理器

这是 cronjob 的作用:

1.解析最近60分钟的数据

a) 1 进程解析用户代理并将数据保存到数据库

b) 1 个进程解析网站上的展示次数/点击次数并将其保存到数据库中

2.从步骤1中的数据

a) 建立一个小报告并向管理员/企业发送电子邮件

b) 将报告保存到每日表格中(在管理部分可用)

当我运行命令ps auxf | grep process_stats_hourly.php时,我现在看到 8 个进程(同一个文件)(在 stackoverflow 中找到了这个命令)

从技术上讲,我应该只有 1 而不是 8。

Cent OS 中是否有任何工具或我可以做些什么来确保我的 cronjob 每小时运行一次并且不会与下一个重叠?

谢谢

解答

您的硬件似乎足以处理这个问题。

1) 检查您是否已经有挂起的进程。使用ps auxf(参见 tcurvelo 答案),检查您是否有一个或多个进程占用过多资源。也许您没有足够的资源来运行您的 cronjob。

2) 检查您的网络连接:如果您的数据库和您的 cronjob 在不同的服务器上,您应该检查这两台机器之间的响应时间。也许您遇到了网络问题,导致 cronjob 等待网络将包发回。

您可以使用:Netcat,Iperf,mtr或ttcp

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) 检查您的数据库:确保您的数据库具有正确的索引并确保您的查询得到优化。阅读这篇关于解释命令的文章

如果一个包含几十万条记录的查询需要多次执行,这将影响你的 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";

通过这样做,您可以轻松找到哪个进程占用了多少内存以及执行它需要多长时间。

6) 外部服务器/Web 服务调用 您的 cronjob 是调用外部服务器还是 Web 服务?如果是这样,请确保尽可能快地加载这些内容。如果您从第三方服务器请求数据并且该服务器需要几秒钟来返回一个答案,这将影响您的 cronjob 的速度,特别是如果这些调用处于循环中。

试试看,让我知道你发现了什么。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐