2011-11-14 155 views
0

我在php中构建了一个应用程序,其中一个功能可分析大约10000个文本文件并从中提取内容并将其放入mysql数据库。代码本身只是一个for循环,其中每个文件都通过file_get_contents()加载,并在该迭代结束后从内存中加载unset()。文件分析是一个cron作业,并且一个php文件完成所有这些处理。EC2比共享主机慢?

然而,问题在于,应用程序最初是建立在共享服务器上的,而且一切都非常顺利。我没有注意到任何延迟或重大滞后,但是为了能够处理更多的负载,我将所有内容都移到了EC2服务器(微型实例)。

我现在遇到的问题是,每次运行cronjob(按小时处理文件),它会使整个服务器速度变慢,导致正常页面大约需要5-8秒才能加载,击败了将其转移到EC2的目的。

cron本身是一个非常漫长的过程。下面是一些测试脚本处理的结果(每小时)

SQL Insertion Time: 23.138303995132 seconds 
Memory Used: 10.05 MB 
Execution: 411.00507092476 seconds 

但在每一个小时的顶部的服务器,尽管相比于共享服务器有更多的专用硬件加速减慢这么多7分钟(我至少想)。来自EC2仪表板的图表显示CPU使用率接近100%,但我不明白它是如何达到该水平的。

任何人都可以帮助我确定为什么会发生这种情况的原因吗?我注意到,当cron运行在共享服务器上时,甚至没有丝毫的延迟,但EC2的情况完全不同。

请随时问我任何我错过了提及。

回答

2

微实例非常慢。如果您使用更大的实例,它将运行得更快。

我们所有的生产箱都使用EC2。我无法对该平台说出足够多的好消息。我永远不会回到另一个主机。另外,如果你想用C++编写你的代码,它会更快地运行LOT。我写了一个简单的mysql插入代码here。它是多线程的,所以你可以异步运行mysql更新或插入。

请让我知道你是否需要任何帮助,但我相信你可以继续使用微型实例并获得很高的速度。

希望对您有所帮助...

PS。我愿意帮助你为你的用途编写一个C++版本......仅仅因为它很有趣! :-)

+0

噢...还有一件事:确保您在服务器上安装了APC。这也会产生巨大的差异。 – Homer6

+0

感谢您的评论!我同意,如果它的编译速度会更快,但其中的一些文本文件中包含HTML,并且PHP提供了非常好的DOM解析器库。移植所有这些将会非常乏味。 – Kartik

+0

让我安装apc,看看是否有所作为! – Kartik

0

那么EC2的设计是可扩展的。

由于您的代码运行在1个循环中以逐个打开每个文件,因此它不适用于可伸缩设计。

尝试更改您的代码以打破它们,以便通过php脚本的不同实例同时处理这些文件。这样,脚本的每个副本都可以在一个线程中运行。如果您有多台服务器(或EC2中的服务器实例),则可以在不同的计算机上运行它们以加速实现更高速度。

+0

嗨,这是有道理的,我可以拆分我的代码,分类后分析文件,但阻止我这样做的事情是脚本本身需要〜12MB或RAM的613 MB实例(我不知道所有这些都可用),共享主机绝对没有问题。因此,在我将费用增加一倍以上之前,想知道是否有人知道这样的事情是否是一个问题。 – Kartik

+0

嗯,我不是EC2的专家,所以纠正我,如果我错了...... EC2运行所有的服务器作为虚拟服务器,因此访问硬件是虚拟化的。这意味着磁盘访问可能会慢一些? – iWantSimpleLife

+0

我不确定,但我明白你想说什么。我将通过使用apc和memcached来改进代码,并查看它是否会降低CPU使用率。 – Kartik