某大型銀行某系統性能調優過程跟蹤記錄

一、           問題調優跟蹤

1.     事務數1/秒,調整後4 /秒(對單測一支交易)

2013/1/3,啓動壓力測試後,事務約:1個左右每秒,經修改調整weblogic啓動 JVM 參數 JAVA_OPTIONS,事務數據能達到4個左右;調整項如下:

 

1.調整weblogic啓動 JVM 參數,在 JAVA_OPTIONS中增加: -Dweblogic.threadpool.MinPoolSize=200-Dweblogic.threadpool.MaxPoolSize=500

2.修改weblogic jdbc:domain->服務->數據源->loan->連接池->(初始容量:100, 最大容量:200, 最小容量:100)

 

2.     事務平均數爲4.78/秒,調整後15 /秒(對單測一支交易)

2013/2/4, 1.VU用戶併發能到達5個,事務平均數爲4.78左右,增加再多VU,事務數不會增加,跟蹤jrockit飛行記錄,發現有爭用現象,

javacommon.struts2.interceptor.SharedRenderVariableInterceptor 經排查是strus中有同步記錄事務數,導致線程等待。經調整後,能提升到每秒15個事務左右;修改項如下:

 

1)修改easyloan.war\WEB-INF\classes\struts.xml:把如下內容註釋掉:
<!--
        <interceptors>
            <interceptorname="sharedRenderVariableInterceptor"
                        class="javacommon.struts2.interceptor.SharedRenderVariableInterceptor"/>
            <interceptor-stackname="customDefaultCrudStack">
                <interceptor-refname="paramsPrepareParamsStack"/>
                <interceptor-refname="sharedRenderVariableInterceptor"/>
            </interceptor-stack>
       </interceptors>
        <default-interceptor-refname="customDefaultCrudStack"/>
--!>
2) 把 easyloan.war\WEB-INF\classes\struts.xml修改:
<constant name="struts.devMode" value="false"/>    <!-- 開發模式設置爲false--!>
3) 修改 easyloan.war\WEB-INF\classes\spring\applicationContext-service.xml如下:
default-autowire="byName" default-lazy-init="false"  <!-- 惰性加載,調整參數爲false --!>
4).向 easyloan.war\WEB-INF\classes\configuration.xml 文件的 <configuration>中增加如下:
  <settings>
   <settingname="lazyLoadingEnabled" value="false"/>
   <settingname="aggressiveLazyLoading" value="fasle"/>
   <settingname="defaultExecutorType" value="REUSE"/>
  </settings>

 

 

3.     事務數40/秒,調整後600/秒(對單測一支交易)

 

2013/2/18, 前端LR顯示只能達到併發用戶約10個,tps到達40左右;服務器端經觀察發現GC無法回收,並且後續tps下降到約5個左右;

Weblogic32位,JDK64位,經調整爲weblogic32位和 weblogic 自帶的32位JDK,內存爲2G,性能提升約100倍(TPS:600,響應時間:0.37秒)

4.     事務數40/秒,調整後930/秒(對單測一支交易)

 

2013/2/20, 從開始執行性能測試以來,LR前端顯示 tps最高到達40左右(除換成32位JDK), TPS無再增漲。

今天拷貝jrockit3364bit,和jrockit22 64bit,其中安裝使用jrockit-jdk1.6.0_22-R28.1.1-4.0.1,性能明顯提升,TPS最高到達930;

5.     事務數900/TPS,網絡資源滿(100M網絡)(混合交易)

在測試過程中,由於網頁存在圖片文件傳輸,當有圖片加載的頁面過多,網絡資源就佔滿。

解決方法:

1.      改變網絡貸款爲1000M網絡

2.      對每個頁面的圖片能壓縮就壓縮;

3.      把很多頁面加載原素放到首頁加載,後續就不再加載資源;

6.     長時間壓力測試後,服務主機報錯:“cannot set user id: 資源暫時不可用,系統資源分配不夠”(混合交易)

解決方法:

修所有應用主機參數,即解決問題,之後再無此現象:

[loanapp@gdap1 ~]$ cat/etc/security/limits.conf |grep loanapp

#loanapp soft nproc 2047

loanapp soft nproc 10240

loanapp hard nproc 16384

loanapp soft nofile 65535

loanapp hard nofile 65536

7.     集羣環境中隨着壓力測試時間增長,主機資源利用率逐漸下降,調整後問題解決(混合交易)

2013/3/5,目前運行情況分析,併發 1200,每個 weblogic server 大約爲 100 個併發。針對此情況,建議進行如下調整,然後進行對比測試。

