Tomcat效能優化以及 jvm 引數設定
linux ps 命令的結果中 VSZ,RSS,STAT 的含義和大小
引數名 | 含義 | 單位 |
---|---|---|
USER | 程序所屬使用者 | |
PID | 程序ID | |
%CPU | 程序佔用CPU百分比 | |
%MEM | 程序佔用記憶體百分比 | |
VSZ | 虛擬記憶體佔用大小 | 單位:kb(killobytes) |
RSS | 實際記憶體佔用大小 | 單位:kb(killobytes) |
TTY | 終端型別 | |
STAT | 程序狀態 | |
START | 程序啟動時刻 | |
TIME | 程序執行時長 | |
COMMAND | 啟動程序的命令 |
檢視 utomcat 執行的 java 程式
1
|
ps aux|head -1; ps aux | grep java | grep utomcat | sort -k4nr | head -10 |
示例
1
|
[root@hjweb01 script]# ps aux|head -1; ps aux | grep java | grep utomcat | sort -k4nr | head -10
|
檢視 utomcat 執行的 java 程式,同時程式目錄帶 pre
1
|
ps aux|head -1; ps aux | grep java | grep utomcat | grep pre | sort -k4nr | head -10
|
示例
1
|
[root@hjweb01 script]# ps aux|head -1; ps aux | grep java | grep utomcat | grep pre | sort -k4nr | head -10
|
檢視更多引數
1
|
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep java | sort -nrk5
|
rsz 為實際記憶體佔用,示例如下
1
|
[root@hjweb01 script]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep java | sort -nrk5
|
只看需要了解的引數,可調整引數列表
1
|
ps -e -o 'pid,comm,rsz,rss,user' | grep java | sort -nrk5
|
示例
1
|
[root@hjweb01 script]# ps -e -o 'pid,comm,rsz,rss,user' | grep java | sort -nrk5
|
記憶體的整體使用情況
1
|
[root@hjweb01 script]# free -m
|
top 命令檢視記憶體使用情況
輸入 top 之後,再按 m 鍵
1
|
top - 16:39:15 up 7 days, 22:33, 12 users, load average: 0.02, 0.05, 0.05
|
基於 tomcat 的調優
參考tomcat 8 9 效能 優化 調優 centos 7 linux
不要單純為了調優而去調優,應該有針對性的去發現不足,解決問題,以提高效能。
所以,調優的前提是做好各種監控分析,包括伺服器基礎資源使用、各個應用執行狀況、程式碼質量、資料庫狀況、等等,根據業務的併發,伺服器資源,以及存在的問題,有針對性的去優化。
效能的提升,主要從以下幾個方面入手
- 架構調優
- 負載均衡,高可用,nginx + tomcat 動靜分離,容器化 等, 不具體闡述
- 程式碼調優
- 程式碼編寫規範。
- pmd 、findbug、sonar 等工具,檢測問題,並優化。 不具體闡述。
tomcat 連線數,執行緒數,快取,修改server.xml
開啟被註釋的預設連線池配置
預設配置:
1
|
<!--
|
修改例項:
1
|
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
|
引數講解:
1
|
name: 執行緒名稱
|
修改連線配置
1
|
<Connector port="8080" protocol="HTTP/1.1"
|
改為:
1
|
connectionTimeout="20000"
|
引數講解:
1
|
port:連線埠。
|
壓縮會增加Tomcat負擔,最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。
Tomcat
的壓縮是在客戶端請求伺服器對應資源後,從伺服器端將資原始檔壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的 瀏覽過程
HTML、CSS、Javascript和Text,它可以節省40%
左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。
管理AJP埠
AJP是為 Tomcat 與 HTTP 伺服器之間通訊而定製的協議,能提供較高的通訊速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個聯結器。 預設是開啟的。如果不使用apache,註釋該聯結器。
1
|
<!--
|
JAVA_OPTS=”-Xms2G -Xmx2G -Xmn512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly”
1
|
## 引數解釋
|
-Xms2G 初始分配的堆記憶體
-Xmx2G 最大允許分配的堆記憶體,這兩個配成一樣。
-Xmn512m 年輕代大小
-XX:MetaspaceSize=512M 初始元空間大小,達到該值就會觸發垃圾收集進行型別解除安裝,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值。
-XX:MaxMetaspaceSize=512M
-XX:+UseConcMarkSweepGC 併發標記清除(CMS)收集器
-XX:+CMSClassUnloadingEnabled
-XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP檔案。
-XX:HeapDumpPath=${目錄}引數表示生成DUMP檔案的路徑,也可以指定檔名稱,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof。如果不指定檔名,預設為:java__heapDump.hprof。
-verbose:gc 輸出GC日誌 , -XX:+PrintGC 與 -verbose:gc 是一樣的,可以認為-verbose:gc 是 -XX:+PrintGC的別名.
-XX:+PrintGCDetails 列印GC詳細資訊
-XX:+PrintGCTimeStamps 列印gc時間戳
-XX:+PrintGCDateStamps
-Xloggc:/appl/gc.log 定義gc日誌目錄
-XX:CMSInitiatingOccupancyFraction=75 是指設定CMS在對記憶體佔用率達到75%的時候開始GC(因為CMS會有浮動垃圾,所以一般都較早啟動GC);
-XX:+UseCMSInitiatingOccupancyOnly 只是用設定的回收閾值(上面指定的75%),如果不指定,JVM僅在第一次使用設定值,後續則自動調整
1
|
|
OS specific support. $var must be set to either true or false.
1
|
在該註釋後新增如下程式碼:
|
export JAVA_OPTS=’
-server
-Xms350M
-Xmx350M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true’;
1
|
|
-Xmx:java heap最大值,使用的最大記憶體
上面兩個值是分配JVM的最小和最大記憶體,取決於硬體實體記憶體的大小,建議均設為實體記憶體的一半。
-XX:PermSize:設定記憶體的永久儲存區域
-XX:MaxPermSize:設定最大記憶體的永久儲存區域
-XX:MaxNewSize:
-Xss 15120 這使得JBoss每增加一個執行緒(thread)就會立即消耗15M記憶體,而最佳值應該是128K,預設值好像是512k.
+XX:AggressiveHeap 會使得 Xms沒有意義。這個引數讓jvm忽略Xmx引數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。
-Xss:每個執行緒的Stack大小
-verbose:gc 現實垃圾收集資訊
-Xloggc:gc.log 指定垃圾收集日誌檔案
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間