Tomcat 调优过程

(一)Tomcat內存溢出的三種情況及解决辦法分析:http://rritw.com/a/fuwuqiruanjian/Tomcat/20110524/86244.html

 

 

1.OutOfMemoryError: Java heap space

2.OutOfMemoryError: PermGen space

3.OutOfMemoryError: unable to create new native thread.

 

(1)JVM中如果98%的時間是用於GC且可用的 Heap size 不足2%的時候將拋出此異常信息。

        解决方法:調整-Xms -Xmx参數可以解决。

        set JAVA_OPTS= -Xms1024m -Xmx1024m 

(2)如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。

        解决办法:這一個一般是加大-XX:PermSize? -XX:MaxPermSize 來解决問題。

        set JAVA_OPTS= -Xms1024m -Xmx1024m? -XX:PermSize=128M -XX:PermSize=256M

(3)主要是和jvm與系統內存的比例有關。這種怪事是因为JVM已經被系統分配了大量的內存(比如1.5G),並且它至少要占用可用內存的一半。有人發現,在線程個數很多的情況下,你分配给JVM的內存越多,那麼,上述錯誤發生的可能性就越大。

        原因分析:

 

每一個32位的進程最多可以使用2G的可用內存,因为另外2G被操作系統保留。這裏假設使用1.5G给JVM,那麼還餘下500M可用內存。這500M內存中的一部分必須用於系統dll的加載,那麼真正剩下的也許只有400M,現在關鍵的地方出現了:當你使用Java創建一個線程,在JVM的內存裏也會創建一個Thread對象,但是同時也會在操作系統裏創建一個真正的物理線程(参考JVM規範),操作系統會在餘下的400兆內存裏創建這個物理線程,而不是在JVM的1500M的內存堆裏創建。在jdk1.4裏頭,默認的棧大小是256KB,但是在jdk1.5裏頭,默認的棧大小为1M每線程,因此,在餘下400M的可用內存裏邊我們最多也只能創建400個可用線程。

. 這样結論就出來了,要想創建更多的線程,你必須減少分配给JVM的最大內存。還有一種做法是讓JVM宿主在你的JNI代碼裏邊。

给出一個有關能夠創建線程的最大個數的估算公式:

. (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

例:對於jdk1.5而言,假設操作系統保留120M內存:

1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads

1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

 

        解决办法:最大线程与预留 OS 内存须保持强关系比。共 10G,jvm5G,最大线程 1024。

 

(二)tomcat的maxThreads、acceptCount(最大线程数、最大排队数)

 

 

maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200

acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

(1)

 

第一种极端情况,如果我们的操作是纯粹的计算,那么系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该尽量设的小,降低同一时间内争抢cpu的线程个数,可以提高计算效率,提高系统的整体处理能力。

第二种极端情况,如果我们的操作纯粹是IO或者数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设的大,这样才能提高同时处理请求的个数,从而提高系统整体的处理能力。此情况下因为tomcat同时处理的请求量会比较大,所以需要关注一下tomcat的虚拟机内存设置和linux的open file限制。

(2)

我在测试时遇到一个问题,maxThreads我设置的比较大比如3000,当服务的线程数大到一定程度时,一般是2000出头,单次请求的响应时间就会急剧的增加,cpu把大多数时间都用来在这2000多个线程直接切换上了,当然cpu就没有时间来处理我们的程序了。

(3)acceptCount的配置,我一般是设置的跟maxThreads一样大,这个值应该是主要根据应用的访问峰值与平均值来权衡配置的。


(三)关于Nginx的一些优化(突破十万并发)http://www.howtocn.org/nginx:%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84nginx_fastcgi%E6%9C%8D%E5%8A%A1%E5%99%A8

 

(四)Linux下高并发socket最大连接数所受的各种限制

http://blog.csdn.net/guowake/article/details/6615728

第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:

net.ipv4.ip_local_port_range = 1024 65000

第二步,执行sysctl命令:

[speng@as4 ~]$ sysctl -p

 

(五)高并发应用中客户端等待、响应时间的推算,及RT/QPS概念辨析

原文:http://www.cnblogs.com/chenjianjx/archive/2012/09/12/2681658.html

RT:响应时间

QPS:

你可能感兴趣的:(tomcat)