性能瓶颈分析整体思路
一、web應用的性能分析
1、首先,確定整體瓶頸在哪
依據請求的流程,可大致分為 前端 -> 網絡?-> 后端 三段。其中前端性能這里不做討論,網絡的話,測試性能的時候最好保持網絡干擾最小。
2、其次,確定后端瓶頸在哪
后端處理一條請求時,大概會經過 應用程序 -> 中間件 -> 應用程序 -> 數據庫?4段,其中中間件可能有也有可能沒有。
3、最后,逐步分析每個地方的瓶頸
分析應用程序、中間件、數據庫瓶頸時,重要原則就是:CPU -> 內存 -> 網絡 -> 磁盤(性能最慢的設備會是瓶頸點)
1)應用程序瓶頸:
- CPU:應用程序運行在內存中,性能開銷一般是CPU閑置導致,所以增加多線程提高CPU利用率是最快的提升性能的方法。
- 內存:減少鏈表等需要內存尋址的操作
- 網絡:避免在for循環中建立網絡連接,以及等待磁盤IO
- 磁盤:避免在for循環中等待磁盤IO
2)中間件瓶頸:
? ? ? 中間件大多為第三方產品,提高硬件設備性能是唯一的辦法:建立集群(增加機器數量)、使用多核CPU、增加內存、使用千兆網卡和網線、使用固態硬盤等
3)數據庫瓶頸:
- 磁盤:數據庫的數據存在磁盤中,與磁盤進行IO交互是消耗性能最多的地方,減少磁盤訪問可以最顯著的提升效率(建立索引,優化sql,避免全盤掃描)
- 網絡:如果數據庫是獨立部署的,網絡傳輸是第二大消耗性能的地方,批量傳輸數據減少網絡交互,分頁技術減少返回數據都可以優化該處性能
二、Linux服務器性能分析—CPU
1、首先要確定CPU基礎信息
使用lscpu命令查看 CPU配置信息。在 Linux 下,類似 lsxxx 這樣的命令都是用來查看基本信息的,如 ls 查看當前目錄文件信息,lscpu 就用來查看 CPU 信息,類似還有 lspci 查看 PCI 信息。
- Architecture: #架構?
- CPU(s): #邏輯cpu顆數?
- Thread(s) per core: #每個核心的線程數量?
- Core(s) per socket: #每顆物理CPU的核數
- CPU socket(s): #物理CPU個數?
- Vendor ID: #cpu廠商ID?
- CPU family: #cpu系列?
- Model: #型號?
- Stepping: #步進?
- CPU MHz: #cpu主頻?
- Virtualization: #cpu支持的虛擬化技術?
- L1d cache: #一級緩存(google了下,這具體表示表示cpu的L1數據緩存)?
- L1i cache: #一級緩存(具體為L1指令緩存)?
- L2 cache: #二級緩存
2、計算cpu核數
- CPU總核數 =物理CPU個數 * 每顆物理CPU的核數 =2*4=8
- 總邏輯CPU數=物理CPU個數 * 每顆物理CPU的核數 * 超線程數* 復用比=2*4*2=16
一個核心就是一個物理線程,英特爾有個超線程技術可以把一個物理線程模擬出兩個線程來用,充分發揮CPU性能。
3、CPU 使用情況分析
使用top命令查看cpu的使用情況
重點關注這么幾個字段:
1)load average:三個數字分別表示最近 1 分鐘,5 分鐘和 15 分鐘的負載,數值越大負載越重。一般要求不超過核數,比如對于單核情況要 < 1。如果機器長期處于高于核數的情況,說明機器 CPU 消耗嚴重了。
2)%Cpu(s):表示當前 CPU 的使用情況,如果要查看所有核(邏輯核)的使用情況,可以按下數字 “1” 查看。這里有幾個參數,表示如下:
- - us 用戶空間占用 CPU 時間比例
- - sy 系統占用 CPU 時間比例
- - ni 用戶空間改變過優先級的進程占用 CPU 時間比例
- - id CPU 空閑時間比
- - wa IO等待時間比(IO等待高時,可能是磁盤性能有問題了)
- - hi 硬件中斷
- - si 軟件中斷
- - st steal time
3)每個進程的使用情況
這里可以羅列每個進程的使用情況,包括內存和 CPU 的,如果要看某個具體的進程,可以使用 top -p pid 查看。
三、Linux服務器性能分析—內存
1、使用free命令查看內存使用情況
這里存在一個計算公式,?還有個?shared?字段,這個是多進程的共享內存空間,不常用
MemTotal = used + free + buff/cache(單位 K)我們注意到 free 很小,buff/cache 卻很大,這是 Linux 的內存設計決定的,Linux 的想法是內存閑著反正也是閑著,不如拿出來做系統緩存和緩沖區,提高數據讀寫的速率。但是當系統內存不足時,buff/cache 會讓出部分來,非常靈活的操作。
2、內存使用情況分析
使用top 命令查看內存使用情況。運行時默認是按照 CPU 利用率進行排序的,如果要按照內存排序,該怎么操作呢?兩種方法,一種直接按 “M”(相應的按 “P” 是 CPU),另外一種是在鍵入 top 之后,按下 “F”,然后選擇要排序的字段,再按下 “s” 確認即可。
可以看到,我按照 “%MEM” 排序的結果。這個結果對于查看系統占用內存較多的哪些進程是比較有用的。
然后這里我們會重點關注幾個地方,上面橫排區,和前面幾個命令一樣可以查看系統內存信息,中間標注的橫條部分,和內存相關的有三個字段:VIRT、RES、SHR。
- VIRT:virtual memory usage,進程占用的虛擬內存大小。
- RES:resident memory usage,進程常駐內存大小,也就是實際內存占用情況,一般我們看進程占用了多少內存,就是看的這個值。
- SHR:shared memory,共享內存大小,不常用。
參考文章:
一文掌握 Linux 性能分析之內存篇
如何查看Linux的內存使用狀況
總結
以上是生活随笔為你收集整理的性能瓶颈分析整体思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux性能分析—CPU篇
- 下一篇: RabbitMQ—流量控制之内存阈值