从RHEL 5.6迁移到6.1后,httpd性能下降

我们最近用RHEL 6.1取代了一个RHEL 5.6networking服务器。 对于这两种环境,已经使用Apache httpd的(库存)Redhat(即yum install httpd)。 服务器正在为PHP内容提供服务,并处于忙碌状态(每分钟提供大约2500 – 4000页的请求)。 两个服务器的规格在内存,存储和networking连接方面是相同的。 我们所看到的是RHEL 6.1盒子的负载平均值要高得多 – 负载平均值(有时)会超过40(所有httpd进程),导致网站的性能大幅下降。 我们监视了RHEL 5.6环境,并且平均负载不超过约5个并发httpd。 我们如何调查这个问题? 请记住,这是一个生产环境,但是我们可以通过在5.6和6.1服务器之间切换来比较“苹果与苹果”。

您的每分钟2500 – 4000个请求转换为每秒40-60个请求。 这种负载几乎不需要内核级调整,但更可能是您的Apache或PHP设置有问题。 一些典型的原因包括

  • Long TimeOut值在httpd.conf中
  • KeepAlive on和/或在httpd.conf中KeepAliveTimeOut值(可能会导致额外的httpd进程)
  • 一些不必要的httpd模块加载
  • 一些不必要的PHP模块加载
  • configuration错误的memcached设置(如果使用)
  • 数据库连接/configuration问题

你需要弄清楚与旧服务器相比有什么不同。 你是否将configuration值从旧服务器复制到新服务器? 旧的服务器是多年前调整好的,你忘记了一些重要的东西?

Apache的服务器状态页面显示了什么?

如果一切都失败了,你总是可以使用PHP的XDebug模块。 这意味着你在你的服务器上执行页面加载,并让XDebug为你生成一个Valgrind兼容的报告。 然后,您可以使用KCacheGrind或其他分析器分析该文件,并查看宝贵的CPU时间消耗的位置。 这可以让你知道什么是错的线索。

从5.6升级到6.1是一个很大的步骤 – 你可能运行不同版本的Apache,PHP,也可能是字节码caching。

如果你使用的是字节码caching(我相信你应该用你正在描述的负载types),你应该validation它是否正常工作(例如,我知道apc已经改变了一些版本之间的configuration语法)。 在这种情况下你使用哪一个?

你应该有一些指标来解释什么样的CPU时间花费了 – 如果是IOWait,系统或用户时间。 内存使用情况等也是如此。这些东西看起来如何?

我会再次推荐一些监控工具,比如Munin。

也许你可以在两个系统上比较sysctl -A的输出? 您可能已经调整了RHEL5内核。 我也发现oprofile对于确定内核和进程花费的时间是有用的。

编辑:我假设Apache和PHPconfiguration相同的方式。

问题:这两个Apacheconfiguration是否相同,即你使用线程invokations或进程invokations为每个请求?

如果您正在使用stream程调用,则会为每个请求创build一个stream程(仅剩几个stream程),从而提高负载因子。

如果您正在使用线程调用,那么很多请求将由线程在更less数量的进程中处理。

因此,可能没有错。

虽然很大程度上取决于PHP实际做了什么,恕我直言,即使在旧机器上,平均负载也相当高 – 但显然,紧迫的问题是新旧行为的差异。

你确定configuration是一样的吗? 你检查了Apache的错误日志,看看它是否有任何处理指令的问题? 你检查了eaccelerator目录的权限吗?

盒子是否使用外部资源(如DNS,数据库)? 如果是这样,它是否在旧networking? 其他服务器的RTT时间是否相似?

你可以轻松地降低箱子到RH5.6? 如果是这样,这是否解决了这个问题?

您是否看到带宽或请求响应时间(%D)的变化?

工人似乎有更低的内存要求

这个区别并不是那么好 – 因为大部分内存在TXT段中被标记为COW。 事实上, 一些基准testing显示pre-fork比Linux上的工作线程更具可扩展性。