网络JBOSS调优整理

JBOSS调优

WEB程序调优

1.纯JSP比JSF性能要好
2.树形数据的显示如果用JSF性能要差,不如用低层次的JAVASCRIPT
WEB SERVICE调优
1.性能不太好,尤其依赖于传输的SOAP大小,因为在XML与JAVA OBJECT的转换中消耗太多
2.加缓存在SOAP上
3.JBOSS的WEB SERVICE有三个实现,原生的、CXF和METRO,性能最好的是METRO,最差是原生的 

JBOSS中的TOMCAT调优

1.CONNECTOR参数
当进入JBOSS的请求到达maxThreads,且又高于acceptCount的时候,用户就会收到Connection refused的错误信息,当HTTP请求的线程空闲了maxIdleTime时,系统就会杀掉这些线程,直到到达minSpareThreads数为止
2.如何计算程序就需的线程数
CPU数*200,如4核的设800
可以通过域名为jboss.web,name=http-127.0.0.1-8080,type=ThreadPool的MBEAN观察实际的线程数
3.处理周期长的WEB线程
WEB线程处理请求时,并不会马上结束,还会继续传递到EJB层,这样如果EJB层处理周期长,会导致WEB层请求数增长来处理新进来的请求
4.如何增大线程最大处理数
这完全依赖于CPU、RAM和SOCKET数
5.使用APACHE PORTABLE RUNTIME
增加APR包能提高性能20%,如果是WINDOWS系统则不建议
6.整合APACHE WEBSERVER与JBOSS SERVER
使用APACHE WEBSERVER作为JBOSS的前端,以达到HA的效果,又能提高20%的性能
结合方式是使用mod_jk mod_proxy_ajp mod_proxy_http
7.三种方式的比较
mod_proxy_ajp要高于其他两种
8.引入mod_cluster
9.web.xml中关于JSP的调优
development=false,避免访问前的检查
checkInterval=0,避免JSP需要重新编译
trimSpaces=true,删除JSP中的空格
genStringAsCharArray=true 

JBOSS中SERVICE的调优

SESSION BEAN
1.stateless session bean在池中数量大小的配置
每建一个SESSION BEAN,就会在jboss.j2ee域下建一个MBEAN,通过查看其信息得知BEAN的处理统计时间来调整BEAN数量大小,配置文件:/deploy/ejb3-interceptors-aop.xml
2.stateful session bean
SFSB是被JBOSS缓存在容器中,因此客户端的每个请求都会立即响应,同样也是通过SLSB的方式查看并调整CACHE的数量大小
3.SFSB与 SLSB的比较
SFSB性能要差10%
4.事务
EJB与普通RMI SERVICE相比,就是有完整的事务支持,如果EJB采用CMT,则可以保证其方法是在全局的事务上下文中被执行的,但开启事务的成本太高,如果不需用到事务的方法需将事务关闭

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

5.自定义EJB容器
JBOSS是以拦截器的方式运行EJB的,如果EJB中不需要事务的支持,可将这个INTERCEPTOR注释掉

< interceptor-ref  name ="org.jboss.aspects.
tx.TxPropagationInterceptor"
/>

6.比较软的方式自定义EJB容器
将定义写在新的XML文件中,以覆盖原先的设定

<? xml version="1.0" encoding="UTF-8" ?>
< aop  xmlns ="urn:jboss:aop-beans:1.0" >
< domain  name ="Non Tx Stateless Bean"  extends ="Intercepted Bean"
inheritBindings
="false" >
< bind  pointcut ="execution(public * *->*(..))" >
< interceptor-ref  name ="org.jboss.ejb3.stateless.
StatelessInstanceInterceptor"
/>
< interceptor-ref  name ="org.jboss.ejb3.
AllowedOperationsInterceptor"
/>
< stack-ref  name ="EJBInterceptors" />
</ bind >
</ domain >
</ aop >


JMS
1.基本概念
JMS provider:JMS系统
Messages:客户端交流的载体
Connection factories:产生链接的工厂
Destinations:有Queues和Topics
Queues:含有一堆Messag的队列,只能发给一个客户端
Topics:可以发给多个客户端
JMS clients:生产和消费Message的东西
MDB:一个特殊的consumer
2.JMS架构
如果客户端和服务器端同一个JBOSS,则通过JCA作通讯,通过调整deploy/jca-jboss-beans.xml中的WorkManagerThreadPool的参数来调优,
如果不在一个JBOSS内,则通过远程框架进行通讯,通过调整deploy\messaging\remoting-bisocket-service.xml中的org.jboss.remoting.transport.Connector里的参数大小来调优
3.调优JBoss Messaging Connectionfactory
deploy\messaging\connection-factories-service.xml
4.调优JBoss Messaging destinations
在deploy/messaging中增加*–service.xml文件,从而增加MBEAN,来增加队列,再调整其参数
5.HornetQ
是JBOSS 6.0之后的JMS服务器,没有依赖于任何JBOSS包,可以嵌于任何程序中。
调优主要针对deploy/hornetq/hornetq-configuration.xml文件中的journal和transport参数 
journal:journal-directory-存放message的地方,如果与其他文件夹共享,则会降低性能;journal-min-files:生成文件的个数,如果发现新文件建立的次数非常频繁,则考虑加大此数值来避免
6.JMS调优基本原则
减少message的大小;使用DUPS_OK_ACKNOWLEDGE;重用JMS资源,如connections, sessions, consumers, and producers;可以不持久化message的就不持久化。


持久层的调优

数据库设计调优
1.减少表所占的空间
这样IO读速度会加快,更少的内存;列的数据类型选少的;表设计要正规化(如果是报表类型的程序则非正规化的表速度要好)
2.数据库分割
如果某个表数据量太大,可将此表按某种逻辑分割成若干个小表,如按月份分成不同的表,不同月份的数据就放于不同的表中;
如果某个表中字段数太多,可将某些字段分组,不同的组建不同的表,如将BLOB类型的字段分割到新表中;
3.增加索引
对查询中用得比较锪WHERE字段做索引,索引数据是被抽出来,进行排序后单独存放的,如果不加索引,排序的动作只能在SQL被执行的时候做;
如果做了索引的字段被修改,则该字段的索引同样也要被修改,重新排序,这也会带来性能问题,因此一个表中最多只能放4-5个索引;
但如果这个表是只读的,则索引可以随意增加;
如果有组合索引,则UNIQUE的,值比较大的字段放在前面会比较好;
索引可以加在HIBERNATE的注释中

JDBC的调优
1. 使用链接池来链接数据库
数据链接的建立和关闭是一个非常昂贵的操作,能重用就重用,客户端从PreparedStatement Cache中取得对象,PreparedStatement再从链接池中取得链接,从而得以进行对数据库的操作
2.设置正确的fetch大小
如果设置了fetch大小为100,则JDBC会从数据库中取回100条记录,这样从ResultSet中读取next()是,是从内存中返回数据,超过了100再从数据库中取100以备用;
此数值一般设为当次查询总量的一半或1/4,但如果随便设高,性能反而下降;
JBOSS中设置全局大小:<connection-property name="defaultFetchSize">50</
connection-property>
3.INSERT和UPDATE使用批量操作
4.使用PreparedStatement而不使用Statement
PreparedStatement能避免SQL语句重复解释;使用PreparedStatement cache来缓存PreparedStatement对象
5.JDBC网络调优

< connection-property  name ="tcpSndBuf" > 65534 </ connection-property >
< connection-property  name ="tcpRcvBuf" > 65534 </ connection-property >
< connection-property  name ="tcpNoDelay" > true </ connection-property >



JPA/HIBERNATE调优
使用JDBC的限制:
由于是使用了原生的SQL语句,但不同的数据库SQL语句也是不同的,如果换数据库的时候SQL语句改动量大;
多表关联时,需维护JAVA OBJECT与数据表的对应关系;
加缓存时,工作量也比较大。
JPA与HIBERNATE的区别:JPA是JAVA的一个标准,HIBERNATE是JPA的一个实现
1.优化对象获取
HIBERNATE的N+1总量,如果有两个表是一对多的关系,查询父表的时候,子表的数据是不会被查出来的,直到调用查询子表的方法时子表的数据才被查出来,因此而多出一个SQL语句
使用LEFT OUTER JOIN来达到只用一个SQL语句就查出父表和子表的数据

