應用服務器調優案例分析

應用服務器調優案例分析


某企業、公司隨着業務發展,生產環境經常會出現服務器負荷太高,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文件有兩種方式:

  1. 服務器內存溢出自動生成Dump文件
    . 設置JVM啓動參數
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/zachary/jvm

  2. 在線生成dump文件
    jmap -dump:format=b,file=heapDump_xxx pid

分析Dump文件如下
主界面

打開Dump文件,顯示主界面,目前應用堆內存 800多M, Leak Suspects可以 查看問題詳情,如下
問題詳情
兩個問題,問題A、B各佔內存如上
問題詳情
進一步跟蹤問題,點擊Details

問題1

靜態類、字節佔用太多堆內存空間,查看樹形結構Histogram

樹形結構1

查看線程棧視圖 dominator_tree

線程棧
從上面的截圖中可以得出如下關鍵信息點:

  • 頁面頻繁請求應用,導致應用過度消耗內存,優化頁面請求,緩存本地
  • 應用內存分配不均,調整應用內存、JVM堆內存

總結

針對應用服務器調優,通過監控發現應用狀態,然後通過Top命令找到相應負荷大的進程,CPU過高可以通過jstack命令分析其線程狀態調優,內存過高可以通過jmap導出
,專業分析工具進行跟蹤分析,大部分情況是應用程序低效導致,不斷髮現問題進行優化,達到高效狀態,保證系統穩定運行…

作者簡介:張程 技術研究

更多文章請關注微信公衆號:zachary分解獅 (frankly0423)

公衆號

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