Apache 2.2最终使用所有内存(worker mpm)

我调整了Apache 2.2服务器(它与MySQL + Courier + Mongo + Postgre共享)。 该服务器采用裸机(无virtualizataion),采用2个四核至强(共16个内核)和12GB ECC内存(未来几天可升级至24GB)。 MySql有innodb_buffer设置为2G,并没有问题。 Mongo和Postgre几乎没有碰到 – 只是为了发展。

问题是Apache正在吃掉所有可用的内存,最终使用了所有的交换(因为它使用更多的内存,所以崩溃了MySql)。 我们有Apache 2.2与工作者MPM和mod_security。 每当我们重新启动它,我们有aprox 8G的免费RAM。

我想了解一些事情:

  • 工作服务器top显示的进程之间的关系是什么? 我期望最多可以看到10个进程(如工作者设置中的ServerLimit – 不考虑主进程)。
  • 每个线程或每个进程使用的RES内存量是多less?
  • 在下面的mod_status输出中,有很多READING请求在那里停留很长时间。 我试过启用ExtendedStatus来发现客户端,但是我找不到任何有用的信息 – 有什么build议吗?
  • 与实际的内存使用情况,我需要多less内存来服务400并发连接? (因为mod状态显示250已经耗尽)
  • 怎么样提高ThreadsPerChild而不是提高MaxClients / ServerLimit?
 <IfModule worker.c>
 StartServers 2
 MaxClients 250
 MinSpareThreads 25
 MaxSpareThreads 75
 ThreadsPerChild 25
 MaxRequestsPerChild 0
 ServerLimit 10
 </ IfModule>configuration

TOP显示(仅适用于Apache):

顶部 -  16:30:21最多46天,23:12,2个用户,平均负载:0.94,0.97,1.31
任务:总计460,运行1,459睡眠,0停止,0僵尸
 Cpu:2.8%us,0.5%sy,0.0%ni,96.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st
 Mem:总计12187448k,使用10686748k,1500700k免费,67104k缓冲
交换:总计1048568k,使用275904k,存储772664k,2371208kcaching

   PID用户PR NI VIRT RES SHR S%CPU%MEM时间+命令
 24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd
 24750 wwwrun 20 0 1264m 51m 6196 S 9.9 0.4 0:00.93 httpd
 23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd
 23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd
 23582 wwwrun 20 0 2208m 293m 7132 S 2.3 2.5 0:27.30 httpd
 23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
 19507 wwwrun 20 0 2182m 229m 8096 S 0.7 1.9 0:18.65 httpd
 23616 wwwrun 20 0 1908m 239m 7092 S 0.7 2.0 0:18.48 httpd
 18304 wwwrun 20 0 2160m 334m 11m S 0.3 2.8 0:47.38 httpd
 23637 wwwrun 20 0 1830m 231m 7556 S 0.3 1.9 0:20.56 httpd
 24457 wwwrun 20 0 2196m 174m 6568 S 0.3 1.5 0:04.11 httpd
 15694 wwwrun 20 0 2199m 295m 7504 S 0.0 2.5 0:20.54 httpd
 15783 wwwrun 20 0 2172m 244m 10m S 0.0 2.1 0:17.45 httpd
 16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd
 18290 wwwrun 20 0 277m 9880 964 S 0.0 0.1 0:00.05 httpd
 18379 wwwrun 20 0 2208m 211m 6864 S 0.0 1.8 0:08.57 httpd
 18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
 18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
 19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
 19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
 19999 wwwrun 20 0 2178m 144m 7132 S 0.0 1.2 0:05.50 httpd
 20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd
 20838 wwwrun 20 0 1890m 127m 7260 S 0.0 1.1 0:07.44 httpd
 21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
 22252 wwwrun 20 0 2216m 295m 7732 S 0.0 2.5 0:27.04 httpd
 22723 wwwrun 20 0 2020m 187m 7444 S 0.0 1.6 0:39.80 httpd
 22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
 23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd
 23383 wwwrun 20 0 1504m 76m ​​6372 S 0.0 0.6 0:01.25 httpd
 23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
 24778 wwwrun 20 0 970m 30m 5604 S 0.0 0.3 0:00.80 httpd

