【发布时间】: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