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

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

我正在调试 Apache 2.2 服务器(它与 MySQL + Courier + Mongo + Postgre 共享)。该服务器是裸机(无虚拟化),配有 2 个四核 Xeon(总共 16 核)和 12GB ECC RAM(未来几天将升级到 24GB)。MySql 已将 innodb_buffer 设置为 2G,运行正常。Mongo 和 Postgre 几乎未动过 - 仅用于开发。

问题是 Apache 占用了所有可用内存,最终占用了所有交换空间(因此 MySql 会因为占用更多内存而崩溃)。我们有 Apache 2.2,带有 worker MPM 和 mod_security。每当我们重新启动它时,我们都有大约 8G 的可用 RAM。

我想了解一些事情:

  • 显示的进程 top与工作服务器之间有什么关系?我期望最多看到 10 个进程(作为工作服务器设置中的 ServerLimit - 不考虑主进程)。
  • RES 内存量是用于每个线程还是用于每个进程?
  • 在下面的 mod_status 输出中,有很多 READING 请求停留在那里很长时间。我尝试启用 ExtendedStatus 来发现有哪些客户端,但我找不到任何有用的信息 - 有什么建议吗?
  • 根据实际内存使用情况,我需要多少 RAM 来处理 400 个并发连接?(因为 mod 状态显示 250 已经耗尽)
  • 那么提高 ThreadsPerChild 而不是提高 MaxClients/ServerLimit 怎么样?
<IfModule worker.c>
启动服务器 2
最大客户数 250
最小备用线程数 25
最大备用线程数 75
每个子线程数 25
每个孩子的最大请求数 0
服务器限制 10
</IfModule>

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
内存:总计 12187448k,已使用 10686748k,可用 1500700k,缓冲区 67104k
交换:总计 1048568k,已使用 275904k,可用 772664k,缓存 2371208k

  PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
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

   服务器建立时间:2013 年 5 月 15 日 10:17:30
     ________________________________________________________________________________________________________________________________

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

錯過RKRKRRKRRRRRRWRRWWWRWCRR.......................................
RWWWRRWRRRRKKRKRWRRRRRWWR.......................................
写信给 WRWRCRRWRRWWRKRRWWRRWRWWWW.......................................
響響KWWWRWKRRWRCRRRWWRWWW.......................................
WRWRWCRKCWWWRWWRRWWCRWRWW.......................................
WRWKRWRRKKRKRRRRCWWKWWWRW.......................................
RWKWRRWKRRRWRRWWCRRRRRRW.......................................
韓國語言 ...人語言韓國語
RRRRRRRK.WKRRWRWWKRRWRRKR.......................................
KCRRRRRWRWWKRWWRRKWRWRWRK...............................

更新 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 - 总流量:133.2 MB
   CPU 使用率:u34.43 s3.05 cu0 cs0 - 3.37% CPU 负载
   5.96 个请求/秒 - 122.5 kB/秒 - 20.5 kB/请求
   目前正在处理 14 个请求,86 名闲置工人

.................R..............................................
________________RR__R_R__RC_RWC___________________..............
R_WC__R___R_______________________________________..............
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................

答案1

KeepaliveTimeout将有助于减少悬而未决的“阅读”工人。

MPM 使用具有多个线程的多个进程来处理传入流量,因此您看到的是正常的 Apache 操作。

这种默认调整可能更适合您的需要:

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

这将导致总共生成 10 个进程 ( MaxClients/ ThreadsPerChild),从而显著减少服务器的内存占用。由于 CPU 可用性,您可以在更少的进程中提供更多线程。

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

答案2

顶部显示的进程与工作服务器之间有什么关系?我期望最多看到 10 个进程(作为工作服务器设置中的 ServerLimit - 不考虑主进程)。

这看起来不像是top运行 worker MPM 的 Apache 服务器。我运行了两个服务器,一个使用 worker MPM,另一个使用 prefork MPM。使用 worker,将topApache 进程列为httpd.worker,进程数与通过 mod_status 可见的活动服务器数(带有一些非点条目的点线)相匹配。使用 prefork,进程列为httpd,数量大致与空闲/活动工作程序的数量(每个非点条目)相匹配。

因此给出这个 mod_status 输出:

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

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

相关内容