我们最近用 RHEL 6.1 替换了 RHEL 5.6 Web 服务器。对于这两个环境,都使用了 (原版) Redhat 附带的 Apache httpd (即 yum install httpd)。该服务器提供 PHP 内容,并且很忙 (每分钟处理大约 2500 - 4000 个页面请求)。这两个服务器的规格在内存、存储和网络连接方面相同。我们看到 RHEL 6.1 机器上的平均负载明显更高 - 其中平均负载 (有时) 会飙升至 40 以上 (所有 httpd 进程),导致网站性能大幅下降。我们已监控 RHEL 5.6 环境,平均负载不超过大约 5 个并发 httpd。我们如何调查此问题?请记住,这是一个生产环境,但我们可以通过在 5.6 和 6.1 服务器之间切换来比较“同类”。
答案1
每分钟 2500 - 4000 个请求相当于每秒 40-60 个请求。这种负载几乎不需要内核级调整,但更可能是您的 Apache 或 PHP 设置出了问题。一些典型原因包括
TimeOut
httpd.conf 中的长值KeepAlive on
和/或KeepAliveTimeOut
httpd.conf 中的长值(可能导致额外的 httpd 进程)- 加载了一些不必要的 httpd 模块
- 加载了一些不必要的 PHP 模块
- 配置错误
memcached
(如果使用) - 数据库连接/配置问题
您需要弄清楚与旧服务器相比有什么不同。您是否将配置值从旧服务器复制到新服务器?旧服务器是否在几年前进行了微调,而您忘记了一些重要的东西?
Apache 的服务器状态页面向您显示什么?
如果其他方法都失败了,你始终可以使用 PHP 的XDebug
模块。这意味着你在服务器上执行页面加载,并让 XDebug 为你生成与 Valgrind 兼容的报告。然后你可以使用缓存研磨或其他分析器,看看宝贵的 CPU 时间被消耗在哪里。这可以为您提供有关问题所在线索。
答案2
从 5.6 升级到 6.1 是一个很大的进步 - 您可能正在运行不同版本的 apache、php,也许还有字节码缓存。
如果您正在使用字节码缓存(我相信您应该使用您描述的那种负载),您应该验证它是否正常工作(例如,我知道 apc 在版本之间更改了一些配置语法)。在这种情况下,您使用哪一个?
您应该有一些指标来解释所花费的 CPU 时间类型 - 是 IOWait、系统还是用户时间。内存使用情况等也是如此。这些情况看起来如何?
我将再次推荐某种监控工具,例如 Munin。
答案3
也许您可以比较一下两个系统上的输出sysctl -A
?您可能已经调整了 RHEL5 内核。我还发现 oprofile 有助于确定内核和进程花费时间的地方。
编辑:我假设 apache 和 php 的配置方式相同。
答案4
虽然很大程度上取决于 PHP 实际在做什么,但恕我直言,即使在旧机器上,平均负载似乎也相当高 - 但显然紧迫的问题是新旧机器之间的行为差异。
您确定配置相同吗?您是否检查过 apache 错误日志,看它是否有任何处理指令的问题?您是否检查过 eaccelerator 目录的权限?
该盒子是否使用外部资源(例如 DNS、数据库)?如果是,它是否与旧网络在同一网络上?与其他服务器的 RTT 时间是否相似?
您能轻松地将盒子降级到 RH5.6 吗?如果可以,这能解决问题吗?
您是否看到带宽或请求响应时间的变化(%D)?
工作人员似乎对内存的要求较低
差别其实并不大——因为大部分内存都在标记为 COW 的 TXT 段中。事实上,一些基准显示 pre-fork 比 Linux 上的工作线程更具可扩展性。