编辑server/slim/jbossweb-tomcat55.sar/server.xml;
*检查server.xml文档中使用的连接器,例如:http连接器:
<Connectorport="8080"address="${jboss.bind.address}"maxThreads="150"
minSpareThreads="25"maxSpareThreads="75"enableLookups="false"
redirectPort="8443"acceptCount="100"connectionTimeout="20000"
disableUploadTimeout="true"/>
注:acceptCount是排队请求的数量;
*应该将线程数(最大线程数)设置比最大预期负载(同时并发的点击)多25%(经验规则);
*应该将minSpareThread设置比正常负载多一些;
*应该将maxSpareThread设置比峰值负载多一些;
*minSpareThread指“启动以后,总是保持该数量的线程空闲等待”;
*maxSpareThread指“如果超过了minSpareThread,然后总是保持该数量的线程空闲等待”;
*删除不需要的valve和日志;如果不使用JBoss的安全,删除JBoss的安全valve;
*预编译JSP(内置的编译器编译速度相当快,对于小的站点就没有必要预先编译了);关闭sever/slim/jbossweb-tomcat50.sar/conf/web.xml中的development模式;
昨天查了一天的资料,运气不错,收获不小,解决了一个老大难问题:JBoss内存紧张的问题。
这是一个困扰了我两年整的问题,就是从前年这个时候,用JBoss 3.2.1架站以来,始终是一个大问题。不大的站点,1G的内存都不够用,经常要消耗500Mb的交换内存(swap)。
原来是自己犯了非常低级的错误,不懂JAVA_OPTS各参数的含义造成的。
之前的JAVA_OPTS是 -Xms 520m -Xmx 1220m-Xss 15120k +XX:AggressiveHeap
这个JAVA_OPTS犯了2个致命的错误:
1. +XX:AggressiveHeap会使得 Xms 1220m没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
另外Xmx作为允许jvm使用的最大内存数量,不应该超过物理内存的90%。
而之所以使用了这个参数,是因为不加的话,JBoss会在运行一天左右的时间后迅速崩溃,上机课是,甚至出现过半个小时就崩溃的情况。
之所以要用这个参数,用swap支持服务器运行,是因为犯了下面的错误:
2. -Xss 15120k
这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
这就是JBoss刚启动时,还有200Mb内存富余,但会在一个小时内迅速用完,因为服务器的threads在迅速增加。前3天,每天都多吃80Mb左右的swap.在第四天开始稳定下来。今年春节在外度假,观察到了这个现象,却不理解其原因:服务器在线程到达100之后,一般不再增加新的线程,新增加的在用完之后,会被迅速destroy, 1.25-2.10所使用的线程基本是1.21-1.23创建的,因此没有再消耗新的内存。服务器持续运行时间,也因此大大超乎我5天的预期,到达了20天。
昨天所作的修改:
1.修改JAVA_OPTS,去掉+XX:AggressiveHeap,修改Xss。现在的JAVA_OPTS为:
-Xms 520m -Xmx 900m -Xss 128k
2.修改deploy/jbossweb-tomcat55.sar/service.xml
将maxThreads根据目前的访问量由默认的250降为75,并使用jboss 4默认未写在标准service.xml里面而jboss 3写入了的2个参数: maxSparseThreads=55,minSparseThreads=25
3.修改了oracle-ds.xml将最大连接数有150降为50.
4.去掉了一些不用的服务。
jboss3.2.3配置…/jbossweb-tomcat41.sar/META-INF/jboss-service.xml,jboss3.2.6配置…./jbossweb-tomcat50.sar/server.xml
<!-- jboss3.2.3jboss-service.xml -->
<!-- A AJP 1.3 Connectoron port 8009 -->
<ConnectorclassName="org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}"port="8009" minProcessors="5"maxProcessors="1000" enableLookups="true"redirectPort="8443" acceptCount="100" debug="0"connectionTimeout="20000" useURIValidationHack="false"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
<!-- jboss3.2.6server.xml -->
<!-- A AJP 1.3 Connectoron port 8009 -->
<Connectorport="8009" address="${jboss.bind.address}"
enableLookups="false"redirectPort="8443" debug="0"
maxProcessors ="1000" minProcessors=”5”
acceptCount="100"
protocol="AJP/1.3"/>
简单解释一两个参数(以tomcat5.0为准):
maxProcessors:最大并发数(连接数)
minProcessors
:初始化时启动的最小的进程数
acceptCount:在当前connector的连接数达到最大时,允许进入等待队列的数目
connectionTimeout:连接超时时间,单位为毫秒
enableLookups:是否允许通过DNS lookups,返回远程客户端的机器名,如果设为false,则只能返回IP地址。该参数默认为true,如果不需要,可以禁掉,设为false,可以提高服务器的性能
maxPostSize
:
设定允许透过POST上传参数的字节数,默认是2M(2097152),如果想禁掉该限制,则将该值设为一个小于或等于0 的值,如0、-1,如果所部署的应用中有上传工作,则需注意该配置
port="8009":这个值要与上述”1.4.3.workers2.properties”中的port一致
redirectPort="8443":是制定如果用了SSL机制访问服务的话,将会转向的端口,请参阅SSL相关的配置文档。
debug="0":这是配置日志级别的,可以忽略,因为该设置依赖于log4j的配置文件的设置,server/all/conf/log4j.xml