2006 年 11 月 30 日
在系統的性能測試過程中,當系統的處理能力有某種變化趨勢時, 除了關于等待隊列、執行線程,EJB 池以及數據庫連接池和 Statement Cache 方面的調優外,還要考慮到 java 垃圾收集器(Garbage Collection,本文簡稱 GC)對系統性能的影響。本文介紹了如何分析系統的處理能力和 GC 之間的關系,以及如何通過改進 JVM 的配置來優化 GC,以提高系統的性能。
項目背景
某個大型項目的 CPU100% 的壓力性能測試, 用以檢查在系統運行環境不正常的情況下,系統可以運行到何種程度。測試過程是: 請求測試的模擬器向系統不斷發出大量請求, 系統接受由模擬器發出的請求,然后將請求置于一個任務池中,假如當前有空閑的線程,則該線程會從任務池中取出一個任務進行處理,假如沒有空閑的線程,則該任務一直會待在任務池中,直到有空閑的線程來處理它。因此,任務池的隊列的長度從某種意義上可以代表整個系統的處理能力,任務池隊列的長度用 Q 值來表示,假如 Q 值超出了一定限額,將會有流量控制的線程將超出限額的待處理任務丟棄,以保證系統的穩定性。
整個測試要求得到系統所在服務器的負載達到將近 100% 時,系統的吞吐量,相應時間以及在超負荷下業務請求成功率。
問題現象描述
在測試過程中,任務池中累積的任務數起伏很大,正常時累積的任務數很小,但是每隔一段時間會累積大量的任務。由于累積的任務數超出任務池流量控制所定義的限額,所以每隔一段時間,大量的待處理任務被清除。因此測試結束后得到的在超負荷下業務請求成功率也不是很理想。
應用服務器的物理部署
一臺AIX服務器(4CPU,4GMemory)來部署本Web應用程序;Web應用程序部署在中間件應用服務器上;部署了一個節點(Node),只配置一個應用服務器實例(Instance),沒有做Cluster部署。
分析
檢測WebSphere application Server上的Web Container,EJB Container , ORB Service,數據庫連接池等設置均合理,然后懷疑問題的現象是不是與系統GC有關。當前Java Virtual Machine的配置為: Initial Heap Size:256 , Maximum Heap Size: 3072。
為了驗證任務池中累積的任務數的大幅度變化和系統GC是否存在一定的關系,通過對任務池的累積任務數和系統GC進行采樣, 將采樣后的數據進行分析,用以得出二者的關系。采樣時遵循Nyquist采樣定例: 采樣頻率要大于被采集對象的頻率的2倍。 否則,采樣點很可能每次位于被采集對象的波形的某個點上,從而不能正確反映被采集對象的變化規律。
采樣
通過觀察,發現任務池的任務數目(以下用Q值代替)的變化周期大概是5到6秒,因此根據Nyquist采樣定例,采樣的時間間隔不能超過2-3秒,所以按照每秒來采樣。 測試時間是3分鐘,采樣180次,系統的當前負載率是99%。采樣圖如下所示:
圖一 任務池Q值的采樣圖
由于系流量控制要求的限額是450個任務,也就是任務池中最多能累積450個任務,當任務池中累積的任務數超過450時,多余的任務會被流量控制直接丟棄,從上圖可以看出,系統的Q值在很多時刻都大于450,因此多次被丟棄任務,從而導致了任務請求成功率不高。
系統GC的采樣
1: 在WebSphere Administrative Console上, 點擊進入:Servers, 然后Application servers > server1 > PRocess Definition > Java Virtual Machine, 在Configuration面板上,選上Verbose garbage collection選項。
圖二 WebSphere Application Server的JVM配置示圖
2:進入<%WebSphere Application Server的安裝目錄%>/profiles/<%所在的profiles%>/logs/ <%所在的Server%>, 可以看到native_stderr.log文件,將其清空
3:在高負載的條件下,進行高壓測試3分鐘
4:將native_stderr.log文件拷貝出來,用GCCollector工具進行分析,其中native_stderr.log文件上記錄了系統GC的數據。
5:安裝GCCollector工具: 下載完GCCollector.zip后,解壓縮,將里面Lib里的3個文件 jfreechart-1.0.0-rc1.jar,jcommon-1.0.0-rc1.jar 和GCCollector.jar拷貝至JRE的lib目錄下,然后在命令行控制臺上進入JRE的安裝目錄,而后運行: java -classpath jfreechart-1.0.0-rc1.jar;jcommon-1.0.0-rc1.jar -jar GCCollector.jar。
新聞熱點
疑難解答