第一步:配置user登錄tomcat
參考:https://www.cnblogs.com/kevincaptain/p/10370794.html
第二步:性能優化
2.1tomcat的運行模式有3種:
bio: tomcat7.0默認的模式,性能非常低下,沒有經過任何優化處理和支持.
阻塞式I/O操作,表示Tomcat使用的是傳統Java I/O操作(即java.io包及其子包)。Tomcat7以下版本默認情況下是以bio模式運行的,由於每個請求都要創建一個線程來處理,線程開銷較大,不能處理高並發的場景,在三種模式中性能也最低。 nio: tomcat8以上默認的模式, nio(new I/O),是Java SE 1.4及后續版本提供的一種新的I/O操作方式(即Java.nio包及其子包)。java nio是一個基於緩沖區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的並發運行性能。 是Java SE 1.4及后續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。是一個基於緩沖區、並能提供非阻塞I/O操作的Java API,它擁有比傳統I/O操作(bio)更好的並發運行性能。
apr: 安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能.
就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和響應性能, 也是Tomcat運行高並發應用的首選模式。
如果是tomcat7.0可以通過server.xml修改模式
修改server.xml里的Connector節點,
vim conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改成:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
2.2執行器優化(線程池)
在tomcat中每一個用戶請求都是一個線程,所以可以使用線程池提高性能。
Executor中打開注釋:

在Connector中指定使用共享線程池:

Executor重要參數說明: name:共享線程池的名字。這是Connector為了共享線程池要引用的名字,該名字必須唯一。默認值:None; namePrefix:在JVM上,每個運行線程都可以有一個name 字符串。這一屬性為線程池中每個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的后面。默認值:tomcat-exec-; maxThreads:該線程池可以容納的最大線程數。默認值:200; maxIdleTime:在Tomcat關閉一個空閑線程之前,允許空閑線程持續的時間(以毫秒為單位)。只有當前活躍的線程數大於minSpareThread的值,才會關閉空閑線程。默認值:60000(一分鍾)。 minSpareThreads:Tomcat應該始終打開的最小不活躍線程數。默認值:25。 threadPriority:線程的等級。默認是Thread.NORM_PRIORITY Connector重要參數說明: executor:表示使用該參數值對應的線程池; minProcessors:服務器啟動時創建的處理請求的線程數; maxProcessors:最大可以創建的處理請求的線程數; acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
2.3禁用AJP連接器
JP(Apache JServer Protocol)
AJPv13協議是面向包的。WEB服務器和Servlet容器通過TCP連接來交互;為了節省SOCKET創建的昂貴代價,WEB服務器會嘗試維護一個永久TCP連接到servlet容器,並且在多個請求和響應周期過程會重用連接。

我們一般是使用Nginx+tomcat的架構,所以用不着AJP協議,所以把AJP連接器禁用。

在管理界面中看不到ajp了:

2.4啟用apr模式步聚
Requirements:
APR 1.2+ development headers (libapr1-dev package) OpenSSL 1.0.2+ development headers (libssl-dev package) JNI headers from Java compatible JDK 1.4+ GNU development environment (gcc, make)
2.4.1、安裝依賴庫
因為apr模式本質是使用JNI技術調用操作系統IO接口,需要用到相關API的頭文件
yum install -y apr-devel openssl-devel gcc make
注意:openssl庫要求在0.9.7以上版本,APR要求在1.2以上版本,用rpm -qa | grep openssl檢查本機安裝的依賴庫版本是否大於或等於apr要求的版本。
2.4.2、安裝apr動態庫
進入tomcat的bin目錄
tar -zxvf tomcat-native.tar.gz
cd tomcat-native-1.2.21-src/native
./configure && make && make install
2.4.3、配置APR本地庫到系統共享庫搜索路徑中
編輯$TOMCAT_HOME/bin/catalina.sh文件,在虛擬機啟動參數JAVA_OPTS中添加java.library.path參數,指定apr庫的路徑
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
2.4.4修改模式為apr
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="500" minSpareThreads="100" maxSpareThreads="200" acceptCount="200" maxIdleTime="30000" enableLookups="false"
SSLEnabled="false"
/>
Tomcat的並發請求處理數量=maxThreads + acceptCount
protocol:啟用APR連接模式,提高異步IO處理性能。啟用配置請參考:《開啟Tomcat APR運行模式,優化並發性能》
maxThreads:最大能接受的請求數,默認為200
minSpareThreads:最少備用線程數,默認初始化,默認為25
maxSpareThreads:最多備用線程數,一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程
acceptCount:等待處理的請求隊列,默認為100,超過隊列長度,服務器則拒絕客戶端請求,直接返回403
maxIdleTime:如果一個線程在30秒以內沒有活躍,則終止運行並從線程池中移除。除非線程池數量小於或等於minSpareThreads數量。默認值是1分鍾
enableLookups:如果為true,調用request.getRemoteHost會執行DNS反查,反向解析IP對應的域名或主機,效率較低,建議設為false。
更多參考:http://tomcat.apache.org/tomcat-8.5-doc/apr.html#Linux
JVM內存配置優化
在開發當中,當一個項目比較大時,依賴的jar包通常比較多,我們都知道,在應用服務器啟動時,會將應用引用到的所有類通過ClassLoader依次全部加載到內存當中。Java的邏輯內存模型大致分為堆內存、棧內存、靜態內存區,也稱持久區,該區的內存不會被GC回收。堆內存用於存儲類的實例、數組等引用類型數據,也就是用new生成的對象,都存放在這里,棧內存存儲局部變量(如:方法參數),靜態內存區存儲常量、靜態變量、類元數據信息(方法、屬性等)。開發當中常遇到的三類內存溢出異常:
java.lang.OutOfMemoryError: Java heap space異常
表示堆內存空間滿了,如果不是程序邏輯的bug,可能是因為項目中引用的jar比較多,導到內存溢出。JVM默認堆的最小使用內存為物理內存的1/64,最大使用內存為物理內存的1/4,如8G的物理內存,JVM默認堆的最小和最大內存分別為128m和2048m。通過調整JVM的-Xms(初始內存)和-Xmx(最大內存)兩個參數加大內存使用限制。
java.lang.OutOfMemoryError: PermGen space異常
表示靜態內存區滿了,通常是由於加載的類過多導致。jdk8以下版本通過修改JVM的-XX:PermSize和-XX:MaxPermSize兩個參數,限制靜態區最小和最大內存范圍。jdk8改變了內存模型,將類定義存放到了元數據(MetaspaceSize)空間,而元數據空間是與堆空間共享同一塊內存區域的,所以在JDK8以后版本不會存在PermGen space異常了,故不用設置此參數。
java.lang.StackOverflowError異常
表示棧內存溢出。通常是由於死循環、無限遞歸導致。
修改Tomcat的內存配置,打開$TOMCAT_HOME/bin/catalina.sh文件(Windows系統是catalina.bat文件),大楖在250行左右,在JAVA_OPTS參數上添加內存參數設置即可。完整的JVM參數設置如下所示:
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless=true"
-server參數:表示以服務模式啟動,啟動速度會稍微慢一點,但性能會高很多。不加這個參數,默認是以客戶端模式啟動。
java.awt.headless=true參數:與圖形操作有關,適用於linux系統。如生成驗證碼,含義是當前使用的是沒有安裝圖安裝圖形界面的服務器,應用中如果獲取系統顯示有關參數會拋異常,可通過jmap -heap proccess_id查看設置是否成功。
-Xmx:java heap最大值,使用的最大內存,上面兩個值是分配JVM的最小和最大內存,取決於硬件物理內存的大小,建議均設為物理內存的一半。
