天天看點

性能調優工具總結

作者:AIGC情報
  1. CPU

1.1 load average含義:過去1分鐘,5分鐘,15分鐘的平均負載;平均負載的含義:指機關時間内,系統處于可運作狀态和不可中斷狀态的平均程序數,也就是平均活躍程序數,它和 CPU 使用率并沒有直接關系。

1.2 CPU使用率:按照時鐘來計算的,是以cpu使用率是1-空閑時間/總的時鐘時間

1.3 Load Average和CPU使用率關系:

對于CPU密集型任務:Load Average和CPU使用率都會高

對于IO密集型任務:Load Average會高,但是CPU使用率不一定高

1.4 top顯示的CPU名額含義:

a. us: 使用者态的CPU時間

b. ni: 低優先級使用者态CPU時間

c. sy: 核心态CPU時間

d. id: 空閑時間

e. wa: 等待IO的CPU時間

f. hi: 處理應中斷的CPU時間

g. si: 處理軟中斷的CPU時間

1.5 CPU使用率過高處理方法:

a. 使用top或者pidstat指令找到使用CPU最多的程序

b.使用perf top檢視占用CPU最多的函數或者指令,加上-g參數可以看到函數的調用棧

c.對于一些退出較快的程序,top指令不容易找到占用CPU較多的程序,使用:perf record -g 和 perf report可以分析出曆史事件

d.如果是IOWait較高,可以通過pidstat -d 1 20檢視每個程序的IO情況:

# 間隔 1 秒輸出多組資料 (這裡是 20 組)
$ pidstat -d 1 20
...
06:48:46 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:47 0 4615 0.00 0.00 0.00 1 kworker/u4:1
06:48:47 0 6080 32768.00 0.00 0.00 170 app
06:48:47 0 6081 32768.00 0.00 0.00 184 app
06:48:47 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:48 0 6080 0.00 0.00 0.00 110 app
06:48:48 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:49 0 6081 0.00 0.00 0.00 191 app
06:48:49 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:50 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:51 0 6082 32768.00 0.00 0.00 0 app
06:48:51 0 6083 32768.00 0.00 0.00 0 app
06:48:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command

           

e. 如果确定了某個程序造成了CPU使用率過高,可以使用strace -p檢視這個線程的調用棧,進而知道哪個函數占用CPU最高 ?程序?線程?

1.6 大量僵屍程序處理方法:

a. 僵屍程序是有父程序沒有回收子程序導緻的

b.使用pstree -aps pid找到程序的父子關系,進而找到父程序,進行分析

1.7 對于Java程式,可以使用perf工具,檢視火焰圖,進而判斷出哪個函數最消耗CPU

2. 記憶體

2.1 free指令各項名額含義:

$ free 
total used free shared buff/cache available
Mem: 8169348 263524 6875352 668 1030472 7611064
Swap: 0 0 0           

a. total: 總記憶體

b. used: 已經使用的記憶體,包括了共享記憶體

c. buff/cache: 緩存和緩沖區的大小 buffer? cache分别指的是啥?

d. available:新程序可使用記憶體大小

2.2 top指令各項名額含義:

$ top
...
KiB Mem : 8169348 total, 6871440 free, 267096 used, 1030812 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7607492 avail Mem 
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
430 root 19 -1 122360 35588 23748 S 0.0 0.4 0:32.17 systemd-journal 
1075 root 20 0 771860 22744 11368 S 0.0 0.3 0:38.89 snapd 
1048 root 20 0 170904 17292 9488 S 0.0 0.2 0:00.24 networkd-dispat 
1 root 20 0 78020 9156 6644 S 0.0 0.1 0:22.92 systemd
12376 azure 20 0 76632 7456 6420 S 0.0 0.1 0:00.01 systemd
12374 root 20 0 107984 7312 6304 S 0.0 0.1 0:00.00 sshd           

a. VIRT 是程序虛拟記憶體的大小,隻要是程序申請過的記憶體,即便還沒有真正配置設定實體記憶體,也會計算在内。

b. RES 是常駐記憶體的大小,也就是程序實際使用的實體記憶體大小,但不包括 Swap 和共享記憶體。

c. SHR 是共享記憶體的大小,比如與其他程序共同使用的共享記憶體、加載的動态連結庫以及程式的代碼段等。

d.%MEM 是程序使用實體記憶體占系統總記憶體的百分比。

2.3 記憶體洩露定位和處理

a. 通過pidstat- d可以找出哪個程序造成記憶體的上升

b. 通過memleak -p可以找出程序配置設定記憶體的調用棧

3. IO

3.1 iostat指令各項名額,顯示每塊磁盤的性能資料

$ iostat -d -x 1 
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util 
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00           
性能調優工具總結

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

3.2 pidstat各項名額含義

$ pidstat -d 1 
13:39:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 
13:39:52 102 916 0.00 4.00 0.00 0 rsyslogd           

uid:使用者id

pid: 線程id

kB_rd/s: 每秒讀資料大小

kB_wr/s:每秒寫資料大小

kB_ccwr/s:每秒取消的寫請求資料大小

iodelay:塊IO大小

3.3 找出造成磁盤IO瓶頸的原因

a. 通過top指令觀察iowait的情況

b. 通過iostat指令找到出現瓶頸的磁盤

c. 通過pidstat指令找到讀寫請求,ioutil很高的程序

d. strace -p列印程序的調用棧

e. lsof -p找到程序打開了那些檔案

4. C 程式定位問題方法

4.1 top指令檢視目前負載

4.2 top -Hp pid 檢視目前程序的所有線程 cpu/memory占用情況,可以大緻知道哪個線程有問題

4.3 sudo pstack pid >> be.pstack 進一步檢視線程的棧,可以知道程式卡在哪裡

4.4 sudo perf top 檢視消耗cpu較高的函數

4.5 addr2line工具使用:通過addr2line可以把stdout日志中的位址解析成代碼棧,友善定位問題

addr2line -e lib/palo_be  0x2af6f63 0x2c4095b 0x134d278 0x134bdcb 0x133d105 0x133d1d0 0x19930ed           

4.6 pprof 生成cpu調用棧關系圖

pprof --svg --seconds=60 http://be_host:be_webport/pprof/profile > be.svg            

5. Java 程式定位問題方法

5.1 截棧,可以看出來最多的線程是哪個,線程等待什麼鎖

jstack -l pid >> fe.jstack           

如何排查死鎖:https://juejin.cn/post/6844904152850497543

5.2 截堆,可以分析出來哪一塊占用較多記憶體

jmap -dump:live,format=b,file=m.hprof PID           

heap檔案較大,解析時占用記憶體很高,不能線上上機器解析檔案,拷貝到build04分析

調用指令對heap檔案進行解析:

./ParseHeapDump.sh m.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components           

https://www.cnblogs.com/liangzs/p/8489321.html

繼續閱讀