天天看點

性能優化專題(什麼是性能優化)什麼是性能優化

文章目錄

  • 什麼是性能優化
    • 遇到性能問題怎麼辦
    • CPU
    • Memory
    • IO
    • Network
    • 術語介紹
      • 是問題,怎麼證明是問題
      • 梳理思路

什麼是性能優化

  性能優化就是發揮機器本來的性能。

 是以我們要做的就是讓機器性能發揮至最大。

遇到性能問題怎麼辦

不要慌,因為你一時半會也解決不了。

到底是不是問題?

觀看架構圖

從上往下定位是否存在問題

若存在問題是什麼地方存在問題,哪一行代碼?

  注意網關

機器性能觀看的幾個次元CPU MEMORY IO NETWORK。遇到性能問題,不一定隻會是jvm的問題,可能是使用這個環境機器的問題。

CPU

:首先檢查 cpu,cpu 使用率要提升而不是降低

CPU 空閑并不一定是沒事做,也有可能是鎖或者外部資源瓶頸。

檢視入口層的伺服器,所有的性能都要在cpu中處理,首先檢視CPU.

性能優化專題(什麼是性能優化)什麼是性能優化

load average:平均負載 代表1分鐘 5分鐘 15分鐘的繁忙程度

%cpu:消耗的情況

測試:

一個springboot的demo jar包

性能優化專題(什麼是性能優化)什麼是性能優化
性能優化專題(什麼是性能優化)什麼是性能優化

可以看到我們的項目啟動占用了cpu的部分資源

通路bad路徑進行增加伺服器的負載

而通路我們其他的正常資源路徑的時候仍然是沒問題的(忘記截圖)

性能優化專題(什麼是性能優化)什麼是性能優化

可見看到cpu被占滿可顯示100.0us(上圖中第三行的位置) 說明我們的cpu是單核的,也可以在其他地方可以看到。

若是多核cpu将會繼續占用其他核的cpu資源。比如:200%,300%的占用。和我們windows類似,若占用資源過高,電腦處理不及時,會有種卡的表現。但不代表不能用。

#也能檢視到cpu的資訊 編号從0開始 
cat /proc/cpuinfo

           
性能優化專題(什麼是性能優化)什麼是性能優化
或者是在top指令狀态下按1也可檢視
           
性能優化專題(什麼是性能優化)什麼是性能優化

有幾個cpu就會出現幾個cpu(number)

cpu占用過高或者是占滿,我們為什麼還是能正常通路資源?

 線程會切換(top的動态顯示标題欄中是不會占用到100%的,cpu底層的時間片機關會不斷的切換,時間片的排程是不一樣的,政策很複雜),是以是可以正常通路的。

top指令可以幫助我們檢視哪個程序的cpu占用過高

哪一行代碼造成的?

 通用方法

  • 看日志
  • jstack(更友善)

     jstack 程序pid > a.txt

    性能優化專題(什麼是性能優化)什麼是性能優化

    我這裡的是13905

    即 jstack 13905 > a.txt

    (jstack 用的是程序号,這裡沒有使用線程号,有的說切到線程模型然後定位線程,但是在使用線程模型進行stack的時候會有沒搞明白的錯誤,是以在這裡使用jstack 程序号)

    a.txt已經生成,現在就可以進行定位代碼

    jstack打的是程序的dump,是以我們要去dump中去找線程的執行過程

    現在我們要獲得我們線程号 轉換到16進制,在其a.txt中進行定位

    top指令中 shift+h轉換到線程模型

    性能優化專題(什麼是性能優化)什麼是性能優化
    轉換16進制
printf "%x \n" 13923
3663
           

在a.txt中搜尋3663

性能優化專題(什麼是性能優化)什麼是性能優化

定位到錯誤

性能優化專題(什麼是性能優化)什麼是性能優化

Memory

#一秒鐘列印一次記憶體情況
vimstat 1
           
#或者
free -g
           
性能優化專題(什麼是性能優化)什麼是性能優化

代表有3個G的記憶體空間,2個G的free,其中buffers是優化我們機器讀寫操作,是用來承接寫的一個一個塊(IO讀寫消耗大),讀用的就是cached,二者都是為了提升讀寫速度。

性能優化專題(什麼是性能優化)什麼是性能優化

當記憶體很大的時候,我們就要關注記憶體子產品了.

IO

#可以看到我們的讀速度和寫速度(df -h是看的是我們的檔案的大小)
iostat -dx 1
           
性能優化專題(什麼是性能優化)什麼是性能優化
性能優化專題(什麼是性能優化)什麼是性能優化
性能優化專題(什麼是性能優化)什麼是性能優化

通路相關路徑可以看到我們的寫速度和等待速度明顯提升,但更關鍵的是%util,12.2%相當于是1秒的12.2%的時候在做IO,通常%utils是很小的,svctm代表是功能用了多久,await是執行等待的時間,若一直讀寫的時候是會一直增長。若是定位問題的話,隻能從業務層面去定位。并不能像CPU那樣定位代碼。

Network

#linux中是沒有單純的指令去看netstat的資訊,需要外裝一工具	nicstat
nicstat
           

rKB/S: 每秒接收到千位元組數。

wKB/S: 每秒寫的千位元組數。

術語介紹

吞吐量TPS: 機關時間内完成的工作量。

平均響應時間: 送出請求和傳回該請求的響應之間使用的時間。

平均響應時間越短,系統吞吐量越大;平均響應時間越長,系統吞吐量越小;但是,系統吞吐量越大,不代表平均響應時間越小(有時吞吐量的增大,有時會把平均響應時間作為犧牲,來換取時間處理更多的請求)。

QPS:單個程序每秒請求伺服器的成功次數

是問題,怎麼證明是問題

 能複現問題。以上介紹的情況是最常見的一種情況。

梳理思路

 找到cpu高的線程号,所有的方法都執行線上程中,肯定的相應的方法有問題。jvm提供的一個指令jstack,jstack中後跟的線程/程序 相應的線程幹了什麼,我們能定位到其中,對應的是我們線程中pid的16進制,定位代碼。

本文介紹了性能優化關于CPU的介紹以及處理,其他方面的性能優化,後續更新。

繼續閱讀