昨天查了一天的资料,运气不错,收获不小,解决了一个老大难问题: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,?褂玫哪诖嬉不厥樟恕R虼耍旁诖航谄诩洌鄄斓椒衿髟?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.去掉了一些不用的服务。
1、jboss配置,项目的发布
....\jboss\server\default\deploy\report.war(项目的名称)
2、jboss端口的修改
....\jboss\server\default\deploy\jbossweb-tomcat50.sar\server.xml
3、jboss中数据库的连接配置
....\jboss\server\default\deploy\db2-ds.xml(DB2数据库)
4、jboss部分参数的调整
在E:....\jboss\server\default\conf\jboss-services.xml中修改
name="jboss.system:service=ThreadPool">
<attribute name="Name">JBoss System Threads</attribute>
<attribute name="ThreadGroupName">System Threads</attribute>
<!-- How long a thread will live without any tasks in MS -->
<attribute name="KeepAliveTime">60000</attribute>
<!-- The max number of threads in the pool -->
<attribute name="MaximumPoolSize">300</attribute>
<!-- The max number of tasks before the queue is full -->
<attribute name="MaximumQueueSize">1000</attribute>
Name:在poll中threads的名称
ThreadGroupName:threads group的名称
KeepAliveTime:当threads空闲时,保持活动的最长时间(单位毫秒)
MaximumPoolSize:可以并发的threads的最大数目
MaximumQueueSize:允许等待的request的最大数目
BlockingMode:等待队列满了以后的处理方式
5、jboss虚拟内存的分配
在....\jboss\bin\run.sh中修改
JAVA_OPTS=$JAVA_OPTS -Xms512m -Xmx1024m -XX 128k -XX:MaxPermSize=512 -XX:+AggressiveHeap
(1)-XX:+Aggressive会使得-Xmx1024m没有意义。这个参数让JVM忽略Xmx的参数,疯狂的消耗物理内存。
(2)-XX 128k 这使得jboss每增加一个线程(thread)就会立即消耗128k的内存,最佳值是128k,默认值是512.
6、其他项配置
..../jboss/server/default/lib/mysql-connector-java-3.1.12-bin.jar
..../jboss/server/default/conf/standardjaws.xml、standardjboss.xml、standardjbosscmp-jdbc.xml、login-config.xml
没有评论:
发表评论