同一应用程序在不同服务器上的性能差异很大

同一应用程序在不同服务器上的性能差异很大

我们有两台 GoDaddy 服务器存储 Facebook 应用程序。一台用于测试,另一台用于生产。两台服务器的代码相同,但测试服务器的响应速度更快。

两个服务器的配置均为:

  • 操作系统:Centos 5.3
  • PHP:5.3.1
  • MySQL:5.5.21

并且它们都具有相同的硬件。

我们正在尝试追踪问题,首先我们通过监控 php&mysql 使用率百分比来测试我们的代码top。我们设法不超过 10%。我提醒两台服务器都有相同的代码。

其次,我们已经将生产中的 MySQL 配置文件更改为与测试服务器完全相同,但这也无济于事。

在我们用 测试应用程序时firebug,我们发现某些文件存在很大的延迟.php。某些.php文件请求在测试服务器上需要 2 秒,在生产服务器上则需要 13 秒。由于这种延迟仅在生产服务器上存在,因此我们比较了两个结果phpInfo()

不同之处可见这里:

与 phpinfo() 结果的差异

所有差异都以下列形式列出:

******Testing //A result from our testing server (Empty means not exist)

******Production  //A result from our production server (the SLOW one)
HTTP_CACHE_CONTROL

您是否发现任何可能导致性能问题的差异?

谢谢。

答案1

两台服务器都是最新的吗?至少两台机器的 PHP-Memcached 版本明显存在差异。

否则,可能是硬件问题?损坏的 RAID 阵列或类似设备在某些情况下可能会导致速度变慢。

调试速度减慢的一个可能方法是运行一个示例 PHP 脚本(该脚本显示两个服务器之间的速度差异),斯特拉斯,然后计算出减速发生的时间点。

答案2

这听起来很像锁定。您使用的是 MyISAM 表吗?对 MyISAM 表的写入查询会锁定整个表,这将导致任何并发读取请求都必须等到写入完成。由于服务器之间的唯一区别是并发请求的数量,这是我的第一个猜测。InnoDB 对写入具有行级锁定,这使其成为此类读/写工作负载的更好选择。

MySQL 查询缓存也可以作为锁定点,因为每次对特定表进行任何写入时都必须刷​​新该表的所有条目。 查询缓存越大并不总是越好并可能导致严重的减速。

您是否已打开 MySQL 慢速日志?您可能还想添加log_queries_not_using_indexes。我的第二个猜测是磁盘争用。 的输出vmstat 5 5应该有助于确定这一点。(与 一样vmstat,忽略第一行。)如果这是您的问题,您可能可以通过以下方式解决它:

  1. 添加更多 RAM。
  2. 使用更快的磁盘,例如 15k RPM 或 SSD。
  3. 改变您的应用程序以减少书写要求。
  4. 将您的读取内容缓存到其他地方,例如 memcached。

它也值得mysqltuner.pl在您的 MySQL 服务器上运行。要获取它,只需输入wget mysqltuner.pl

答案3

您是否就此问题联系过 GoDaddy?

如果您确定 Web 堆栈是相同的(MySQL 配置/Apache 配置/PHP/源代码),那么显然存在超出您能力范围的级别配置问题(网络/磁盘/虚拟化层,假设他们在 GoDaddy 采用虚拟化;不熟悉他们的虚拟专用服务器产品)。

如果只是共享主机(甚至可能是 VPS,谁知道呢;再次联系 Go Daddy),您永远不知道会得到什么:我有一个另一家大型主机提供商的经销商帐户,我可以通过 IP 知道我将得到一个“狗”服务器,上面有大量帐户(对 /home 中的子目录进行了计数以证明这一点)。实际上,一般来说,共享主机的性能相当不稳定:我真的只将它用于 3 页的宣传册网站。

相关内容