我们有两台 GoDaddy 服务器存储 Facebook 应用程序。一台用于测试,另一台用于生产。两台服务器的代码相同,但测试服务器的响应速度更快。
两个服务器的配置均为:
- 操作系统:Centos 5.3
- PHP:5.3.1
- MySQL:5.5.21
并且它们都具有相同的硬件。
我们正在尝试追踪问题,首先我们通过监控 php&mysql 使用率百分比来测试我们的代码top
。我们设法不超过 10%。我提醒两台服务器都有相同的代码。
其次,我们已经将生产中的 MySQL 配置文件更改为与测试服务器完全相同,但这也无济于事。
在我们用 测试应用程序时firebug
,我们发现某些文件存在很大的延迟.php
。某些.php
文件请求在测试服务器上需要 2 秒,在生产服务器上则需要 13 秒。由于这种延迟仅在生产服务器上存在,因此我们比较了两个结果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
,忽略第一行。)如果这是您的问题,您可能可以通过以下方式解决它:
- 添加更多 RAM。
- 使用更快的磁盘,例如 15k RPM 或 SSD。
- 改变您的应用程序以减少书写要求。
- 将您的读取内容缓存到其他地方,例如 memcached。
它也值得mysqltuner.pl
在您的 MySQL 服务器上运行。要获取它,只需输入wget mysqltuner.pl
。
答案3
您是否就此问题联系过 GoDaddy?
如果您确定 Web 堆栈是相同的(MySQL 配置/Apache 配置/PHP/源代码),那么显然存在超出您能力范围的级别配置问题(网络/磁盘/虚拟化层,假设他们在 GoDaddy 采用虚拟化;不熟悉他们的虚拟专用服务器产品)。
如果只是共享主机(甚至可能是 VPS,谁知道呢;再次联系 Go Daddy),您永远不知道会得到什么:我有一个另一家大型主机提供商的经销商帐户,我可以通过 IP 知道我将得到一个“狗”服务器,上面有大量帐户(对 /home 中的子目录进行了计数以证明这一点)。实际上,一般来说,共享主机的性能相当不稳定:我真的只将它用于 3 页的宣传册网站。