Apache和Tomcat结合提高性能优化
研究了Apache和Tomcat做负载均衡,系统正式上线后就需要考虑如果对Apache和Tomcat进行性能优化,以便能够充分发挥硬件和软件的处理能力。
ApacheHttpServer:
影响性能的最核心特性:MPM(Multi-ProcessingModules,多道处理模块):
进入httpd-2.0.45目录,运行以下代码:
$./configure--help|grepmpm显示如下:
--with-mpm=MPM
ChoosetheprocessmodelforApachetouse.
MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool}上述操作用来选择要使用的进程模型,即哪种MPM模块。prefork就是Unix平台上缺省的MPM。查看Httpd.conf
<IfModulempm_prefork_module>
#StartServers5
#MinSpareServers5
#MaxSpareServers10
#MaxClients150
#MaxRequestsPerChild0
ServerLimit2048//可配置的进程数的上限
ThreadLimit64//设置在每个子进程可配置的线程数上限
StartServers8//初始化进程数
MaxClients2048//设定的是Apache可以同时处理的请求,是最重要的参数
MinSpareThreads64//最小空闲进程
MaxSpareThreads256//最大空闲进程
ThreadsPerChild64
MaxRequestsPerChild0//(默认10000)每个子进程可处理的请求书,每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。
</IfModule>StartServers,MinSpareServers,MaxSpareServers,MaxClients指令用于调节父进程如何产生子进程.
MaxClients:设定的是Apache可以同时处理的请求数,默认值是256。若要提高最大请求数,需要添加ServerLimit数,ServerLimit最大支持20000,注意:ServerLimit需要放置于MaxClient前面.一般设置小于MaxClients。
MaxRequestsPerChild指令控制服务器杀死旧进程产生新进程的频率。
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers,那么Apache将以最大每秒一个的速度产生新的子进程。
Tomcat性能优化:
1JVM内存调整
当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。
-Xms<size>表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。
说明:如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM不是Throwable的,无法用try...catch捕捉。
PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanategeneration)如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。
-XX:PermSize=512MB最小尺寸,初始分配
-XX:MaxPermSize=512MB最大允许分配尺寸,按需分配
在Tomcat安装目录下的bin/catalina.sh文件下添加
JAVA_OPTS="-Xmx2048M-Xms1024M-XX:PermSize=512M-XX:MaxPermSize=512M";设置了初始堆大小为2014M,最大值为2048M。永久保存区域初始大小512M,最大允许分配尺寸512内存。
2禁用DNS查询:
Settotrueifyouwantcallstorequest.getRemoteHost()toperformDNSlookupsinordertoreturntheactualhostnameoftheremoteclient.SettofalsetoskiptheDNSlookupandreturntheIPaddressinStringforminstead(therebyimprovingperformance).Bydefault,DNSlookupsareenabled.Server.xml中的Connector节点中进行设置:修改server.xml文件中的enableLookups参数值为false
3调整线程数
Server.xml中的Connector节点中进行设置如下:
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
maxThreads:这个值表示Tomcat可创建的最大的线程数。默认为200;Ifnotspecified,thisattributeissetto200。
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。Thedefaultvalueis100
connnectionTimeout网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreadsTomcat初始化时创建的线程数。Ifnotspecified,thedefaultof10isused.
maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。(tomcat5以后已删除)
<Connectorport="80"maxThreads="150"minSpareThreads="25"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"disableUploadTimeout="true"/>总结:
首先要争取使得操作系统以及网络资源达到最优,并且最好使用高版本的JDK。对于有大量静态页面的系统,采用Apache集成Tomcat的方式,把静态页面交由Apache处理,动态部分交由Tomcat处理,能极大解放Tomcat的处理能力。通过Apache和Tomcat负载提供稳定高并发的性能需求。同时需要对Tomcat自身进行优化,包括增大内存、调节并发线程数等。