我调整了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 – 不考虑主进程)。 <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进程。