Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4

今天远程支持同事在Windows环境调优Apache服务器性能,记录在此,供需要的朋友参考。

Java EE应用,同时部署在两个Tomcat(5.5.27)实例上,前面放了个Apache(httpd-2.2.19-win32-x86-no_ssl),通过mod_jk(1.2.32)做负载均衡,同一台物理服务器,操作系统为64位的Windows Server 2003 SP2。现象是60+客户端,平均每个客户端每秒请求数2次,单个请求正常响应时间在500ms以内,即每秒冲进来120个请求,并发量最多在60上下,Apache就已不堪"重"负,静态资源响应时间都超过10s,同时Tomcat和数据库服务器均正常。凭我的经验,同样的压力直接压到Tomcat也不至于这么难看。看来问题出在Apache。

首先修改httpd.conf配置文件,打开status模块:

LoadModule status_module modules/mod_status.so
<Location /status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 #需要的话也可放开为all
</Location>

这样我们就能通过/status页面查看服务器当前的状态信息,结果观察到worker(即线程)数仅为64!坑爹啊!难怪撑不住。我记得以前Windows下面的Apache默认线程数没这么小的。找准问题,接下来就好办了:

<IfModule mpm_winnt.c>
  ThreadsPerChild 300
  MaxRequestsPerChild 0
</IfModule>

稍微解释一下:mpm_winnt.c是Apache为Windows NT提供的MPM (Multi-Processing Module),对应到Linux环境下,则有prefork.c(多进程/每进程1个线程)和worker.c(多进程+多线程)两种MPM可选。Windows下面只会有父与子两个进程,因此单个子进程能同时起多少线程(ThreadsPerChild)就成了调优的关键。另一个参数MaxRequestsPerChild的含义是单个子进程累计最多处理到少个请求,超过该值则退出重启,这是出于防止内存泄露慢慢拖垮整个服务器而做的防御性措施,0表示不做此限制。

新配置上线后,客户端数量顺利冲上200+。Case closed.


只有注册用户登录后才能发表评论。


网站导航: