写这篇文章是因为今天旁听了一课,觉得学到了不少,应该记录一下。
其实优化应该基于压力测试结果来进行,但是下面几项可以提前做。
一、jvm启动参数
-Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
搞java开发的对这几项参数大家应该眼熟吧?说来惭愧,以前只知道加这些参数就不会导致内存不足,但是对其含义并不明白。今天总算明白了,这里我也再说明一遍,不正确的地方还请大家指正。
-Xms -Xmx 这两个参数是jvm创建对象时所占用的最小最大内存,一般建议他们俩设成一样的,并且是1024m,为什么呢?因为当java对象占用的内存达到这个最大值时,会进行强制GC,也就是内存回收。可能大家会认为这个内存越大越好,大一点确实有好处,这样强制GC的周期可能会长点,比如设置4096m的内存,假设系统要1小时才进行一次GC,而1024m 15分钟可能就进行一次GC,但是进行GC时系统会有一定时间的延迟,延迟时间跟内存大小有很大关系,假如4096m的内存GC完成需要10秒,但是1024m可能就2-3秒,虽然看上去差不了多少,但是对客户体验是非常重要的,比如一个业务平常只要3秒,但是碰到系统进行垃圾回收这个点,太长时间的等待会让客户产生疑惑。
-XX:PermSize -XX:MaxPermSize这两个参数的作用请参见Jon Masamitsu's Weblog 因为本人英文不好,怕翻译不准确,误导大家。但总得来说它存放的是不会被GC回收的内容,比如类的方法,类的名字等等。这个参数建议也是一样大,512m足矣,如果还不够就需要看看是不是程序有问题。
当然设置上面两个参数还要结合实际的物理内存来考虑,另外特别要注意还要加上jvm本身占用的内存。
二、初始线程池
-Dweblogic.threadpool.MinPoolSize=50 -Dweblogic.threadpool.MaxPoolSize=100
这两个参数是设置Weblogic最少最多线程数,初始状态是5,太少了!这个值是根据CPU的核数来定的。具体计算公式我也不太清楚,个人认为核数*10应该行了,太多浪费资源,而且CPU性能反而下降,因为在他们之间调度是有损性能的。
三、初始连接池
注意这不是线程池!连接池的作用大家也应该清楚了,就是在程序需要用到数据库连接的时候可以直接从连接池里拿来用,而不需要先建立连接,再去请求数据库,这样效率会提高很多。weblogic初始值是1,最大容量是15,容量增长是1。这样的设定大多数也是不合理的!视应用的访问量和数据库的连接上限而定,我们可以适当把初始量加大,比如10,最大容量我们加到50,容量增长每次增长10。这里要特别说明一下容量增长这个值,一般不建议使用默认的1,因为高峰的时候,当初始连接用完了,weblogic会去向数据库申请新的连接,如果每次增长1,那效率无疑会受到严重影响。所以建议一次多取点。
设置这个参数特别要注意的地方,假如是集群的话,要根据数据库连接上限合理设置最大容量,比如有10台Server,数据库连接上限是500,那么每台最多有50个连接。
连接池里还有个参数:语句高速缓存大小。它相当于PreparedStatement???这个我不敢确定,请大家指教。但是可以肯定的是,数据库对于这个东西跟连接一样是有上限的,如果是集群,更加要注意,因为它的理论数量是:连接最大容量*语句高速缓存大小*Server数。比如连接最大容量50,高速缓存大小10,10台Server,那么总共就有50*10*10 = 5000的预处理语句,这一般是数据库的上限了,所以这个参数要根据这个三者来权衡设定。
另外还要提到这个驱动程序类名称这个参数,带有XA字眼的是用于分布式事务的驱动包(比如oracle.jdbc.xa.client.OracleXADataSource),但是它性能要差一点,如果应用里没有用到如JTA或者EJB这些分布式事务的东西,那么这个驱动需要换掉。
高级设置里有个保留时测试连接,这个默认没有勾上。实际上建议勾上。虽然每次执行SQL之前会先执行这个sql(严格来说不是每次,它是有频率的,可以设置),但是它对性能的影响可以说是微乎其微,但是好处多多。比如你一个连接失效了,它会重新获取一个新连接,而不会傻乎乎的拿来用,但是报500错误。又比如数据库服务器宕机了,随后又恢复过来,如果没有勾选这个参数,那么应用服务器还是认为数据库无法连接,那么你可能需要重启服务器。但是勾选它则不需要了。
四、不要轻易改动设置
因为weblogic出厂时已经把参数调到适当了,所以不需要太多的改动,还是开始的那句话,需要结合压力测试来调优