什么Apache设置可能会影响CodeIgnitor页面从一台服务器加载到另一台的速度?

与我的本地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。

本地模块,但不是远程模块:

  • mod_actions
  • mod_asis
  • mod_dav mod_dav_fs
  • mod_dav_lock的
  • mod_isapi mod_autoindex_color

远程模块,而不是本地:

  • mod_authn_dbm
  • mod_authn_anon
  • mod_authz_dbm
  • mod_authz_owner
  • mod_cache的
  • mod_mem_cache模块
  • mod_deflate模块
  • mod_authnz_ldap模块
  • mod_ldap模块
  • mod_mime_magic模块
  • 指定mod_expires
  • mod_unique_id
  • mod_autoindex
  • mod_suexec
  • mod_userdir
  • libphp5
  • mod_dtrace
  • mod_security2

编辑:

我一直在逐级向下移动我的基准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会连接到一个数据库。

如果确实连接到数据库,请尝试检查

  • 连接:networking延迟/吞吐量,主机名查找,持久连接,甚至可能是并发问题(locking),连接速率限制在防火墙,…
  • 数据库:反向DNS查询,连接速率限制,总体负载

我们发现,虽然SPARC服务器看起来应该比我的PC上的core2 quad执行得更好,但他们完全是通过线程完成的。 任何一个线程实际上都会变差。 performance下降可能是由于这一点。