Query q  =  entityManager.createQuery( " from Customer c left outer join
fetch c.items order by c.id " );


2.以分页的方式限制一次性获取数据的数量

q.setFirstResult(page * 100 ).setMaxResults( 100 );


3.不能同时使用分页和FETCH的方式
HIBERNATE的分页,是首先取出所有的数据再在内存中分页,以避免不同数据库中分页语句的不同 
4.使用BatchSize
@BatchSize(size = 50)
加载相关联的实体集合的个数,注意个数的对象是集合,不是集合里的单个元素
5.使用named queries作查询
这样会使用到PreparedStatement中的绑定参数
6.使用批量更新与插入

Session session  = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
for  ( int  index  =   0 ; index  < 1000 ;index ++ )  {
Person person 
= new Person();
book.setCountry(
"Usa");
book.setCity(
"NY");
person.setName(
"Inhabitant n." + index);
session.save(person);
// Flush every 50 records
if (index % 50== 0) {
session.flush();
session.clear();
}

}

session.getTransaction().commit();
session.close();


7.使用HIBERNATE CACHE
一级缓存,在SESSION关闭前都可以使用;
二级缓存,HIBERNATE使用第三方CACHE框架来做缓存

< property  name ="hibernate.cache.use_second_level_cache"
value
="true" />
< property  name ="hibernate.cache.region.factory_class"
value
="org.hibernate.cache.jbc2.
JndiMultiplexedJBossCacheRegionFactory"
/>
< property  name ="hibernate.cache.region.jbc2.cachefactory"
value
="java:CacheManager" />
< property  name ="hibernate.cache.region.jbc2.cfg.entity"
value
="mvcc-entity" />
< property  name ="hibernate.cache.region.jbc2.cfg.collection"
value
="mvcc-entity" />

启用缓存

@Entity
@Cache(usage 
=  CacheConcurrencyStrategy.TRANSACTIONAL, region  =
" customers " )
public   class  Customer  implements  Serializable  {
}


查询缓存

< property  name ="hibernate.cache.use_query_cache"  value ="true" />


启用查询缓存

@NamedQueries(
{
@NamedQuery(
name 
= "findCustomersByName",
query 
= "FROM Customer c WHERE c.name = :name",
hints 
= { @QueryHint(name = "org.hibernate.cacheable", value =
"true") }

)


使用缓存的策略:静态数据可以考虑,但查询和更新频率很高的、查询条件非常复杂的不建议用

 

jboss的7类性能调优

现在需要将项目使用的JBOSS服务器进行一次整体调优,搜集了一些资料,准备从以下几方面进行JBOSS的性能调优: 
(1)首先解决之前遇到的jboss无反(假死)应问题。该内容需要下次遇到时着手解决,现在的日志已经可以每日备份,计划用thread dump分析jboss假死问题. 
(2)JBOSS-JVM优化,内存参数设置. 
(3)分析JBOSS数据压缩功能,根据需要选用. 
(4)选用合适的日志输出等级和标准输出数据量大小. 
(5)考虑使用jboss-native,提高处理静态文件的处理速度. 
(6)数据库连接池优化. 
(7)关闭不需要的jboss服务. 

[1] jboss无反应或者CPU/mem usage very high 
we can use thread dump and jvm arguments to test the code. 
参见: 
http://binma85.iteye.com/blog/786349 
http://binma85.iteye.com/blog/819150 

[2]JBOSS-JVM 优化 
主要是对Jboss依赖的JVM参数进行优化设置 

引用
典型服务器配置有以下几种:  
-Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20  
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。  
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相同  
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC  
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。  
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection  
XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。  
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎  
摘自: http://wangtong40.iteye.com/blog/737235  



[3]分析JBOSS数据压缩功能,根据需要选用. 
当web容器需要大量的数据传输时,为减少数据传输时间,可以考虑启用数据压缩功能。类似css、js等数据是重点考虑对象。主要做法如下所示: 
打开server/default/deploy/jboss-web.deployer/server.xml 
找 到 protocol=”HTTP/1.1″的 Connector元素,添加属性 URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml” 

添加完后类似于: 

Xml代码   
  1. <Connector port=”8080″ address=”${jboss.bind.address}”      
  2. maxThreads=”250″ maxHttpHeaderSize=”8192″   
  3. emptySessionPath=”true” protocol=”HTTP/1.1″   
  4. enableLookups=”false” redirectPort=”8443″ acceptCount=”100″   
  5. connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”/>  
 
 
  1. <Connector port=”8080″ address=”${jboss.bind.address}”     
  2. maxThreads=”250″ maxHttpHeaderSize=”8192″  
  3. emptySessionPath=”true” protocol=”HTTP/1.1″  
  4. enableLookups=”false” redirectPort=”8443″ acceptCount=”100″  
  5. connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”/>  
 
  1. <Connector port=”8080″ address=”${jboss.bind.address}”     
  2. maxThreads=”250″ maxHttpHeaderSize=”8192″  
  3. emptySessionPath=”true” protocol=”HTTP/1.1″  
  4. enableLookups=”false” redirectPort=”8443″ acceptCount=”100″  
  5. connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”/>  



[4]选用合适的日志输出等级和标准输出数据量大小. 
打开server/default/conf/jboss-log4j.xml ,这是一个log4j的配置文件。log4j的详细配置说明请参看  http://logging.apache.org/log4j/1.2/index.html  。日志输出的太多,会导致服务器性能降低,所以减少不必要的日志输出。方法大体如下: 

找到 name=”org.jboss” 的category 元素,设置里面的priority元素为 <priority value=”INFO” /> 
建一个新的category,内容为 <category name=”javax.faces”><priority value=”INFO” /></category> 

log4j 还能够将不同的日志输入到不同的地方,为了以后维护方便,应该将不同 category的日志输入到不同的文件里。详细方法参看上面的网站里的说明。 

[5]考虑使用jboss-native,提高处理静态文件的处理速度. 
安装jbossNative 
    jboss的web container使用的 apache tomcat (http://www.apache.org)。 apache tomcat 有一个扩展包,使tomcat可以通过 java native interface 使用 apache portable runtime (APR),而APR则是大名顶顶的apache httpd 网络服务器的运行时环境。用了这个扩展之后,就使得tomcat可以借助于apache httpd的力量,性能得以提升,尤其是处理静态文件时效率更高。Jboss native,实际上就是tomcat的这个native的扩展,只不过被jboss又添进了一些为了和jboss更好协作而加进去的东西。 
要安装jboss native, 按以下步骤进行 

请到jboss的网站上下载,地址是 http://www.jboss.org/jbossweb/downloads/jboss-native/?action=a&windowstate=maximized, 依据服务器环境选择合适的版本。 目前我们用的版本是JBoss Native 2.0.4 Linux x86 。 
解压下载后的压缩包到某个目录,比如 jbossNative目录 
将jbossNative/bin/META-INF/bin/linux2/x86/openssl 复制到<jboss>/bin 
在<jboss>/bin目录里建一个文件夹,名为 native 
把jbossNative/bin/META-INF/lib/linux2/x86/ 目录下所有内容复制到上一步建好的<jboss>/bin/native目录下 

[6]数据库连接池优化. 
摘自http://wangtong40.iteye.com/blog/737235 
在JBOSS_HOME\Server\default\deploy目录下存在**-xa-ds.xml文件,用于JBOSS同数据库连接等配置,默认情况下**-xa-ds.xml文件中不包含关于数据库连接池等方面的配置信息,可以添加一下内容进行数据库连接池方面的设置: 

Xml代码   
  1. <min-pool-size>100</min-pool-size>      
  2. <max-pool-size>500</max-pool-size>   



[7]关闭不需要的jboss服务. 
摘自http://wangtong40.iteye.com/blog/737235 
在JBOSS中提供许多通常不需要的服务和Jar包,比如JMX、Mail、AOP、Hibernate等,可以根据具体项目所涉及的技术,删减JBOSS内置应用,从而提高JBOSS中间件启动速度,减少占用系统资源。 

删减服务  
   在%JBOSS_HOME%/server/default/deploy中含有一些比如jboss-aop.deployer等目录和mail-service.xml等应用配置文件,如果不需要使用这些应用的话,可以将其一一删除,不过删除时要分外小心,避免应用系统无法启动。 
下图为只包含数据库应用的一个已删减不需要服务后的deploy文件夹目录: 

删减Jar包 
   在%JBOSS_HOME%/server/default/lib中包含一些应用系统不需要的Jar包,这些包同样可以进行删除。

Jboss的系统性能调优方法

首先是jbossNative

  jboss的web container使用的 apache tomcat。 apache tomcat 有一个扩展包,使tomcat可以通过 java native interface 使用 apache portable runtime (APR),而APR则是大名顶顶的apache httpd 网络服务器的运行时环境。用了这个扩展之后,就使得tomcat可以借助于apache httpd的力量,性能得以提升,尤其是处理静态文件时效率更高。Jboss native,实际上就是tomcat的这个native的扩展,只不过被jboss又添进了一些为了和jboss更好协作而加进去的东西。

  要安装jboss native, 按以下步骤进行.

  请到jboss的网站上下载,依据服务器环境选择合适的版本。 目前我们用的版本是JBoss Native 2.0.4 Linux x86 。

  解压下载后的压缩包到某个目录,比如 jbossNative目录

  将jbossNative/bin/META-INF/bin/linux2/x86/openssl 复制到/bin

  在/bin目录里建一个文件夹,名为 native

  把jbossNative/bin/META-INF/lib/linux2/x86/ 目录下所有内容复制到上一步建好的/bin/native目录下.

  然后是降低Jboss日志等级

  打开 /server/default/conf/jboss-log4j.xml ,这是一个log4j的配置文件。log4j的详细配置说明请参看http://logging.apache.org/log4j/1.2/index.html 。日志输出的太多,会导致服务器性能降低,所以减少不必要的日志输出。方法大体如下:

  找到 name=”org.jboss” 的category 元素,设置里面的priority元素为

  建一个新的category,内容为

  log4j 还能够将不同的日志输入到不同的地方,为了以后维护方便,应该将不同 category的日志输入到不同的文件里。详细方法参看上面的网站里的说明。

  起用jboss内的tomcat对传输数据的压缩功能

  合同管理里用了大量的javascript css等,为了减少传输时间,可以起用压缩功能。方法是:

  打开/server/default/deploy/jboss-web.deployer/server.xml

  找到 protocol=”HTTP/1.1″的 Connector元素,添加属性 URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”

  添加完后类似于:

  

  maxThreads=”250″ maxHttpHeaderSize=”8192″

  emptySessionPath=”true” protocol=”HTTP/1.1″

  enableLookups=”false” redirectPort=”8443″ acceptCount=”100″

  connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”/>

  使用ehcache做hibernate的二级缓存

  起用二级缓存,可以大大提高hibernate的运行效率。

  到这里下载 ehcache

  解压到某个目录,然后按步骤调试即可。

 

jboss5优化

 

1、调整JVM在bin.bat或bin/run.cfg文件里。

       -Xms<size>设置堆的最小值;-Xmx<size>设置堆的最大值;-XX:Newsize=<size>设置年轻代的最小值;-XX:MaxNewsize=<size>设置年轻代的最大值;-XX:MaxPermSize=size设置永久代的大小。

2、配置数据源:在*-ds.xml里<min-pool-size>最小连接数;<max-pool-size>最大连接数。

3、配置HTTP请求线程池deployer/jbossweb.sar/server.xml:maxTreads最大线程;minSpareThreads超过现在用线程的数量;maxSpareThreads超过这个数量的空闲数量的线程将被关闭;accpetCount排除等待一个线程空闲的最大请求数。

4、调整jspservlet/jbossweb.deployer/web.xml里development为true应用服务器会查看jsp是否使用修改文本间隔进行更新了,为false,修改的jsp会使用检查间隔在后台被编译。checkInterval查看jsp是否需要被重新编译的检查间隔秒数,如果为0里,jsp不会因为修改或重新编译而被查看。

5、删除不需要的服务。

邮件服务:server/xxx/deply/mail-service.xml,server/xxx/lib/mail*.jar

调试程序服务:service server/xxx/deploy/scheduler-service.xml,server/xxx/deploy/schedule-manager-service.xml,server/xxx/lib/cheduler-plugin*.jar

监视服务:service server/xxx/deploy/monitoring-service.xml,server/xxx/lib/Jboss-monitoring.jar

消息发送(JMS):server/xxx/deploy/meassaging,server/xxx/deploy/jms-ra.jar,server/xxx/lib/jboss-message*.jar

唯一ID键生成器:server/xxx/deploy/uuid-key-generator.sar,server/xxx/lib/automumber-plugin.jar

HTTP调用程序服务:server/xxx/deploy/http-invoker.sar,server/xxx/httpha-invoker.sar(仅在all配置中)

主页:server/xxx/deploy/root.war

JMX控制台:server/xxx/deploy/jmx-console.war

Web控制台:server/xxx/deploy/management

Quartz调试程序服务:server/xxx/deploy/quartz-ra.rar

一.调整JBOSS最大连接数.

配置deploy/jboss-web.deployer/server.xml文件 .
       <Connector
         port="8080"
         address="0.0.0.0"
         maxThreads="1600"
         minSpareThreads="100"
         maxSpareThreads="250"
         emptySessionPath="false"
         enableLookups="false"
         redirectPort="8443"
         acceptCount="800"
         connectionTimeout="20000"
         disableUploadTimeout="true"
         URIEncoding="UTF-8"
         />
maxThreads:表示最多同时处理的连接数。应该将线程数(最大线程数)设置比最大预期负载(同时并发的点击)多25%(经验规则)。
acceptCount:当同时连接的人数达到maxThreads时,还可以接收排队的连接。

minSpareThread:指“启动以后,总是保持该数量的线程空闲等待”;设置比预期负载多25%

 

maxSpareThread:指“如果超过了minSpareThread,然后总是保持该数量的线程空闲等待”;设置比预期负载多25%

 

        其中主要修改两个参数maxThreads和acceptCount值。增加maxThreads,减少acceptCount值有利缩短系统的响应时间。但是maxThreads和acceptCount的总和最高值不能超过6000,而且maxThreads过大会增加CPU和内存消耗,故低配置用户可通过降低maxThreads并同时增大acceptCount值来保证系统的稳定。

下表罗列出了在不同并发情况下jboss参数与并发在线的一般关系。

并发数

服务器内存

jboss参数

    maxThreads acceptCount
50以下 2G 256 800
50-300 4G 600 1024
300-800 8G 1024 1528
800-1000 8G 1024 2048
1000-1200 12G 1526 2048
1200-1500 16G 2048 2048
       
       

 

二.调整 jvm参数

A:JVM启动参数共分为三类: 
        其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
        其二是非标准参数(-X),指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,并不保证所有jvm实现都满足,所以为了提高性能,往往需要调整这些参数,以求系统达到最佳性能。另外这些参数不保证向后兼容,也即是说“如有变更,恕不在后续版本的JDK通知”(这是官网上的原话);
        其三是非Stable参数(-XX),这类参数在jvm中是不稳定的,不适合日常使用的,后续也是可能会在没有通知的情况下就直接取消了,需要慎重使用。
B:而JVM 内存又可分为三个主要的域 
        新域、旧域以及永久域。JVM生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便进入旧域。而在永久域中是用来存储JVM自己的反射对象的,如class和method对象,而且GC(Garbage Collection)不会在主程序运行期对永久域进行清理。其中新域和旧域属于堆,永久域是一个独立域并且不认为是堆的一部分。
C:各主要参数的作用如下 
        -Xms:设置jvm内存的初始大小
        -Xmx:设置jvm内存的最大值
        -Xmn:设置新域的大小(这个似乎只对 jdk1.4来说是有效的,后来就废弃了)
        -Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)
        -XX:NewRatio :设置新域与旧域之比,如-XX:NewRatio = 4就表示新域与旧域之比为1:4
        -XX:NewSize:设置新域的初始值
        -XX:MaxNewSize :设置新域的最大值
        -XX:PermSize:设置永久域的初始值
        -XX:MaxPermSize:设置永久域的最大值
        -XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个 Survivor区则用来存放每次垃圾回收后存活下来的对象)
D:常见的错误 
        java.lang.OutOfMemoryError相信很多开发人员都用到过,这个主要就是JVM参数没有配好引起的,但是这种错误又分两种:java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space,其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是有关永久域的内存溢出,可以通过配置 -XX:MaxPermSize来设置。

下面是个例子,请根据实际情况进行修改,修改run.conf文件中的如下内容
 JAVA_OPTS="-Xms256m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Djboss.platform.mbeanserver"


 

猜你喜欢

转载自topmanopensource.iteye.com/blog/1866852