-Xms4096m -Xmx4096m -Xns1024m 

-Xgc:throughput

-XXgcthreads:32

-XX:+HeapDumpOnCtrlBreak-XX:+HeapDumpOnOutOfMemoryError 

-Dweblogic.threadpool.MinPoolSize=100

 

相關參數解釋,具體請參考 Jrockit參考手冊:

針對內存消耗較大應用,增加Xns指定 Jrockit的Nursery區域,可以使存活時間短的

java對象回收完全。

針對於線程數較大情況,默認GC回收線程爲 CPU核數(64) ,建議調小GC線程爲32進行測試,這樣可以降低進程的總線程數,降低線程數過大時的線程切換消耗。

在setDomainEnv.sh/中增加如下啓動參數:

JAVA_OPTIONS="${JAVA_OPTIONS}-Xgc:throughput -XX:+HeapDumpOnCtrlBreak -XX:+HeapDumpOnOutOfMemoryError-XXgcthreads:32"

JAVA_OPTIONS="${JAVA_OPTIONS} -Dweblogic.threadpool.MinPoolSize=100"

 

8.     集羣環境存在隊列等待,集羣管理通信出現隊列stuck情況,經打補丁包後解決;(混合交易)

2013/3/5日Weblogic控制檯的隊列長度存在排隊,數值只增加不會減少,無業務時,隊列數值也不會減少。

分析發現這些排隊請求不影響正常的業務請求,存在排隊時,Weblogic控制檯的“暫掛用戶請求計數”數值一直爲 0,表明正常業務請求都能正常處理。

檢查Weblogic官方公佈的補丁情況,發現此問題爲Weblogic10.3.6的一個bug,這些排隊請求爲Weblogic內部的RMI請求,此BUG 信息如下:

Bug 15839280 : [WLS10.3.6] QUEUE LENGTH COUNT INCREASES OVER TIMEAND NEVER REDUCES

 

修復補丁爲:Patch: 15839280

將Weblogic產品打上此補丁,壓測觀察,隊列能夠正常收回。

解決方法:

1.      Weblogic1036-Patches

2.      不使用weblogic集羣模式,採用單域單sever模式,並在同一臺物理機是部署多個;以充分利用服務器資源;

9.     演練環境出現coredump現象--外圍引發

2013/3/11,今天約200人同時在線做操作演練環境出現coredump,應用主機出現線程掛起狀態。

分析:

經跟蹤,是我們在調用外圍系統時,如果外圍(出現異常或通信故障)長時間不返回,我們的應用就一直等待,當大量併發調用外圍,會導致大量線程掛起,導致長時間GC無法回收,隨後出現coredump;

解決方案:

1.      臨時先屏蔽外圍,此現象就不再出現;

2.      調整接口模塊超時時間設置爲15分鐘,應用線程退出;

 

10.             演練環境出現GC無法回收資源現象--普元BPS服務器引發

2013/3/12,今天約400人同時在線做操作,在壓力測試時(2013/3/9),BPS服務器已經存在瓶頸,當業務員登陸系統後,查待辦;當併發量大時,會導致數據庫資源過高,長時間不返回待辦事項,最終導致GC長時間無法回收資源;而在演練時2013/3/12晚上,當大量人員查待辦時,此現象又出現,而且頁面長時時間無返回,業務人員上報也上報此問題。

分析:

經跟蹤BPS應用和數據庫發現一查待辦的慢SQL,關鍵字段未加索引,且SQL寫法需調整;

         解決方案:

1.  增加關鍵字段索引

2.  優化SQL寫法,提高查詢效率;

效果:

         根據stuck線程跟蹤,沒有再發現此問題。

11.              演練環境出現coredump現象之XA事務引發

2013/3/13,今天約12000人左右同時在線做操作演練環境出現coredump,應用主機出現線程掛起狀態。

         分析:

由於在我們的應用採用分庫方式,分爲貸前和貸後庫,爲了保證寫事務一致性,採用了XA事務方法。而我們在寫的過程中,把讀數據庫也啓用了XA事務,最後引大大量事務未提交,佔用大量JVM資源,最後出現coredump。

解決方案:

更改所有代碼,去掉所有讀數據庫的事務,對於單資源庫的,如果不需要事務則也去掉事務;

效果:

接下來幾點再未出現coredump現象;

 

二、           Last 總結

(一)         架構

