与我的本地testing服务器相比,我的一个应用程序中的一个页面在Web服务器上运行得非常慢。 在环境中有一些根本性的差异可以解释它,但我希望有一个比这更能解决的解决scheme。
服务器:
Solaris 10
Apache 2.2.9 Prefork
PHP 5.2.6
该服务器运行在一个4个一年半的Sun机箱上,不应该在性能方面有任何问题。
本地testing服务器:
Windows XP
Apache 2.2.14 WinNT
PHP 5.3.1
这实际上是我自己的桌面 – 一个体面的机器,但应该比太阳盒苍白。
该应用程序是用CodeIgniter编写的,而且我使用了内部的分析function来跟踪Model :: Model()的减速情况。 例如,Model :: Model()在本地运行0.0006秒,在服务器上运行0.0045秒。 当您在页面上加载数百个模型时,这显然是一个问题。
我已经在这里从ServerFault交叉发布,因为它可能与CodeIgniter更密切相关。
从本地,页面需要2-3秒加载。 从服务器,这是11-15。
本地模块,但不是远程模块:
远程模块,而不是本地:
编辑:
我一直在逐级向下移动我的基准testing,发现最大的差异在于这段代码(在CodeIgniter函数Model :: _ assign_libraries中,并在模型的构造函数中调用):
$time = microtime()*1000; foreach (array_keys(get_object_vars($CI)) as $key) { if ( ! isset($this->$key) AND $key != $this->_parent_name) { // In some cases using references can cause // problems so we'll conditionally use them if ($use_reference == TRUE) { $this->$key = NULL; // Needed to prevent reference errors with some configurations $this->$key =& $CI->$key; } else { $this->$key = $CI->$key; } } } if (get_class($this) == 'SeatType') echo sprintf('%.5f ms|', (microtime()*1000 - $time));
在本地,每次迭代打印大约0.48ms。 在群集上,每次迭代打印约3.9ms。
我开始怀疑这个问题是否在Apache / PHP之外 – 我将php.ini和htconf文件复制到了本地服务器,并且(在删除了mod_dtrace之后,几乎没有其他的东西),我看到了更高的性能。 (上面的检查现在在本地打印0.2ms。)
我假设你已经比较PHP / Apache设置和加载模块?
你确定这是Web服务器/ PHP? 我对CI确实不太了解,但是听起来像Model会连接到一个数据库。
如果确实连接到数据库,请尝试检查
我们发现,虽然SPARC服务器看起来应该比我的PC上的core2 quad执行得更好,但他们完全是通过线程完成的。 任何一个线程实际上都会变差。 performance下降可能是由于这一点。