apache+tomcat+JK 集群 并发
问题:并发一直上不去。求大神指点。
测试机环境:Red hat6.3 IBM 8G 内存 4核处理器
主要配置清单:
httpd-mpm.conf
<IfModule mpm_prefork_module>
ServerLimit 4000
StartServers 128
MinSpareServers 128
MaxSpareServers 256
MaxClients 4000
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 5
ServerLimit 20
ThreadLimit 200
MaxClients 4000
MinSpareThreads 25
MaxSpareThreads 250
ThreadsPerChild 200
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_beos_module>
StartThreads 10
MaxClients 50
MaxRequestsPerThread 10000
</IfModule>
<IfModule mpm_netware_module>
ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxRequestsPerChild 0
MaxMemFree 100
</IfModule>
<IfModule mpm_mpmt_os2_module>
StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_winnt_module>
ThreadsPerChild 2000
MaxRequestsPerChild 0
</IfModule>
workers.properties
worker.list = controller,tomcat1,tomcat2,tomcat3
#========tomcat1========
worker.tomcat1.port=7009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=192.168.45.33 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=6009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=192.168.45.33 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat3========
worker.tomcat3.port=5009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat3.host=192.168.45.33 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2,tomcat3 #指定分担请求的tomcat,旧版本中的balanced_workers,已不再推荐使用!
worker.controller.sticky_session=1 #sticky_session为1表示,
httpd.conf
LoadModule jk_module modules/mod_jk.so
JkLogFile /var/log/mod_jk.log
JkShmFile logs/mod_jk.shm
JkLogLevel info
JkWorkersFile conf/workers.properties
JkMount /* controller
server.xml
<Executor name="tomcatThreadPools" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="20" maxIdleTime="15000" />
<Connector executor="tomcatThreadPools"
port="6080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="60000"
keepAliveTimeout="15000"
minProcessors="100"
maxProcessors="1000"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="500"
maxKeepAliveRequests="1"
redirectPort="6443"
maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="1000" disableUploadTimeout="true"/>
<Connector executor="tomcatThreadPools"
keepAliveTimeout="15000"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="500"
acceptCount="1000"
connectionTimeout="20000"
maxKeepAliveRequests="1" port="6009" protocol="AJP/1.3" redirectPort="6443" />
tomcat启动内存
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms1024m -Xmx1024m -Duser.timezone=Asia/Shanghai"
测试结果:
Apache+单个tomcat 静态页面 : 并发 1500 请求转发:1500
apache+两个tomcat 静态页面: 并发2300 请求转发: 1800
apache+三个tomcat静态页面: 并发2300 请求转发:1900 apache tomcat mod_jk Linux 并发
[解决办法]
首先,要确认你确实编译时用了 work 模块,http://localhost:端口/server-info
其次,删除所有非work模块的mpm配置信息,免得混淆视听。
Work模式,简单点说:是多进程派生更多线程,然后每个线程负责一个请求的模式。
参见:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/worker.html
关于你的配置,大概是:
<IfModule mpm_worker_module>
AcceptMutex pthread -- 用于串行化多个子进程在(多个)网络套接字(socket)上接受请求的方法
ThreadLimit 200 -- 每个子进程可派生的线程数上限(在其它指令之前放置)
ThreadsPerChild 200 -- 每个子进程建立的线程数(在其它指令之前放置)
StartServers 5 -- 初始进程数量
ServerLimit 20 -- 进程数量上限
MaxClients 4000 -- 允许同时服务的最大接入请求数量(最大并发连接数)
MinSpareThreads 25 -- 最小空闲线程数
MaxSpareThreads 250 -- 最大空闲线程数
MaxRequestsPerChild 0 -- 每个子进程在其生存期内允许伺服的最大请求数量(0就好)
</IfModule>
这段配置暂时没啥问题。
所以你可以在压力测试时监控下:http://localhost:端口/server-status
然后再探讨下情况。