微吼云上線多路互動(dòng)直播服務(wù) 加速多場景互動(dòng)直播落地
835
2025-04-01
前言
構(gòu)建決策樹的關(guān)鍵
構(gòu)建 CPU 分析決策樹
構(gòu)建 I/O 分析決策樹
構(gòu)建內(nèi)存分析決策樹
構(gòu)建網(wǎng)絡(luò)分析決策樹
總結(jié)
前言
構(gòu)建決策樹的關(guān)鍵
構(gòu)建 CPU 分析決策樹
構(gòu)建 I/O 分析決策樹
構(gòu)建內(nèi)存分析決策樹
構(gòu)建網(wǎng)絡(luò)分析決策樹
總結(jié)
前言
初學(xué)者對性能分析的感受是:橫看成嶺側(cè)成峰,遠(yuǎn)近高低各不同。那么應(yīng)該怎么學(xué)習(xí)才能建立起自己的性能分析體系,才能做到千山同一月,萬戶盡皆春。千江有水千江月,萬里無云萬里天呢?
這時(shí)候分析決策樹,對性能分析人員就體現(xiàn)價(jià)值了,是性能分析中不可或缺的一環(huán)。它是對架構(gòu)的梳理,是對系統(tǒng)的梳理,是對問題的梳理,是對查找證據(jù)鏈過程的梳理,是對分析思路的梳理。它起的是縱觀全局,高屋建瓴的指導(dǎo)作用。性能做到了藝術(shù)的層級之后,分析決策樹就是提煉出來的,可以觸類旁通的方法論。而我要在這里跟你講的,就是這樣的方法論。
構(gòu)建決策樹的關(guān)鍵
決策樹基本上就是把我們以前的分析經(jīng)驗(yàn)總結(jié)出來,在做決策樹的時(shí)候,一般會經(jīng)歷兩個(gè)階段:構(gòu)造和剪枝。
概念簡單來說:
構(gòu)造的過程就是選擇什么屬性作為節(jié)點(diǎn)的過程構(gòu)造的過程就是選擇什么屬性作為節(jié)點(diǎn)的過程;
剪枝就是給決策樹瘦身,這一步想實(shí)現(xiàn)的目標(biāo)就是,不需要太多的判斷,同樣可以得到不錯(cuò)的結(jié)果。之所以這么做,是為了防止“過擬合”現(xiàn)象的發(fā)生。
從性能分析角度來理解:
構(gòu)造:需要根據(jù)經(jīng)驗(yàn)是對架構(gòu)的梳理,是對系統(tǒng)的梳理,是對問題的梳理,是對查找證據(jù)鏈過程的梳理,是對分析思路的梳理;
剪枝:需要對對不同時(shí)間序列性能數(shù)據(jù)的相關(guān)性分析,其核心就是要理解各個(gè)性能指標(biāo)的關(guān)系,同時(shí)進(jìn)行證據(jù)鏈查找,根據(jù)數(shù)據(jù)的變化來推斷得出各種結(jié)論,比如故障判別、根因分析等。
構(gòu)建 CPU 分析決策樹
第一層是業(yè)務(wù)指標(biāo):
響應(yīng)時(shí)間
TPS
錯(cuò)誤率
第二層是資源指標(biāo):
CPU
IO
MEM
NET
分析方法(Java應(yīng)用):
使用 TOP 命令找到誰在消耗 CPU 比較高的進(jìn)程,例如 pid=1232
使用 top -p 1232 單獨(dú)監(jiān)控該進(jìn)程
輸入大寫的 H 列出當(dāng)前進(jìn)程下的所有線程
查看消耗 CPU 比較高的線程,并看線程編號,例如:12399
使用 jstack 1232>pagainfo.dump 獲取當(dāng)前進(jìn)程下的 dump 線程信息
將第四步獲取的線程編號 12399 轉(zhuǎn)換成 16 進(jìn)制 306f (printf "%x\n" 12399)
根據(jù) 306f 在第 5 步獲取的棧信息中查找 tid=0x306 的線程
定位代碼位置(根據(jù)打印出來的堆棧信息查看代碼所在位置)
以上過程簡單的辦法是借助一些開源的 shell 工具,如:
用于快速排查Java的CPU性能問題(top us值過高),自動(dòng)查出運(yùn)行的Java進(jìn)程中消耗CPU多的線程,并打印出其線程棧,從而確定導(dǎo)致性能問題的方法調(diào)用。
https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/java.md#-show-busy-java-threads
構(gòu)建 I/O 分析決策樹
先聊下磁盤系統(tǒng)結(jié)構(gòu):
如果是IDE驅(qū)動(dòng)器,磁盤命名為:hda、hdb、hdc等;
如果是SCSI驅(qū)動(dòng)器,磁盤命名為:sda、sdb、sdc等
磁盤通常被分成多個(gè)分區(qū),分區(qū)設(shè)備的名稱是通過將分區(qū)號添加到基本設(shè)備名稱的末尾來創(chuàng)建的,每個(gè)單獨(dú)的分區(qū)通常包含一個(gè)文件系統(tǒng)或一個(gè)交換分區(qū),按照/etc/fstab中的指定,這些分區(qū)被裝載到 Linux 根文件系統(tǒng)中。這些掛載的文件系統(tǒng)包含應(yīng)用程序讀寫的文件。
當(dāng)應(yīng)用程序執(zhí)行讀或?qū)懖僮鲿r(shí),Linux 內(nèi)核可能會將文件的副本存儲在其緩存或緩沖區(qū)中,并在不訪問磁盤的情況下返回所請求的信息。但是,如果 Linux 內(nèi)核沒有存儲在內(nèi)存中的數(shù)據(jù)副本,它會向磁盤的 I/O 隊(duì)列添加一個(gè)請求。如果 Linux 內(nèi)核注意到多個(gè)請求請求磁盤上的連續(xù)位置,它會將它們合并為一個(gè)大請求。這種合并消除了第二個(gè)請求的尋道時(shí)間,從而提高了總體磁盤性能。當(dāng)請求被放入磁盤隊(duì)列時(shí),如果磁盤當(dāng)前不忙,它將開始為 I/O 請求提供服務(wù)。如果磁盤正忙,請求將在隊(duì)列中等待,直到驅(qū)動(dòng)器可用,然后對其進(jìn)行服務(wù)。
在這一層咱們主要關(guān)注 I/O ,既然是關(guān)注 I/O ,如果 I/O 高應(yīng)該怎么去分析?怎么定位?
vmstat [-D] [-d] [-p 分區(qū)]
參數(shù)說明:
d:顯示磁盤相關(guān)統(tǒng)計(jì)信息。
D: 顯示 Linux I/O 子系統(tǒng)的總統(tǒng)計(jì)信息,統(tǒng)計(jì)數(shù)據(jù)是自系統(tǒng)啟動(dòng)以來的總數(shù)
p: 統(tǒng)計(jì)數(shù)據(jù)是自系統(tǒng)啟動(dòng)以來的總數(shù),而不僅僅是此示例和上一個(gè)示例之間發(fā)生的總數(shù)。
使用 vmstat 中關(guān)于磁盤也就是 bo/bi/wa
使用 vmstat 中關(guān)于磁盤也就是 bo/bi/wa:
bo 這表示在前一間隔內(nèi)寫入磁盤的塊總數(shù)。(在vmstat中,磁盤的塊大小通常為1024字節(jié)。)
bi 顯示在上一間隔中從磁盤讀取的塊數(shù)。(在vmstat中,磁盤的塊大小通常為1024字節(jié)。)
wa 表示等待I/O完成所花費(fèi)的CPU時(shí)間。每秒寫入磁盤塊的速率
在 linux 操作系統(tǒng)中 I/O 分析最常見的命令是 iostat
iostat -d -x -k 1 10
計(jì)數(shù)器信息的含義:
rsec/s:每秒讀取的扇區(qū)數(shù);
wsec/:每秒寫入的扇區(qū)數(shù)。
avgrq-sz:平均請求扇區(qū)的大小
avgqu-sz:是平均請求隊(duì)列的長度。毫無疑問,隊(duì)列長度越短越好。
await:每一個(gè) I/O 請求的處理的平均時(shí)間(單位是微秒毫秒)。這里可以理解為 I/O 的響應(yīng)時(shí)間,一般系統(tǒng) I/O 響應(yīng)時(shí)間應(yīng)該低于 5ms,如果大于 10ms就比較大了。這個(gè)時(shí)間包括了隊(duì)列時(shí)間和服務(wù)時(shí)間,也就是說,一般情況下,await 大于 svctm,它們的差值越小,則說明隊(duì)列時(shí)間越短,反之差值越大,隊(duì)列時(shí)間越長,說明系統(tǒng)出了問題。
svctm:表示平均每次設(shè)備 I/O 操作的服務(wù)時(shí)間(以毫秒為單位)。如果 svctm 的值與 await 很接近,表示幾乎沒有 I/O 等待,磁盤性能很好,如果 await 的值遠(yuǎn)高于 svctm 的值,則表示 I/O 隊(duì)列等待太長,系統(tǒng)上運(yùn)行的應(yīng)用程序?qū)⒆兟?/p>
%util:在統(tǒng)計(jì)時(shí)間內(nèi)所有處理 I/O 時(shí)間,除以總共統(tǒng)計(jì)時(shí)間。例如,如果統(tǒng)計(jì)間隔1秒,該設(shè)備有 0.8 秒在處理 I/O,而 0.2 秒閑置,那么該設(shè)備的 %util = 0.8/1 = 80%,所以該參數(shù)暗示了設(shè)備的繁忙程度。一般地,如果該參數(shù)是 100 %表示設(shè)備已經(jīng)接近滿負(fù)荷運(yùn)行了(當(dāng)然如果是多磁盤,即使 %util 是 100%,因?yàn)榇疟P的并發(fā)能力,所以磁盤使用未必就到了瓶頸)。
主要關(guān)注計(jì)數(shù)器:
util
avgqu-sz
await:
svtm
util
出現(xiàn)瓶頸的計(jì)數(shù)器:
%util 很高
await 遠(yuǎn)大于 svctm
avgqu-sz 比較大
cpu > wa 過大 (參考值超過 20)
system > bi&bo 過大(參考值超過 2000)
構(gòu)建內(nèi)存分析決策樹
在這一層咱們主要關(guān)注 mem ,既然是關(guān)注 mem,如果 mem 高應(yīng)該怎么去分析?怎么定位?
常用命令 free:
計(jì)數(shù)器說明:
total:總計(jì)物理內(nèi)存的大小
used:已使用多大
free:可用有多少
Shared:多個(gè)進(jìn)程共享的內(nèi)存總額
Buffers/cached:磁盤緩存的大小
vmstat 可以提供的 CPU 計(jì)數(shù)器外,還可以在內(nèi)存統(tǒng)計(jì)時(shí)使用:
vmstat [-a] [-s] [-m] [-d] [-p] [n] [-f] [-v]
參數(shù)說明:
-a:顯示活躍和非活躍內(nèi)存
-f:顯示從系統(tǒng)啟動(dòng)至今的fork數(shù)量 。
-m:顯示 slabinfo
-n:只在開始時(shí)顯示一次各字段名稱。
-s:顯示內(nèi)存相關(guān)統(tǒng)計(jì)信息及多種系統(tǒng)活動(dòng)數(shù)量。
delay:刷新時(shí)間間隔。如果不指定,只顯示一條結(jié)果。
count:刷新次數(shù)。如果不指定刷新次數(shù),但指定了刷新時(shí)間間隔,這時(shí)刷新次數(shù)為無窮。
-d:顯示磁盤相關(guān)統(tǒng)計(jì)信息。
-p:顯示指定磁盤分區(qū)統(tǒng)計(jì)信息
-S:使用指定單位顯示。參數(shù)有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(jié)(byte)。默認(rèn)單位為K(1024 bytes)
-V:顯示 vmstat 版本信息。
以上計(jì)數(shù)器具體每個(gè)信息代表什么,大家自行搜索一下,網(wǎng)上資料多如牛毛。
vmstat -m顯示的信息與 cat /proc/slabinfo 顯示的信息相同:
這詳細(xì)描述了內(nèi)核的內(nèi)存是如何分配的,并且有助于確定內(nèi)核的哪個(gè)區(qū)域消耗的內(nèi)存最多(通過這個(gè)命令就能知道內(nèi)存在那個(gè)區(qū)域消耗最多)
vmstat -s
其準(zhǔn)確跟蹤內(nèi)核如何使用其內(nèi)存時(shí)非常有用。
我們可以使用 vmstat 命令,監(jiān)控包括 Linux 的CPU使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO 讀寫情況,用于分析磁盤的壓力在哪里,在 swap,還是在 load 文件等;
構(gòu)建網(wǎng)絡(luò)分析決策樹
在學(xué)習(xí)網(wǎng)絡(luò)這一層需要了解下網(wǎng)絡(luò)的七層協(xié)議:
常用命令:
hostname
ping
ifconfig
wconfig
netstat
nslookup
traceroute
finger
telnet
ethtool
ip -s [-s] 鏈接
計(jì)數(shù)器解釋:
bytes:發(fā)送或接收的字節(jié)總數(shù)。
packets:發(fā)送或接收的數(shù)據(jù)包總數(shù)。
errors:發(fā)送或接收時(shí)發(fā)生的錯(cuò)誤數(shù)。
dropped:由于網(wǎng)卡資源不足而未發(fā)送或接收的數(shù)據(jù)包數(shù)。
overruns:網(wǎng)絡(luò)沒有足夠緩沖空間發(fā)送或接收更多數(shù)據(jù)包的次數(shù)。
mcast:已接收的多播數(shù)據(jù)包數(shù)。
carrier:由于鏈路媒體故障(如電纜故障)而丟棄的數(shù)據(jù)包數(shù)。
collsns:這是設(shè)備在傳輸時(shí)遇到的沖突數(shù)。當(dāng)兩臺設(shè)備試圖同時(shí)使用網(wǎng)絡(luò)時(shí),就會發(fā)生這種情況。
sar [-n DEV | EDEV | 襪子 | FULL ] [DEVICE] [間隔] [計(jì)數(shù)]
也可使用命令:
yum install iptraf iptraf-ng -d eth0 -t 1
查看哪個(gè)端口進(jìn)出流量是多少?
iptraf-ng -s eth0 -t 10
網(wǎng)絡(luò)統(tǒng)計(jì):
[-p] [-c] [–interfaces=<名稱>] [-s] [-t] [-u] [-w]
netstat -t -c
netstat -t -p
netstat -s -u
總結(jié)
如果你看到 Linux 操作系統(tǒng)架構(gòu)圖就頭大,那么這時(shí)候應(yīng)該覺得有了希望。我覺得操作系統(tǒng)上的問題判斷是比較清晰的,所以基于決策樹,每個(gè)人都可以做到對操作系統(tǒng)中性能問題的證據(jù)鏈查找。
Linux 云性能測試服務(wù) CPTS 決策樹
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。