Apache内存高峰,可能的原因是什么?

上周五(10/7/2011),我们开始让httpd.worker进程在1-2分钟内从典型的10-15M内存增长到10G +(千兆字节)。 这显然会导致服务器停止,因为它开始交换等。我们必须重新启动服务器,以使其再次运行。 如果我们赶上它,我们可以杀死冒犯的httpd.worker,一切都很好。

系统

  • RHEL 5.5
  • Apache httpd-2.2.3-45.el5_6.2.x86_64.rpm(修补以防止最近的字节范围过滤漏洞)
  • 使用Apache MPM worker(不是prefork)
  • mod_jk 1.2.28
  • mod_rewrite的
  • OpenSSL(最新红帽版)
  • Tomcat / JBoss Web 2.1(JBoss 5.1.0)
  • 专用服务器(非共享),每个12演出的RAM

症状

  • 在正常的负载下,突然之间,一个httpd.worker进程将在保留的内存中从10M增长到几个Gig。 不得不杀掉这个进程,否则服务器就会停下来
  • 偶尔会在同一时间发生多个httpd.worker进程
  • 一旦违规程序被杀害,一切都是正常的(几分钟之内)。
  • 一直在发生。 自上周五以来每隔8-12小时,没有明确的格局。
  • 请求stream量没有达到峰值
  • access_log和error_log中没有奇怪的stream量/错误

补充笔记

  • 我们的正常负载是每个服务器5-10个请求/秒,而不是疯狂的。
  • 我们将MaxRequestsPerChild设置为250(开始之后),工人正在适当的循环。 意味着这个问题是来自一个或一个小的请求
  • 过去两周我们没有做任何应用/系统configuration的改变。
  • 由于这不是一个持续的问题(在几分钟内消失),它不像一个
  • 这听起来像字节范围过滤漏洞,但我们已经修补和testing( https://issues.apache.org/bugzilla/show_bug.cgi?id=51714 )
    • 我已经读过服务器故障(和其他地方)的几篇文章,但没有发现任何描述一个工作过程失控与内存

问题

  • 什么会导致一个单独的httpd.worker进程的内存失控这样的? 甚至超出典型数量(我们的configuration10m-15m)?
  • 任何解决这个问题的build议? 我们正在观察顶端,服务器状态,jkstatus,使用cacti进行监视,安装了monit,并且正在进行mod_jk日志logging。

Apache / mod_jk / Tomcat(JbossWeb)configuration

从httpd.conf …

<IfModule worker.c> StartServers 2 MaxClients 500 MinSpareThreads 25 MaxSpareThreads 150 ThreadsPerChild 50 MaxRequestsPerChild 250 </IfModule> 

从mod_jk的worker.properties …

 # Define Node1 worker.node1.port=8009 worker.node1.host=127.0.0.1 worker.node1.type=ajp13 worker.node1.lbfactor=1 worker.node1.connection_pool_timeout=60 worker.node1.connection_pool_size=35 worker.node1.connect_timeout=5000 worker.node1.prepost_timeout=5000 

从tomcat的server.xml …

 <Connector protocol="AJP/1.3" port="8009" address="${jboss.bind.address}" redirectPort="8443" maxThreads="350" connectionTimeout="60000" enableLookups="false"/> 

将不胜感激任何投入!

我们有官方发现并解决了这个问题,这只是我们mod_rewrite规则中的一个循环。 它已经存在好几个月了,但是没有人触及导致这个问题的特定URL。 所以至less有一个例子可能导致一个单一的httpd.worker进程在内存消耗上失控。