最后,mod_status输出:

   服务器版本:Apache / 2.2.23(Unix)mod_ssl / 2.2.23 OpenSSL / 1.0.0-fips域名服务器PHP / 5.3.24与Suhosin-Patch mod_perl / 2.0.5
          的Perl / v5.10.1

   build立服务器:2013年5月15日10:17:30
      ______________________________________________________________________________________________________________________________

   当前时间:2014年5月12日星期一16:41:08 BRT
   重新开始时间:星期一,12-May-2014 15:36:37 BRT
   父代服务器生成:1
   服务器正常运行时间:1小时4分31秒
   总访问量:36446  - 总stream量:1.6 GB
    CPU使用率:u213.3 s13.65 cu0 cs0  -  5.86%CPU负载
    9.42请求/秒 -  442.8 kB /秒 -  47.0 kB /请求
   目前正在处理249个请求,有0个闲置的工作者

 WWRRKRKRRKRRRRWRRWWWRWCRR .......................................
 RWWWRRWRRRRKKRKRWRRRRRWWR .......................................
 WRWRCRRWRRWWRKRRWWRRWRWWW .......................................
 WRWKKWWWRWKRRWRCRRRWWRWWW .......................................
 WRWRWCRKCWWWRWWRRWWCRWRWW .......................................
 WRWKRWRRKKRKRRRRCWWKWWWRW .......................................
 RWWKWRRWKRRRWRRWWCRRRRRRW .......................................
 WWWRRWRKWWWKRWWWWRWWWKRRW .......................................
 RRRRRRRK.WKRRWRWWKRRWRRKR .......................................
 KCRRRRWRWWKRWWWRRKWRWRWRK .......................................

更新1:

我已经尝试禁用mod_security2,摆弄工人的设置,但最终Apache会消耗近20G的RAM(我已经添加了一个13G交换文件,以防止服务器崩溃)。

最后,我禁用了KeepAlive,并将MaxRequestsPerChild保持为100 – 现在Apache正在使用2-3G,并且正在清理请求,如下面的状态输出:

   当前时间:2014年5月13日星期二17:07:48 BRT
   重新启动时间:2014年5月13日星期二16:49:14 BRT
   父代服务器生成:0
   服务器正常运行时间:18分33秒
   总访问量:6637  - 总stream量:133.2 MB
    CPU使用率:u34.43 s3.05 cu0 cs0  -  3.37%CPU负载
    5.96个请求/秒 -  122.5 kB /秒 -  20.5 kB /请求
   目前正在处理14项请求,有86名空闲工人

 ..................ř............................... ..............
 ________________ RR__R_R__RC_RWC ___________________..............
 R_WC__R ___ [R _______________________________________..............
 .................................................. ..............
 .................................................. ..............
 .................................................. ..............
 .................................................. ..............
 .................................................. ..............
 .................................................. ..............
 .................................................. ..............

KeepaliveTimeout将有助于减less悬挂的“阅读”工作人员。

MPM使用多个进程与多个线程来处理传入的stream量,所以你看到的是正常的Apache操作。

这种默认调整可能会更好地满足您的需求:

 ServerLimit 12 StartServers 2 MaxClients 500 MinSpareThreads 25 MaxSpareThreads 50 ThreadsPerChild 50 

这将导致总共10个进程产生( MaxClients / ThreadsPerChild ),这将显着减less服务器的内存占用。 由于CPU的可用性,您可以在较less的进程中支付更多的线程。

请注意,更改这些variables需要Apache完全停止然后重新启动。

工作服务器上面显示的进程之间的关系是什么? 我期望最多可以看到10个进程(如工作者设置中的ServerLimit – 不考虑主进程)。

这看起来不像运行worker MPM的Apache服务器的top 。 我正在运行两台服务器,一台使用MPM,另一台使用prefork MPM。 对于worker, top httpd.worker Apache进程列为httpd.worker ,并且进程数量与通过mod_status可见的活动服务器数量(带有非点条目的点数)匹配。 使用prefork,进程被列为httpd ,并且数量大致匹配空闲/活动工作者(每个非点入口)的数量。

所以给这个mod_status输出:

 ..................R............................................. ..............._RR__R_R__RC_RWC__............................... R_WC__R___R_.................................................... ................................................................ ................................................................ ................................................................ ................................................................ ................................................................ ................................................................ ................................................................ 

在运行prefork的服务器上应该显示大约31个httpd进程,而在运行worker的服务器上应该显示3个httpd.worker进程。