故障現象:
測試一段時間后應用無響應,連接池不能放大,jvm crash,日志報對象分配失敗
問題診斷:
第一個階段是websphere問題
到現場之后,回放腳本測試幾分鐘,應用開始無法響應,后臺也沒有異常,update jdk之后,系統能正常響應了,但是發現新的問題,db2連接池始終無法放大,最大只能到30,而且系統也會拋OOM,導致系統異常推出,從系統日志看,是因為應用中的大對象分配導致的(2M大小)
期間,關于連接池無法放大問題想了很多辦法,包括修改db2 maxappls,maxagents這些參數,更新數據庫驅動,而且確定不是db2的問題(在創建30之后,我們依然可以通過其他方式連接到db2,說明db2的連接限制確實放大了),當然我們productdatasource這個池子大小我已經放大到100了。
中間還發現測試腳本沒有正常啟動流程,排查后發現是loadrunner的問題,用我機器上的lr錄制正常(錯誤代碼提示是字段長度限制,莫名其妙)。
關于jvm crach我們也調整了heap設置:-xms256m,-xmx1536m
但是問題依然存在。后面我們重新安裝了應用,所有的設置采用缺省配置,沒有打任何補丁,系統這個時候竟然可以正常跑了,只是響應很慢,而且時間曲線一直往上拋(測試一段時間系統無響應)
查了一下配置,發現productdatasource的缺省設置竟然就是30,這個時候基本判斷是之前的websphere的設置修改沒有生效
重新修改jvm和連接池配置,這時候系統正常,數據連接也達到83個,然后開始測試大并發量
階段二就是調整數據庫配置
1、第一個是db2 default buffer pool,缺省配置buffer才4m,這個一定要注意修改
2、第二個是db2的lock數量,在缺省基礎上好像放大了100倍
3、sort heap,排序區(防止排序溢出)
這些調整都要通過db2的狀態來調整,可以通過get snapshot指令來獲得數據庫狀態,buffer不夠會出現大量的邏輯讀,lock不夠會拋lock溢出(會導致鎖升級),sort heap不夠會提示排序溢出(這時候排序會在硬盤做)
回頭看看這次支持:
1、websphere配置修改不生效,我后面仔細想了想,這個websphere很多公司用可能大家都亂改了一通,另一問題是我們的使用習慣,websphere強烈不建議用kill直接殺進程方式停服務器,websphere不但是一個java進程,還有很多的附屬進程,直接kill也很容易導致websphere不正常
2、jvm crach問題,這個我建議大家看看這篇文檔http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=fragmentation
&uid=swg21176363&loc=en_US&cs=utf-8&lang=en
如何去定位jvm問題,首先看nativerr.log日志,如果出現OOM,這里會有記錄,當發現OOM的時候,可以打開jvm的verbosegc,分析verbosegc和jvm dump file,上面文檔里提到一個很重要的東西就是pinned對象,這也是ibm為啥不建議設置ms=mx的原因。