与我的本地测试服务器相比,我的某个应用程序中的一个页面在Web服务器上的运行速度非常慢。在可能解释它的环境中存在一些根本性的差异,但我希望有一个更可解决的解决方案。
服务器:
Solaris 10
Apache 2.2.9 Prefork
PHP 5.2.6
该服务器运行在一个由4个甚至不到一年的Sun盒子组成的集群上,并且在性能方面不应该有任何问题。
本地测试服务器:
Windows XP
Apache 2.2.14 WinNT
PHP 5.3.1
这实际上是我自己的桌面 - 一台体面的机器,但与太阳盒相比应该很苍白。
应用程序是用CodeIgniter编写的,我使用了内部的分析功能来跟踪Model :: Model()的减速。例如,Model :: Model()在本地运行0.0006s,在服务器运行0.0045s。当您在页面上加载数百个模型时,这显然是一个问题。
我在这里从ServerFault交叉发布了这个,因为它可能与CodeIgniter更密切相关。
从本地,该页面需要2-3秒才能加载。从服务器,它是11-15。
本地模块,但不是远程模块:
远程模块,而不是本地模块:
修改
我一直在逐级降低基准测试,并发现最大的差异在于这段代码(在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之后,几乎没有别的),我实际上看到了提高了性能。 (上面的检查现在在本地打印.2ms。)
答案 0 :(得分:0)
我们发现虽然SPARC服务器看起来应该比我的PC中的core2 quad更好,但它们完全通过线程完成。任何一个线程实际上都会表现得更差性能下降可能是由于这一点。