應用服務器調優案例分析
某企業、公司隨着業務發展,生產環境經常會出現服務器負荷太高,CPU持續飆升現象、內存溢出,當出現這種現象如何快速定位問題並分析處理呢?
接下來將通過實例 分析說明
分析思路:
- 應用程序CPU持續飆升,一般線程堵塞未釋放、死鎖
- 請求流量某時間段高額,低性能應用程序引起
- 垃圾回收時間停頓時間過長、內存溢出等問題引起的
定位問題:
通過監控工具Zabbix查看應用的TCP連接數、線程數處於狀態分析應用目前可能出現場景,如(外部攻擊、木馬程序、劫持、注入等),同時打開應用服務器先用ps命令查看服務器目前使用率最高的應用PID
接着使用 top -Hp pid 將這個進程的線程顯示出來。輸入大寫的 P 可以將線程按照 CPU 使用比例排序,如下結果。
發現某些進程CPU高額
接着保存目前進程使用率高額的線程信息 jstack pid > thread_194283.log 將線程棧 信息存儲到日誌文件,如下結果
由於thread_194283.log 存儲是16進制格式,此時需要把當前pid 轉成相應格式,使用如下命令 printf “%x\n” pid ,結果是0x55ef,對應以上文件內容
發現其中有個業務多線程批量生成二維碼,由於批次數和線程堵塞數不一致導致線程
一直處於等待狀態,遲遲未釋放資源,修復後CPU恢復正常,如下
針對 內存頻繁開銷很大優化過程如下
使用命令把應用程序導出標準文件
jmap -dump:format=b,file=heapDump_194283 pid
使用分析工具進行分析內存如:
Eclipse Memory Analyzer / IBM HeapAnalyzer
推薦前者,在ecplise、idea 在線、離線安裝插件
收集Dump文件有兩種方式:
-
服務器內存溢出自動生成Dump文件
. 設置JVM啓動參數
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/zachary/jvm -
在線生成dump文件
jmap -dump:format=b,file=heapDump_xxx pid
分析Dump文件如下
打開Dump文件,顯示主界面,目前應用堆內存 800多M, Leak Suspects可以 查看問題詳情,如下
兩個問題,問題A、B各佔內存如上
進一步跟蹤問題,點擊Details
靜態類、字節佔用太多堆內存空間,查看樹形結構Histogram
查看線程棧視圖 dominator_tree
從上面的截圖中可以得出如下關鍵信息點:
- 頁面頻繁請求應用,導致應用過度消耗內存,優化頁面請求,緩存本地
- 應用內存分配不均,調整應用內存、JVM堆內存
總結
針對應用服務器調優,通過監控發現應用狀態,然後通過Top命令找到相應負荷大的進程,CPU過高可以通過jstack命令分析其線程狀態調優,內存過高可以通過jmap導出
,專業分析工具進行跟蹤分析,大部分情況是應用程序低效導致,不斷髮現問題進行優化,達到高效狀態,保證系統穩定運行…
作者簡介:張程 技術研究
更多文章請關注微信公衆號:zachary分解獅 (frankly0423)