我在php中构建了一个应用程序,其中一个功能分析了大约10000个文本文件,并从中提取内容并将其放入mysql数据库。代码本身只是一个for循环,其中每个文件都通过file_get_contents()
加载,并在迭代结束后从内存中加载unset()
。文件分析是一个cron作业,单个php文件完成所有这些处理。
然而问题是,应用程序(最初)完全在共享服务器上构建,一切都非常好地工作。我没有注意到用户没有任何延迟或严重滞后,但为了能够处理更多的负载,我将所有内容都移到了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的情况完全不同。
请随时向我提问我错过的任何内容。
答案 0 :(得分:2)
微型实例非常慢。如果你使用一个更大的实例,它会运行得更快。
我们在所有生产箱中使用EC2。我不能说那个平台有足够好的东西。我永远不会回到另一个主人那里。
另外,如果你想用C ++编写代码,它会更快地运行A LOT。我用这段代码here写了一个简单的mysql插件。它是多线程的,因此您可以异步运行mysql更新或插入。
如果您需要任何帮助,请告诉我,但我相信您仍然可以使用微型实例并获得更快的速度。
希望有帮助...
PS。我愿意帮你写一个C ++版本供你使用......只是因为它很有趣! : - )
答案 1 :(得分:0)
EC2的设计是可扩展的。
由于您的代码在1循环中运行以逐个打开每个文件,因此无法实现可扩展的设计。
尝试更改代码以将其分解,以便PHP脚本的不同实例同时处理文件。这样,脚本的每个副本都可以单独在一个线程中运行。如果您有多个服务器(或EC2中的服务器实例),您可以在不同的计算机上运行它们以加快速度。