PHP CRON电子邮件发送CPU密集型

时间:2011-12-15 18:57:59

标签: php mysql email apache2 smtp

我正在运行Amazon EC2'Warge'实例 - 使用PHP5和MySQL的Ubuntu Natty x64。我们通过CRON执行PHP脚本 - 这使用SMTP / PHPMailer发送电子邮件列表(2000-4000封电子邮件)。

服务器运行速度非常慢(其中几个CRON作业并行运行),它使CPU达到100%。内存使用率很低(仅使用600mb / 8gig),每个CRON作业占用了很大一部分CPU%,例如20-30%,每个并行运行4-5个。

试图查明问题,我在MySQL中运行了慢查询日志,但没有引起我的注意。我该如何缩小CPU使用率的原因? SMTP /电子邮件只是CPU密集型还是表示存在编程或服务器问题?谢谢!

enter image description here

编辑:问题已解决。有一个微不足道的(当然)错误导致电子邮件“增长”(之前的一些电子邮件内容被注入到下一封电子邮件中) - 因此电子邮件预处理对每个订阅者来说越来越荒谬。由此产生的电子邮件有数百/数千个跟踪图像,这些图像在打开时同时点击我们的服务器,即在gmail中显示“显示图像”。在抵御自我造成的DDoS攻击和两天不睡觉之后,我将在享受一瓶摩根船长的同时思考我在生活中做出的各种选择。

3 个答案:

答案 0 :(得分:1)

首先,准确确定哪些程序占用100%的CPU。

如果它是PHP解释器,那么代码中就会出现问题 - SMTP客户端永远不应该达到100%的利用率,因为很多时候SMTP服务器的吞吐量会受到限制。

答案 1 :(得分:1)

可能导致此问题的事情(非详尽清单):

  1. 使用SMTP服务器的非阻止IO。

  2. 在php中使用的SMTP库的实现,每个循环编码长字符串操作/长文件(请记住:协议必须格式化校正,每次通过许多其他方法调用send方法时都会检查/编码)。

  3. 每封邮件一次(或多次)查询。

  4. 尝试测量在循环内执行的每个操作所花费的时间。

    您可以将简单的$start = microtime (true)printf (___FILE__.':'.__LINE__.": here after % 0.8f seconds\n", microtime(true) - $start);用于调试文件或其他分析工具。

    尝试减少协议格式化/编码时间。

    不允许超过您机器中的核心数同时运行的php脚本实例。

答案 2 :(得分:1)

它可能不仅限于php ...是你在本地盒子上连接的SMTP服务器吗?你的插座耗尽了吗?请求是否阻止了自己?

通常对于正在做的事情,基于队列的方法通常是最好的。

您是否在使用第三方服务发送邮件,您所做的只是发送API HTTP请求?这有几个好处,这些服务中的大多数都与邮件服务器建立了关系设置,以便您的电子邮件实际到达收件箱,并且您的SMTP服务器不会被列入垃圾邮件列入黑名单。亚马逊有一项服务可以做到这一点,其他像Postmark