1.        Weblogic最好不要採用集羣方式,而採用單域單sever模式,並在同一臺物理機是部署多個,以充分利用服務器資源;。

a)        雖然集羣可以減少部署工作量,降低參數修配置的工作量,方便統計計數等優點。

b)        缺點集羣存在集羣中節點同步信息的問題,如果集羣節點多,主機管理各節點資源還會消耗一部份資源。根據以上經驗,有可能會出現;

2.        Weblogic的下,如果在業務邏輯性上,爲了要保證增、刪、改的事務一致性,啓用了XA事務,那麼一定記得不要不是所有的事務都需要用到XA事務,不使用XA事務:

a)        查詢不需要使用XA事務

b)        如果某些數據只存在於一個數據源中,同樣也不需要使用XA事務

注:XA事務是等待所有的事務成功後再算成功,否則回退,那麼就要保證過程的持續狀態,資源就得不到釋放,JVM內存中事務多了,協調各事務資源也就多了,從而引發粘滯線程,最終導致處理能力大幅度下降,最嚴重情況是導致JVMdown機,如第一章節的11個問題就是最好的例證;

3.        架構下的各組件的基本配置參數需要進行調整,那麼就需要對各組件非常瞭解熟悉才能調整,如struts spring 等組件配置參數要知道詳細配置組合,需求仔細研究各組件特性。

(二)         操作系統

操作系統與JDK的比配關係要經過不斷測試才能找出最優的配合;

操作系統相應參數是否按管方進行了調整,但最好能懂得部份內核機制,如調整TCPbuffer大小,內存頁大小等;

(三)         網絡

網絡貸款資源要注意監控,TPS上不去看是否存在帶寬資源問題;

(四)         應用

注意應用程序內部算法是否存在某種同步機制等算法,一般在保證同步的情況下,併發性能都不是太好;

(五)         數據庫

程序中是否存在Block現象,如事務同步算法等,此會導致在併發時出現隊列等待現象,最終TPS上不去;

數據的存儲IO,分庫,SQL索引等優化方法,這需要單獨的優化知識,必要時,找專業DBA配合;最好自己也學習一下Oracle 的體系結構,才知道大致出現在什麼地方的問題;

(六)         其它

性能測試時,挑選的常用且較爲複雜的交易進行性能測試,但無法cover所有的交易,那麼可能存在這種現象:

1.  某個業務上,用得少,性能測試時沒有挑選,但由於SQL寫得有問題,長時間操作(讀寫)數據庫,導致資源無法釋放,就有可能導致JVM dump掉;

2.  某一程序,同樣性能測試沒有做,JAVA程序在處理業務邏輯時是正確的,但申請的對象總是沒有釋放,長時間下去,多人多次長時間操作涉及此程序模塊,大量對象沒有釋放,JVM程度佔滿,最終出現coredump。

所以對於整個應用系統來說,不能完全相信性能測試結束了,調優也就結束了。根據許多項目印證,並非如此。後續還需要定期進行應用巡檢,包括操作系統運行記錄、應用運行記錄、中間件運行記錄、數據庫運行記錄,用以發現邊角處那些致命的小問題。

三、           結束語

此文章並非講每個細節如何調整,而只是個人習慣作個筆記而已。不喜勿噴,調優是個很大的工程,如JVM啓動參數應該使用哪些特性、操作系統應該調整哪些系統參數、架構中組件的特性應該怎麼調、數據庫應該怎麼調優,這些話題都太大,每個都要理解基本原理才能能給出調優意見;如我在沒有考Oracle OCP 之前,以爲Oracle調幾個參數就叫優化了,現在理解完全不一樣,磁盤特性、操作系統特性、Oracle相關特徵,如它的日誌、頁、Buffer、SQL語法寫法、索引如何建立,是否會產生分裂,這些都會影響到性能。而這些知識在網上都可以找到相應的文章,或是官方文檔有詳細說明。在某種架構下,哪些特性組合在一起纔是最優的,需要不斷的積累和前輩們的經驗,多看看技術原理的書籍或是官方文檔,才真正有利於調優;

 

四、           附

1.     jconsole 監控stuck 線程

保證Linux 服務器裝有X window。

安裝 MobaXterm PersonalEdition 軟件。

1)  新建 session

2)  進入session 並執行相關命令

執行命令如下:

[root@localhost ~]# export DISPLAY=192.168.33.1:0.0

[root@localhost ~]# jconsole

 

 

2.     weblogic 監控stuck 線程

由於時間原因,當時記錄的粘滯線程截圖沒有了,下次有機會我再補充上;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章