我正在运行一个亚马逊EC2 'Large‘实例--带有PHP5和MySQL的UbuntuNattyx64。我们通过CRON执行PHP脚本--使用SMTP/PHPMailer发送电子邮件列表(2000-4000封电子邮件)。
服务器运行非常慢(这些CRON作业中有几个并行运行),它使CPU达到100%。内存使用率很低(仅使用600 in /8G),每个CRON作业占用大量CPU%,例如20-30%,4-5并行运行。
为了找出这个问题,我在MySQL中运行了缓慢的查询日志,但没有引起我的注意。我应该如何缩小CPU使用的原因呢?SMTP/email是CPU强度过大还是意味着存在编程或服务器问题?谢谢!

编辑:问题已解决。有一个小错误(当然)导致电子邮件“增长”(以前的一些电子邮件内容被注入到下一封电子邮件中)--所以邮件预处理变得越来越荒谬了。由此产生的电子邮件有数百/数千个跟踪图像,它们在打开时都同时击中我们的服务器,即gmail中的“显示图像”。在抵御了自己造成的DDoS袭击和两天没有睡眠后,我将享受一瓶摩根船长,同时思考我在生活中所做的各种选择。
发布于 2011-12-15 20:32:42
导致这种情况的因素(并非详尽无遗的清单):
尝试测量在循环中执行的每个操作所花费的时间。
可以对调试文件或其他分析工具使用简单的$start = microtime (true)和printf (___FILE__.':'.__LINE__.": here after % 0.8f seconds\n", microtime(true) - $start);。
尽量减少协议格式/编码时间。
这里不允许超过机器内核的数目,这里是php脚本同时运行的实例。
发布于 2011-12-15 19:05:06
首先,准确地确定哪些程序占用100%的CPU。
如果是PHP解释器,那么代码中就有问题-- SMTP客户端永远无法达到100%的利用率,因为很多时候SMTP服务器将限制它的吞吐量。
发布于 2011-12-15 20:37:07
它可能不仅仅限于php..。是否连接到本地框上的SMTP服务器?你的插座用完了吗?这些请求是否阻碍了他们自己?
通常对于正在做的事情,基于队列的方法通常是最好的。
您是否考虑过使用第三方服务发送邮件,您所做的就是发送API请求?这有几个好处,大多数这些服务都与邮件服务器建立了关系,这样您的电子邮件实际上可以到达收件箱,并且SMTP服务器不会被列入垃圾邮件的黑名单。亚马逊有一个可以做到这一点的服务,像邮戳这样的其他服务也是如此。
https://stackoverflow.com/questions/8525184
复制相似问题