我正在调试 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,将top
Apache 进程列为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
进程。