【问题标题】:PHP CRON Email Sending CPU IntensivePHP CRON 电子邮件发送 CPU 密集型
【发布时间】:2012-01-21 10:47:26
【问题描述】:

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

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

为了查明问题,我在 MySQL 中运行了缓慢的查询日志,但没有引起我的注意。我应该如何缩小造成这种 CPU 使用率的原因? SMTP/电子邮件只是占用大量 CPU 资源,还是表明存在编程或服务器问题?谢谢!

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

【问题讨论】:

  • PHP 脚本是在循环中连续运行以发送 4000 封电子邮件,还是反复停止并重新启动?有时,作为命令行脚本重复触发 PHP 文件可能会导致 CPU 密集型操作生成操作码。
  • 每个 CRON 作业每分钟运行一次,但它只发送“一个”列表(4k 电子邮件)然后停止。在执行这个列表的过程中,PHP 脚本会遍历 4000 封电子邮件,设置一些信息,并建立一个 SMTP 连接以单独发送每封电子邮件。
  • 我要做的第一件事是注释掉实际排队电子邮件的行,然后再次运行整个过程以查看会发生什么。即,运行所有代码来生成消息内容,但实际上并不发送消息。这至少会告诉您是生成还是发送导致了问题。
  • @AlexHowansky 我刚刚尝试了你的建议。它在大约 10-15 秒内循环浏览电子邮件。 SMTP 连接怎么样 - 如果它是 SSL 或 TLS 而不是未加密的,那会有很大的不同吗?
  • SSL/TLS 应该不会产生太大的影响。我怀疑您将电子邮件发送到本地主机上的 SMTP 服务?如果是这种情况,我会尝试编辑您的邮件服务器配置并禁用对本地生成的邮件的反垃圾邮件检查——我敢打赌它会一遍又一遍地为每封邮件做大量的检查。跨度>

标签: php mysql email apache2 smtp


【解决方案1】:

可能导致此问题的原因(非详尽列表):

  1. 与 SMTP 服务器的非阻塞 IO。

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

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

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

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

尽量减少协议格式化/编码时间。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你能给我更多的意见 - 我如何确定它是否是口译员?我在 linux 上运行 htop 命令,我看到 CRON 作业为#1-#4。顺便说一句,我正在运行 PHP-APC(这会影响命令行/CRON 还是仅影响 Apache?)
    【解决方案3】:

    它可能不仅限于 php... 您要连接到的 SMTP 服务器是在本地机器上吗?你的插座用完了吗?请求是否会自行阻塞?

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

    您是否考虑过使用第三方服务发送邮件,而您所做的只是发送 API HTTP 请求?这样做有几个好处,这些服务中的大多数都与邮件服务器建立了关系,这样您的电子邮件就可以真正进入收件箱,并且您的 SMTP 服务器不会被列入垃圾邮件黑名单。亚马逊有一项服务可以做到这一点,Postmark 等其他服务也是如此。

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 2012-03-20
      • 2011-04-26
      • 1970-01-01
      • 2011-09-16
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多