防城港網(wǎng)站建設(shè)搜狗搜索舊版本
本文只是在閱讀《性能之巔》的過(guò)程中,對(duì)一些覺(jué)得有用的地方進(jìn)行的總結(jié)和摘錄,并附加一些方便理解的材料,完整內(nèi)容還請(qǐng)閱讀Gregg的大作
概念和方法
性能分析領(lǐng)域一詞的全棧代表了整個(gè)操作系統(tǒng)的軟硬件在內(nèi)的所有事物
軟件生命周期和性能規(guī)劃
軟件項(xiàng)目生命周期從構(gòu)思到開(kāi)發(fā)到生產(chǎn)部署的理想步驟包括如下部分,**性能問(wèn)題隨著開(kāi)發(fā)的推進(jìn)難度會(huì)越來(lái)越大。**云計(jì)算環(huán)境能夠讓用戶跳過(guò)前5個(gè)步驟(藍(lán)綠部署)
1.設(shè)置性能目標(biāo)和建立性能模型
2.基于軟件或硬件原型進(jìn)行性能特征歸納
3.對(duì)開(kāi)發(fā)代碼進(jìn)行性能分析(軟件整合之前)
4.執(zhí)行軟件非回歸性測(cè)試(軟件發(fā)布前或發(fā)布后)
5.針對(duì)軟件發(fā)布版本的基準(zhǔn)測(cè)試
6.目標(biāo)環(huán)境中的概念驗(yàn)證(Proof-of-concept)測(cè)試
7.生產(chǎn)環(huán)境部署的配置優(yōu)化
8.監(jiān)控生產(chǎn)環(huán)境中運(yùn)行的軟件
9.特定問(wèn)題的性能分析
性能分析視角
性能分析可以從不同角度觸發(fā),典型的兩種性能分析的視角:負(fù)載分析(workload analysis)和資源分析(resource analysis)。開(kāi)發(fā)人員工程采用負(fù)載視角,運(yùn)維人員則從資源視角出發(fā)
性能分析出發(fā)點(diǎn)
性能問(wèn)題有其主觀性(需要客觀明確的標(biāo)準(zhǔn))和復(fù)雜性(問(wèn)題是面而非單個(gè)的點(diǎn))。
-
應(yīng)用程序和內(nèi)核通過(guò)在執(zhí)行邏輯中硬編碼計(jì)數(shù)器,提供關(guān)于活動(dòng)和狀態(tài)的數(shù)據(jù)(操作數(shù),字節(jié)數(shù),使用率,延時(shí),錯(cuò)誤率等),根據(jù)這些數(shù)據(jù)可以進(jìn)一步計(jì)算統(tǒng)計(jì)指標(biāo)(平均值,比率,百分比等)
-
除了被動(dòng)獲取技術(shù)器數(shù)據(jù)外,還可以通過(guò)profile工具按需采樣(火焰圖)
-
除了分析數(shù)據(jù)外,還可以對(duì)事件記錄進(jìn)行分析,捕獲事件數(shù)據(jù)并保存和分析(系統(tǒng)調(diào)用
strace
,網(wǎng)絡(luò)數(shù)據(jù)包tcpdump
)
- 靜態(tài)檢測(cè)指在源碼硬編碼的埋點(diǎn),linux內(nèi)核中有數(shù)百個(gè)檢測(cè)點(diǎn)(tracepoint),內(nèi)核空間和用戶空間分別有對(duì)應(yīng)的技術(shù)
- 動(dòng)態(tài)檢測(cè)指在程序運(yùn)行后,在內(nèi)存中插入檢測(cè)指令(例如bpf)
-
觀測(cè)之外的手段,即通過(guò)實(shí)驗(yàn)的方式進(jìn)行基準(zhǔn)測(cè)試,分為宏觀(模擬真實(shí)負(fù)載)和微觀基準(zhǔn)測(cè)試
-
好的工具能夠提升關(guān)測(cè)和分析的效率,linux的60秒快速分析涉及到如下工具
工具 檢查 uptime
平均負(fù)載識(shí)別系統(tǒng)負(fù)載的變化 `dmesg -T tail` vmstat -SM 1
系統(tǒng)級(jí)統(tǒng)計(jì),運(yùn)行隊(duì)列長(zhǎng)度,交換,cpu總體狀況 mpstat -P ALL 1
CPU平衡情況 pidstat 1
單個(gè)進(jìn)程的cpu使用 iostat -sxz 1
磁盤(pán)io統(tǒng)計(jì),iops,吞吐量,平均等待事件,utils等 free -m
內(nèi)存使用,cache和buffer sar -n DEV 1
網(wǎng)絡(luò)設(shè)備io,數(shù)據(jù)包和吞吐量 sar -n TCP,ETCP 1
tcp統(tǒng)計(jì),連接和重傳 top
概覽
性能術(shù)語(yǔ)
關(guān)于性能的一些術(shù)語(yǔ)
- IOPS:每秒發(fā)生的輸入/輸出操作的次數(shù)
- 吞吐量:評(píng)價(jià)工作執(zhí)行的速率,尤其是在數(shù)據(jù)傳輸方面,這個(gè)術(shù)語(yǔ)用于描述數(shù)據(jù)傳輸速度(字節(jié)/秒或比特/秒)。在某些情況下(如數(shù)據(jù)庫(kù)),吞吐量指的是操作的速度(每秒操作數(shù)或每秒業(yè)務(wù)數(shù))
- 響應(yīng)時(shí)間:一次操作完成的時(shí)間。包括用于等待和服務(wù)的時(shí)間,也包括用來(lái)返回結(jié)果的時(shí)間。
- 延時(shí):延時(shí)是描述操作里用來(lái)等待服務(wù)的時(shí)間。在某些情況下,它可以指的是整個(gè)操作時(shí)間,等同于響應(yīng)時(shí)間。
- 使用率:對(duì)于服務(wù)所請(qǐng)求的資源,使用率描述在所給定的時(shí)間區(qū)間內(nèi)資源的繁忙程度。對(duì)于存儲(chǔ)資源來(lái)說(shuō),使用率指的就是所消耗的存儲(chǔ)容量
- 飽和度:指的是某一資源無(wú)法滿足服務(wù)的排隊(duì)工作量。
- 瓶頸:在系統(tǒng)性能里,瓶頸指的是限制系統(tǒng)性能的那個(gè)資源。
- 工作負(fù)載:系統(tǒng)的輸入或者是對(duì)系統(tǒng)所施加的負(fù)載叫做工作負(fù)載。對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),工作負(fù)載就是客戶端發(fā)出的數(shù)據(jù)庫(kù)請(qǐng)求和命令。
- 緩存:用于復(fù)制或者緩沖一定量數(shù)據(jù)的高速存儲(chǔ)區(qū)域,避免對(duì)較慢的存儲(chǔ)層級(jí)的直接訪問(wèn)從而提高性能
對(duì)其中一些概念的抽象能夠更好的體會(huì)量級(jí)的差異,延時(shí)和吞吐量尤其需要注意
項(xiàng)目就是在性能,響應(yīng)速度和成本之間進(jìn)行權(quán)衡的過(guò)程,性能調(diào)優(yōu)在應(yīng)用程序本身進(jìn)行效果是最顯著的
性能分析方法
性能分析的方法很多,完整理論部分參考《性能之巔》的具體章節(jié),感覺(jué)比較好理解的方法有
- USE方法,遍歷資源(硬件和軟件資源),根據(jù)資源在utilization、saturation、errors三個(gè)方面尋找測(cè)量指標(biāo),指標(biāo)的異常往往體現(xiàn)了性能問(wèn)題
- 工作負(fù)載特征歸納,關(guān)注負(fù)載導(dǎo)致的問(wèn)題(系統(tǒng)的輸入),例如負(fù)載的產(chǎn)生,調(diào)用邏輯,負(fù)載特征(iops,吞吐量,讀寫(xiě),變動(dòng)方向)
- 性能箴言,包括一些典型的調(diào)優(yōu)手段
- 不要做,消除不必要的工作
- 做但不要再做,利用緩存
- 做少一點(diǎn),將刷新,輪詢和更新的頻率降低
- 回頭再做,回寫(xiě)緩存
- 在夜深人靜的時(shí)候做,錯(cuò)開(kāi)時(shí)間
- 同時(shí)做,多線程
- 做的更便宜,提升硬件性能
操作系統(tǒng)
系統(tǒng)內(nèi)核
linux內(nèi)核管理著CPU 調(diào)度、內(nèi)存、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議,以及系統(tǒng)設(shè)備。
相比系統(tǒng)調(diào)用,系統(tǒng)庫(kù)提供的編程接口通常更為豐富和簡(jiǎn)單。應(yīng)用程序本身可以直接進(jìn)行系統(tǒng)調(diào)用(操作系統(tǒng)允許)
頻繁IO的工作負(fù)載(網(wǎng)絡(luò)服務(wù)器)主要在內(nèi)核態(tài)運(yùn)行,計(jì)算密集型的工作負(fù)載通常在用戶態(tài)運(yùn)行。因此,查看cpu的不同態(tài)的事件可以判斷工作負(fù)載的特征
內(nèi)核的執(zhí)行主要是按需的,例如,當(dāng)用戶級(jí)別的程序發(fā)起一次系統(tǒng)調(diào)用,或者設(shè)備發(fā)送一個(gè)中斷時(shí)。一些內(nèi)核線程會(huì)異步地執(zhí)行一些系統(tǒng)維護(hù)的工作,其中可能包括內(nèi)核時(shí)鐘程序和內(nèi)存管理任務(wù)
經(jīng)典的UNIX 內(nèi)核的一個(gè)核心組件是clock()例程(存在性能問(wèn)題),現(xiàn)代內(nèi)核已經(jīng)把許多功能移出了clock 例程,放到了按需中斷中,這是為了努力創(chuàng)造無(wú)tick內(nèi)核
內(nèi)核是唯一運(yùn)行在內(nèi)核態(tài)的程序(允許設(shè)備訪問(wèn)和特權(quán)指令)。用戶程序(進(jìn)程)運(yùn)行在用戶態(tài),對(duì)于內(nèi)核特權(quán)操作(例如I/O)的請(qǐng)求是通過(guò)系統(tǒng)調(diào)用傳遞的。執(zhí)行系統(tǒng)操作,執(zhí)行會(huì)做上下文切換從用戶態(tài)到內(nèi)核態(tài),然后用更高的特權(quán)級(jí)別執(zhí)行
用戶態(tài)和內(nèi)核態(tài)程序有自身的上下文,上下文狀態(tài)切換有性能損耗(發(fā)生在狀態(tài)切換和進(jìn)程切換)。有以下的優(yōu)化方式避免模式切換
- 用戶態(tài)系統(tǒng)調(diào)用,內(nèi)核導(dǎo)出虛擬動(dòng)態(tài)共享對(duì)象到進(jìn)程地址空間
- 內(nèi)存映射
- 內(nèi)核旁路(bypass),例如
DPDK
- 內(nèi)核態(tài)應(yīng)用程序(用戶態(tài)docker)
系統(tǒng)調(diào)用是請(qǐng)求內(nèi)核執(zhí)行特權(quán)指令的例程,在內(nèi)核中實(shí)現(xiàn)(因此要保證簡(jiǎn)單),復(fù)雜的接口可以在用戶空間通過(guò)系統(tǒng)庫(kù)實(shí)現(xiàn)(例如glibc)
中斷分為異步中斷(硬件產(chǎn)生)和同步中斷(軟件產(chǎn)生)
對(duì)于Linux 而言,設(shè)備驅(qū)動(dòng)分為兩半,上半部用于快速處理中斷(在中斷禁止模式,不能耗時(shí)太長(zhǎng)),到下半部的調(diào)度工作在之后處理(作為tasklet或工作隊(duì)列)
進(jìn)程是用以執(zhí)行用戶級(jí)別程序的環(huán)境。它包括內(nèi)存地址空間、文件描述符、線程棧和寄存器。一個(gè)進(jìn)程中包含有一個(gè)或多個(gè)線程,線程是一個(gè)可執(zhí)行的上下文,包括棧、寄存器,以及程序計(jì)數(shù)器
調(diào)度器,進(jìn)程在處理器上和CPU 間的調(diào)度是由調(diào)度器完成的,這是操作系統(tǒng)內(nèi)核的關(guān)鍵組件?;镜囊鈭D是將CPU 時(shí)間劃分給活躍的進(jìn)程和線程,而且維護(hù)一套優(yōu)先級(jí)的機(jī)制
調(diào)度器會(huì)跟蹤所有處于ready-to-run 狀態(tài)的線程,傳統(tǒng)意義上每一個(gè)優(yōu)先級(jí)隊(duì)列都稱為運(yùn)行隊(duì)列,每個(gè)cpu都有一個(gè)隊(duì)列。多數(shù)的內(nèi)核線程運(yùn)行的優(yōu)先級(jí)要比用戶級(jí)別的優(yōu)先級(jí)高。此處的優(yōu)先級(jí)僅僅只時(shí)間片的長(zhǎng)度,和運(yùn)行的優(yōu)先級(jí)沒(méi)有關(guān)系(搶占式調(diào)度)。內(nèi)核中存在動(dòng)態(tài)優(yōu)化的邏輯執(zhí)行類似以下操作
調(diào)度器能夠識(shí)別CPU 密集型的進(jìn)程并降低它們的優(yōu)先級(jí),可以讓I/O 密集型工作負(fù)載(需要低延時(shí)響應(yīng))更快地運(yùn)行
文件系統(tǒng)是作為文件和目錄的數(shù)據(jù)組織。有一個(gè)基于文件的接口用于訪問(wèn),該接口通常基于POSIX 標(biāo)準(zhǔn)。虛擬文件系統(tǒng)(virtual file system,VFS)是一個(gè)對(duì)文件系統(tǒng)類型做抽象的內(nèi)核界面
基于存儲(chǔ)設(shè)備的文件系統(tǒng),從用戶級(jí)軟件到存儲(chǔ)設(shè)備的路徑被稱為I/O 棧
由于磁盤(pán)I/O 的延時(shí)較長(zhǎng),軟件棧中的很多層級(jí)通過(guò)緩存讀取和緩存寫(xiě)入來(lái)試圖避免,常見(jiàn)的緩存包括
緩存 | 實(shí)例 |
---|---|
客戶端緩存 | 瀏覽器緩存 |
應(yīng)用程序緩存 | - |
webserver緩存 | apache緩存 |
緩存服務(wù)器 | redis |
數(shù)據(jù)庫(kù)緩存 | mysql緩沖區(qū)告訴緩存 |
目錄緩存 | dcache |
文件元數(shù)據(jù)緩存 | inode緩存 |
操作系統(tǒng)緩沖區(qū)高速緩存 | 緩沖區(qū)高速緩存 |
文件系統(tǒng)主緩存 | 換頁(yè)緩存 |
文件系統(tǒng)次緩存 | ZFS L2ARC |
設(shè)備緩存 | ZFS vdev |
快緩存 | 緩沖區(qū)高速緩存 |
磁盤(pán)控制器緩存 | RAID卡緩存 |
存儲(chǔ)陣列緩存 | - |
磁盤(pán)內(nèi)存緩存 | - |
內(nèi)核提供一套內(nèi)置的網(wǎng)絡(luò)協(xié)議棧(TCP/IP 棧),能夠讓系統(tǒng)用網(wǎng)絡(luò)進(jìn)行通信。網(wǎng)絡(luò)協(xié)議通常不會(huì)變,但是新的TCP 選項(xiàng)和新的TCP 阻塞控制算法需要內(nèi)核支持。另一個(gè)可能的變化是對(duì)于不同的網(wǎng)絡(luò)接口卡的支持,需要內(nèi)核有新設(shè)備的驅(qū)動(dòng)
設(shè)備驅(qū)動(dòng)是用于設(shè)備管理和設(shè)備I/O 的內(nèi)核軟件,常常由開(kāi)發(fā)硬件設(shè)備的廠商提供
設(shè)備驅(qū)動(dòng)提供給設(shè)備的接口有字符接口也有塊接口。字符設(shè)備,也稱為原始設(shè)備,提供無(wú)緩沖的設(shè)備順序訪問(wèn),訪問(wèn)可以是任意I/O 尺寸的,也可以小到單一字符,取決于設(shè)備本身
多處理器架構(gòu)下,NUMA架構(gòu)允許主存連接到不同的物理CPU
觀測(cè)工具
Linux 性能調(diào)優(yōu)工具9張圖
linux工作負(fù)載性能觀測(cè)工具

工具的維度劃分,系統(tǒng)級(jí)別和進(jìn)程級(jí)別
觀測(cè)工具只是通過(guò)各種結(jié)構(gòu)和框架整理信息,數(shù)據(jù)來(lái)源包括
例如,/proc
是一個(gè)提供內(nèi)核統(tǒng)計(jì)信息的文件系統(tǒng)接口,將內(nèi)核統(tǒng)計(jì)數(shù)據(jù)用目錄樹(shù)的形式暴露給用戶空間,接口就是POSIX文件系統(tǒng)調(diào)用。/sys
在2.6 內(nèi)核引入的,為內(nèi)核統(tǒng)計(jì)提供一個(gè)基于目錄的結(jié)構(gòu)
/proc進(jìn)程級(jí)別的接口如下
- limits:實(shí)際的資源限制
- maps:映射的內(nèi)存區(qū)域
- sched:CPU 調(diào)度器的各種統(tǒng)計(jì)
- schedstat:CPU 運(yùn)行時(shí)間、延時(shí)和時(shí)間分片
- smaps:映射內(nèi)存區(qū)域的使用統(tǒng)計(jì)
- stat:進(jìn)程狀態(tài)和統(tǒng)計(jì),包括總的CPU 和內(nèi)存的使用情況
- statm:以頁(yè)為單位的內(nèi)存使用總結(jié)
- status:stat 和statm 的信息,用戶可讀
- task:每個(gè)任務(wù)的統(tǒng)計(jì)目錄
/proc系統(tǒng)級(jí)別的接口如下
- cpuinfo:物理處理器信息,包含所有虛擬CPU、型號(hào)、時(shí)鐘頻率和緩存大小
- diskstats:對(duì)于所有磁盤(pán)設(shè)備的磁盤(pán)I/O 統(tǒng)計(jì)
- interrupts:每個(gè)CPU 的中斷計(jì)數(shù)器
- loadavg:負(fù)載平均值
- meminfo:系統(tǒng)內(nèi)存使用明細(xì)
- net/dev:網(wǎng)絡(luò)接口統(tǒng)計(jì)
- net/tcp:活躍的TCP 套接字信息
- schedstat:系統(tǒng)級(jí)別的CPU 調(diào)度器統(tǒng)計(jì)
- self:關(guān)聯(lián)當(dāng)前進(jìn)程ID 路徑的符號(hào)鏈接
- slabinfo:內(nèi)核slab 分配器緩存統(tǒng)計(jì)
- stat:內(nèi)核和系統(tǒng)資源的統(tǒng)計(jì),CPU、磁盤(pán)、分頁(yè)、交換區(qū)、進(jìn)程
- zoneinfo:內(nèi)存區(qū)信息。
sar
也是一個(gè)不可忽視的觀測(cè)工具,以下是可以覆蓋的觀測(cè)范圍

這里只列出了常見(jiàn)的觀測(cè)數(shù)據(jù)源,詳細(xì)需要參考原著
之后就是對(duì)應(yīng)用程序,cpu,內(nèi)存,文件系統(tǒng),磁盤(pán),網(wǎng)絡(luò)等進(jìn)行的具體分析
應(yīng)用程序
性能調(diào)整離工作所執(zhí)行的地方越近越好:最好在應(yīng)用程序里
Go 語(yǔ)言高性能編程
分析問(wèn)題
對(duì)于一個(gè)應(yīng)用程序的分析應(yīng)當(dāng)考慮以下問(wèn)題
- 功能:應(yīng)用程序的角色是什么?是數(shù)據(jù)庫(kù)、Web 服務(wù)器、負(fù)載均衡器、文件服務(wù)器,還是對(duì)象存儲(chǔ)?
- 操作:應(yīng)用服務(wù)器服務(wù)哪些請(qǐng)求,或者執(zhí)行怎么樣的操作?數(shù)據(jù)庫(kù)服務(wù)查詢(和命令)、Web 服務(wù)器服務(wù)HTTP 請(qǐng)求,等等。這些可以用速率來(lái)度量,用以估計(jì)負(fù)載和做容量規(guī)劃。
- CPU 模式:應(yīng)用程序是用戶級(jí)的軟件實(shí)現(xiàn)還是內(nèi)核級(jí)的軟件實(shí)現(xiàn)?多數(shù)的應(yīng)用程序是用戶級(jí)別的,以一個(gè)或多個(gè)進(jìn)程的形式執(zhí)行,但是有些是以內(nèi)核服務(wù)的形式實(shí)現(xiàn)的(例如,NFS)。
- 配置:應(yīng)用程序是怎樣配置的,為什么這么配?這些信息能在配置文件里找到或者用管理工具得到。檢查所有與性能相關(guān)的可調(diào)參數(shù)有沒(méi)有改過(guò),包括緩沖區(qū)大小、緩存大小、并發(fā)(進(jìn)程或線程),以及其他選項(xiàng)。
- 指標(biāo):有沒(méi)有可用的應(yīng)用程序指標(biāo),如操作率?可能是用自帶工具或者第三方工具,通過(guò)API 請(qǐng)求,或者通過(guò)處理操作日志得到。
- 日志:應(yīng)用程序創(chuàng)建的操作日志是哪些?能啟用什么樣的日志?哪些性能指標(biāo),包括延時(shí),能從日志中得到?
- 版本:應(yīng)用程序是最新的版本嗎?在最近的版本的發(fā)布說(shuō)明里有沒(méi)有提及性能的修復(fù)和性能的提升?
- Bugs:應(yīng)用程序有bug 數(shù)據(jù)庫(kù)嗎?你用的應(yīng)用程序版本有什么樣的“性能”bug?
- 社區(qū):應(yīng)用程序社區(qū)里有分享性能發(fā)現(xiàn)的地方嗎?
- 書(shū):有與應(yīng)用程序以及它的性能相關(guān)的書(shū)嗎?
- 專家:誰(shuí)是這個(gè)應(yīng)用程序公認(rèn)的性能專家?
分析目標(biāo)
應(yīng)用程序性能分析的目標(biāo)
- 延時(shí):低應(yīng)用程序響應(yīng)時(shí)間
- 吞吐量:高應(yīng)用程序操作率或者數(shù)據(jù)傳輸率
- 資源使用率:對(duì)于給定應(yīng)用程序工作負(fù)載,高效地使用資源
常用的調(diào)優(yōu)手段
提高應(yīng)用程序性能的常用技術(shù)包括:選擇I/O 大小、緩存、緩沖區(qū)、輪詢、并發(fā)和并行、非阻塞I/O 和處理器綁定
-
IO大小:IO大小越大,每次傳輸?shù)臄?shù)據(jù)越多,效率越高。然而隨機(jī)讀寫(xiě)大的IO會(huì)造成浪費(fèi)(IO時(shí)間和緩存)
執(zhí)行I/O 的開(kāi)銷包括初始化緩沖區(qū)、系統(tǒng)調(diào)用、上下文切換、分配內(nèi)核元數(shù)據(jù)、檢查進(jìn)程權(quán)限和限制、映射地址到設(shè)備、執(zhí)行內(nèi)核和驅(qū)動(dòng)代碼來(lái)執(zhí)行I/O,以及,在最后釋放元數(shù)據(jù)和緩沖區(qū)。
-
緩存:存儲(chǔ)通常用緩存來(lái)提高寫(xiě)操作的性能,需要注意緩存一致性(避免返回過(guò)期數(shù)據(jù))
12 張圖看懂 CPU 緩存一致性與 MESI 協(xié)議
-
緩沖區(qū):寫(xiě)操作同樣有寫(xiě)緩沖區(qū),將IO進(jìn)行合并減少開(kāi)銷,但是會(huì)增加寫(xiě)延遲。環(huán)形緩沖區(qū)(例如網(wǎng)卡驅(qū)動(dòng)緩沖)提供了固定大小的緩沖區(qū)
-
輪詢:不斷檢查事件狀態(tài),導(dǎo)致CPU開(kāi)銷,兩個(gè)檢查存在延遲。通過(guò)poll和epoll接口提供基于事件的觸發(fā),避免輪詢
-
并發(fā):可以用多進(jìn)程(multiprocess)或者多線程(multithreaded)實(shí)現(xiàn),需要調(diào)度器上下文切換開(kāi)銷為代價(jià)??梢栽谟脩魬B(tài)實(shí)現(xiàn)調(diào)度:協(xié)程(goroutine),基于事件的并發(fā)(nodejs)。提到并發(fā)就要考慮到同步原語(yǔ)的問(wèn)題,即鎖可能會(huì)導(dǎo)致性能問(wèn)題
Golang深入理解GPM模型
-
非阻塞IO:非阻塞I/O 模型是異步地發(fā)起I/O,而不阻塞當(dāng)前的線程,線程可以執(zhí)行其他的工作
-
處理器綁定:NUMA架構(gòu)下,線程執(zhí)行I/O 前后運(yùn)行在同一CPU 上。提高了應(yīng)用程序的內(nèi)存本地性,減少內(nèi)存I/O
編程語(yǔ)言級(jí)別
- 編程語(yǔ)言:不同語(yǔ)言的選擇,編譯型語(yǔ)言編譯優(yōu)化的考量,解釋性語(yǔ)言解釋器的分析
- 語(yǔ)言虛擬機(jī):性能分析通??康氖钦Z(yǔ)言虛擬機(jī)提供的工具集(一些虛擬機(jī)提供DTrace 探針)和第三方的工具
- GC(垃圾回收):影響內(nèi)存,CPU損耗和GC導(dǎo)致的延時(shí)有,例如,Java虛擬機(jī)提供了許多可調(diào)參數(shù)來(lái)設(shè)置GC 類型、GC 的線程數(shù)、堆尺寸的最大值、目標(biāo)堆的空閑率
具體的分析方法
包括CPU剖析,系統(tǒng)調(diào)用,線程狀態(tài),IO,工作負(fù)載,USE方法,鎖分析
線程狀態(tài)的分析
確定應(yīng)用程序的線程在哪里花費(fèi)了時(shí)間,線程的9種狀態(tài)
- 用戶:用戶態(tài)的on-cpu,哪些代碼在消耗CPU
- 內(nèi)核:內(nèi)核態(tài)的on-cpu,哪些代碼在消耗CPU
- 可運(yùn)行:等待輪到上CPU,意味著需要申請(qǐng)資源,考慮是否存在資源控制(cgroup)
- 匿名換頁(yè):可運(yùn)行,但是因等待匿名換頁(yè)而受阻,內(nèi)存不足可能換頁(yè),考慮資源控制
- 磁盤(pán)IO:等待塊設(shè)備IO
- 網(wǎng)絡(luò)IO:等待網(wǎng)絡(luò)折欸IO,套接字讀寫(xiě)
- 睡眠:等待包括網(wǎng)絡(luò)、塊設(shè)備和數(shù)據(jù)/文本頁(yè)換入在內(nèi)的I/O。
- 鎖:等待獲取同步鎖(等待其他線程)
- 空閑:等待工作
靜態(tài)性能調(diào)優(yōu)的問(wèn)題
- 在運(yùn)行的應(yīng)用程序是什么版本?有更新的版本嗎?發(fā)布說(shuō)明有提及性能提高嗎?
- 應(yīng)用程序有哪些已知的性能問(wèn)題?有可供搜索的bug 數(shù)據(jù)庫(kù)嗎?
- 應(yīng)用程序是如何配置的?
- 如果配置或調(diào)整的與默認(rèn)值不同,是由于什么原因?(是基于測(cè)量和分析,還是猜想?)
- 應(yīng)用程序用到了對(duì)象緩存嗎?緩存的大小是怎樣的?
- 應(yīng)用程序是并發(fā)運(yùn)行的嗎?這是如何配置的(例如,線程池大小)?
- 應(yīng)用程序運(yùn)行在特定模式下嗎?應(yīng)用程序用到了哪些系統(tǒng)庫(kù)?它們的版本是什么?
- 應(yīng)用程序用的是怎樣的內(nèi)存分配器?
- 應(yīng)用程序配置用大頁(yè)面做堆嗎?
- 應(yīng)用程序是編譯的嗎?編譯器的版本是什么?編譯器的選項(xiàng)和優(yōu)化是哪些?是64 位的嗎?
- 應(yīng)用程序遇到錯(cuò)誤了嗎?錯(cuò)誤之后會(huì)運(yùn)行在降級(jí)模式嗎?
- 有沒(méi)有系統(tǒng)設(shè)置的限制,以及對(duì)CPU、內(nèi)存、文件系統(tǒng)、磁盤(pán)和網(wǎng)絡(luò)使用的資源控制?(在云計(jì)算中很普遍)
CPU
概念和架構(gòu)
cpu運(yùn)行隊(duì)列,花在等待CPU 運(yùn)行上的時(shí)間又被稱為運(yùn)行隊(duì)列延時(shí)或者分發(fā)器隊(duì)列延時(shí)(調(diào)度器延時(shí))。對(duì)于多處理器系統(tǒng),內(nèi)核通常為每個(gè)CPU 提供了一個(gè)運(yùn)行隊(duì)列,并盡量使得線程每次都被放到同一隊(duì)列之中(熱緩存)。在NUMA系統(tǒng)中,這會(huì)提高內(nèi)存本地性,從而提高系統(tǒng)性能
-
時(shí)鐘頻率,更快的時(shí)鐘頻率并不一定會(huì)提高性能,取決于快速CPU 周期指令。指令流水線能夠提升cpu的吞吐量。
-
每指令周期(CPI):CPI 較高代表CPU 經(jīng)常陷入停滯,通常都是在訪問(wèn)內(nèi)存。而較低的CPI 則代表CPU 基本沒(méi)有停滯,指令吞吐量較高
-
使用率:CPU 使用率通過(guò)測(cè)量一段時(shí)間內(nèi)CPU 實(shí)例忙于執(zhí)行工作的時(shí)間比例獲得。CPU 使用率的測(cè)量包括了所有符合條件活動(dòng)的時(shí)鐘周期,包括內(nèi)存停滯周期(等待IO的時(shí)間)。CPU 使用率通常被分成內(nèi)核時(shí)間和用戶時(shí)間兩個(gè)指標(biāo)
-
飽和度:100%使用率的CPU 被稱為是飽和的,線程在這種情況下會(huì)碰上調(diào)度器延時(shí),也有可能被cgroup限制
-
多進(jìn)程和多線程的比較
-
字長(zhǎng):表示地址空間大小和數(shù)據(jù)通路寬度,增加吞吐量,額外的內(nèi)存開(kāi)銷
-
緩存:不同級(jí)別緩存訪問(wèn)時(shí)延不同
-
系統(tǒng)總線:在處理器數(shù)目增長(zhǎng)的情況下,會(huì)因?yàn)楣蚕硐到y(tǒng)總線資源而出現(xiàn)擴(kuò)展性問(wèn)題?,F(xiàn)在多處理器使用NUMA架構(gòu)和cpu互聯(lián)技術(shù)
-
調(diào)度器,具備的功能有
- 分時(shí):可運(yùn)行線程之間的多任務(wù),優(yōu)先執(zhí)行最高優(yōu)先級(jí)任務(wù)
- 搶占:一旦有高優(yōu)先級(jí)線程變?yōu)榭蛇\(yùn)行狀態(tài),調(diào)度器能夠搶占當(dāng)前運(yùn)行的線程,這樣較高優(yōu)先級(jí)的線程可以馬上開(kāi)始運(yùn)行
- 負(fù)載均衡:把可運(yùn)行的線程移到空閑或者較不繁忙的CPU 隊(duì)列中
-
調(diào)度類:管理了可運(yùn)行線程的行為,優(yōu)先級(jí),CPU 時(shí)間是否分片,以及這些時(shí)間片的長(zhǎng)度(又稱為時(shí)間量子)。用戶線程的優(yōu)先級(jí)受一個(gè)用戶定義的一個(gè)nice 值影響??梢詫?duì)不重要的工作設(shè)置這個(gè)值以降低其優(yōu)先級(jí)
linux下的調(diào)度類有
- RT:為實(shí)時(shí)類負(fù)載提供固定的高優(yōu)先級(jí)。內(nèi)核支持用戶和內(nèi)核級(jí)別的搶占,允許RT任務(wù)以短延時(shí)分發(fā)。優(yōu)先級(jí)范圍為0~99
- O(1)調(diào)度器:在Linux 2.6 作為默認(rèn)用戶進(jìn)程分時(shí)調(diào)度器引入
- CFS:Linux 2.6.23 引入了完全公平調(diào)度作為默認(rèn)用戶進(jìn)程分時(shí)調(diào)度器
用戶級(jí)進(jìn)程可以通過(guò)調(diào)用sched_setscheduler()設(shè)置調(diào)度器策略以調(diào)整調(diào)度類的行為。RT 類支持
SCHED_RR
和SCHED_FIFO
策略,而CFS 類支持SCHED_NORMAL
和SCHED_BATCH
常用工具
- uptime:檢查負(fù)載平均數(shù)以確認(rèn)CPU 負(fù)載是隨時(shí)間上升還是下降。負(fù)載平均數(shù)超過(guò)了CPU 數(shù)量通常代表CPU 飽和
- vmstat:每秒運(yùn)行vmstat,然后檢查空閑列,看看還有多少余量。少于10%可能是一個(gè)問(wèn)題
- mpstat:檢查單個(gè)熱點(diǎn)(繁忙)CPU,挑出一個(gè)可能的線程擴(kuò)展性問(wèn)題
- top/prstat:看看哪個(gè)進(jìn)程和用戶是CPU 消耗大戶
- pidstat/prstat:把CPU 消耗大戶分解成用戶和系統(tǒng)時(shí)間
- perf/dtrace/stap/oprofile:從用戶時(shí)間或者內(nèi)核時(shí)間的角度剖析CPU 使用的堆棧跟蹤,以了解為什么使用這么多CPU。●
- perf/cpustat:測(cè)量CPI
具體的分析方法
USE方法
檢車美俄cpu的
- 使用率:CPU 繁忙的時(shí)間(未在空閑線程中)。
- 飽和度:可運(yùn)行線程排隊(duì)等待CPU 的程度。
- 錯(cuò)誤:CPU 錯(cuò)誤,包括可改正錯(cuò)誤
負(fù)載特征分析
- 平均負(fù)載(使用率+飽和度)
- 用戶時(shí)間與系統(tǒng)時(shí)間之比
- 系統(tǒng)調(diào)用頻率
- 自愿上下文切換頻率
- 中斷頻率
- 整個(gè)系統(tǒng)范圍內(nèi)的CPU 使用率是多少?每個(gè)CPU 呢?
- CPU 負(fù)載的并發(fā)程度如何?是單線程嗎?有多少線程?
- 哪個(gè)應(yīng)用程序或者用戶在使用CPU?用了多少?
- 哪個(gè)內(nèi)核線程在使用CPU?用了多少?
- 中斷的CPU 用量是多少?
- CPU 互聯(lián)的使用率是多少?
- 為什么CPU 被使用(用戶和內(nèi)核級(jí)別調(diào)用路徑)?
- 遇到了什么類型的停滯周期?
靜態(tài)性能調(diào)優(yōu)
- 有多少CPU 可用?是核嗎?還是硬件線程?
- CPU 的架構(gòu)是單處理器還是多處理器?
- CPU 緩存的大小是多少?是共享的嗎?
- CPU 時(shí)鐘頻率是多少?是動(dòng)態(tài)的(例如Intel 睿頻加速和SpeedStep)嗎?這些動(dòng)態(tài)特性在BIOS 啟用了嗎?
- BIOS 里啟用或者禁用了其他什么CPU 相關(guān)的特性?
- 這款型號(hào)的處理器有什么性能問(wèn)題(bug)?出現(xiàn)在處理器勘誤表上了嗎?
- 這個(gè)BIOS 固件版本有什么性能問(wèn)題(bug)嗎?
- 有軟件的CPU 使用限制(資源控制)嗎?是什么?
常用性能指標(biāo)
- 平均負(fù)載:表示了對(duì)CPU 資源的需求,通過(guò)匯總正在運(yùn)行的線程數(shù)(使用率)和正在排隊(duì)等待運(yùn)行的線程數(shù)(飽和度)計(jì)算得出。Linux 目前把在不可中斷狀態(tài)執(zhí)行磁盤(pán)I/O 的任務(wù)也計(jì)入了平均負(fù)載。這意味著平均負(fù)載再也不能單用來(lái)表示CPU 余量或者飽和度
- vmstat指標(biāo)
- r:運(yùn)行隊(duì)列長(zhǎng)度——可運(yùn)行線程的總數(shù)
- us:用戶態(tài)時(shí)間。
- sy:系統(tǒng)態(tài)時(shí)間(內(nèi)核)。
- id:空閑
- wa:等待I/O,即線程被阻塞等待磁盤(pán)I/O 時(shí)的CPU 空閑時(shí)間
- st:偷取(未在輸出里顯示),CPU 在虛擬化的環(huán)境下在其他租戶上的開(kāi)銷
- mpstat指標(biāo)
- CPU:邏輯CPU ID,或者all 表示總結(jié)信息
- %usr:用戶態(tài)時(shí)間
- %nice:以nice 優(yōu)先級(jí)運(yùn)行的進(jìn)程用戶態(tài)時(shí)間
- %sys:系統(tǒng)態(tài)時(shí)間(內(nèi)核)
- %iowait:I/O 等待
- %irq:硬件中斷CPU 用量
- %soft:軟件中斷CPU 用量
- %steal:耗費(fèi)在服務(wù)其他租戶的時(shí)間
- %guest:花在訪客虛擬機(jī)的時(shí)間
- %idle:空閑。
內(nèi)存
概念和架構(gòu)
-
虛擬內(nèi)存:抽象概念,它向每個(gè)進(jìn)程和內(nèi)核提供巨大的、線性的并且私有的地址空間。支持多任務(wù)(虛擬地址空間被設(shè)計(jì)成分離的),并且可以超額訂購(gòu)(使用中的內(nèi)存可以超出主內(nèi)存的容量)
-
換頁(yè):
- 文件系統(tǒng)換頁(yè)(好的):讀寫(xiě)位于內(nèi)存中的映射文件頁(yè)引發(fā),內(nèi)存不足時(shí)可以回收的cache
- 匿名換頁(yè)(壞的):匿名換頁(yè)牽涉進(jìn)程的私有數(shù)據(jù):進(jìn)程堆和棧(匿名是由于它在操作系統(tǒng)中缺乏有名字的地址,例如,沒(méi)有文件系統(tǒng)路徑),要求遷移數(shù)據(jù)到物理交換設(shè)備或者交換文件
-
按需換頁(yè):將虛擬內(nèi)存按需映射到物理內(nèi)存,把CPU 創(chuàng)建映射的開(kāi)銷推遲到實(shí)際需要或訪問(wèn)時(shí),而不是在初次分配這部分內(nèi)存時(shí)
虛擬內(nèi)存和按需換頁(yè)的結(jié)果是任何虛擬內(nèi)存頁(yè)可能處于如下的一個(gè)狀態(tài):(如果因?yàn)橄到y(tǒng)內(nèi)存壓力而換出頁(yè)就會(huì)到達(dá)D 狀態(tài)。狀態(tài)B 到C 的轉(zhuǎn)變就是缺頁(yè)。如果需要磁盤(pán)讀寫(xiě),就是嚴(yán)重缺頁(yè),否則就是輕微缺頁(yè))
- A.未分配
- B.已分配,未映射(未填充并且未缺頁(yè))
- C.已分配,已映射到主存(RAM)
- D.已分配,已映射到物理交換空間(磁盤(pán))
云計(jì)算環(huán)境沒(méi)有交換區(qū),不鼓勵(lì)壞的換頁(yè)
其他相關(guān)概念
-
RSS(C)常駐內(nèi)存集,已經(jīng)分配的主存
-
虛擬內(nèi)存(B+C+D),所有已分配的區(qū)域
-
WSS 工作集,頻繁使用的主存大小
-
進(jìn)程交換(unix獨(dú)創(chuàng)):交換是在主存與物理交換設(shè)備或者交換文件之間移動(dòng)整個(gè)進(jìn)程,嚴(yán)重影響性能
-
文件系統(tǒng)緩存,系統(tǒng)啟動(dòng)之后內(nèi)存的占用增加是正常的,因?yàn)椴僮飨到y(tǒng)會(huì)將可用內(nèi)存用于文件系統(tǒng)緩存以提高性能。在應(yīng)用程序需要的時(shí)候,內(nèi)核應(yīng)該能夠很快從文件系統(tǒng)緩存中釋放內(nèi)存
-
飽和度:對(duì)內(nèi)存的需求超過(guò)了主存的情況被稱作主存飽和。這時(shí)操作系統(tǒng)會(huì)使用換頁(yè)、交換或者OOM killer來(lái)釋放內(nèi)存
-
內(nèi)存釋放:系統(tǒng)中的可用內(nèi)存過(guò)低時(shí),內(nèi)核有多種方法釋放內(nèi)存,并添加到頁(yè)空閑鏈表中(如果在未被重用前有對(duì)任一頁(yè)的請(qǐng)求,它能被取回并從空閑鏈表中移除)
- 回收大多是從內(nèi)核的slab 分配器緩存釋放內(nèi)存。這些緩存包含slab 大小的未使用內(nèi)存塊,以供重用?;厥諏⑦@些內(nèi)存交還給系統(tǒng)進(jìn)行分配
- 內(nèi)核頁(yè)面換出守護(hù)進(jìn)程(kswapd)管理利用換頁(yè)釋放內(nèi)存。當(dāng)主存中可用的空閑鏈表低于閾值時(shí),頁(yè)面換出守護(hù)進(jìn)程會(huì)開(kāi)始頁(yè)掃描。kswapd 先掃描非活動(dòng)列表,然后按需掃描活動(dòng)列表。術(shù)語(yǔ)掃描指遍歷列表檢查頁(yè)面:如果頁(yè)被鎖定或者是臟的,它可能不適合釋放
-
內(nèi)存分配:用戶態(tài)庫(kù)或者內(nèi)核程序向程序員提供簡(jiǎn)單的內(nèi)存使用接口。分配器可以利用包括線程級(jí)別對(duì)象緩存在內(nèi)的技術(shù)以提高性能
分配器包括,內(nèi)核級(jí)分配器——slab 分配器和SLUB——以及用戶級(jí)分配器——glibc,jemalloc和TCMalloc
glibc內(nèi)存管理那些事兒
常用工具
- 頁(yè)掃描:尋找連續(xù)的頁(yè)掃描(超過(guò)10 秒),它是內(nèi)存壓力的預(yù)兆。Linux 中,可以使用sar -B 并檢查pgscan 列。
- 壓力滯留信息(PSI):查看
/proc/pressure/memeory
檢查內(nèi)存壓力(飽和度) - 換頁(yè):換頁(yè)是系統(tǒng)內(nèi)存低的進(jìn)一步征兆。Linux 中,可以使用vmstat (8)并檢查si和so 列(這里,交換指匿名換頁(yè))。
- vmstat:每秒運(yùn)行vmstat 檢查free 列的可用內(nèi)存
- OOM 終結(jié)者:這些事件可以在系統(tǒng)日志/var/log/messages,或者從dmesg(1)中找到
- 交換:配置交換的情況下,用vmstat -S 并檢查si 和so
- top/prstat:查看哪些進(jìn)程和用戶是(常駐)物理內(nèi)存和虛擬內(nèi)存的最大使用者
- perf/bpftrace:通過(guò)棧追蹤內(nèi)存分配
具體分析方法
描述使用情況
- 系統(tǒng)范圍的物理和虛擬內(nèi)存使用率
- 飽和度:換頁(yè)、交換、OOM 終結(jié)者
- 內(nèi)核和文件系統(tǒng)緩存使用情況
- 每個(gè)進(jìn)程的物理和虛擬內(nèi)存使用情況
- 是否存在內(nèi)存資源控制
- 內(nèi)核內(nèi)存用于何處?每個(gè)slab 呢?
- 文件系統(tǒng)緩存(或者頁(yè)緩存)中不活躍與活躍的比例是多少?
- 進(jìn)程內(nèi)存用于何處?
- 進(jìn)程為何分配內(nèi)存(調(diào)用路徑)?
- 內(nèi)核為何分配內(nèi)存(調(diào)用路徑)?
- 哪些進(jìn)程被持續(xù)地頁(yè)面換出/交換出?
- 哪些進(jìn)程曾經(jīng)被頁(yè)面換出/交換出?
- 進(jìn)程或者內(nèi)核是否有內(nèi)存泄漏?
- NUMA 系統(tǒng)中,內(nèi)存是否被分配到合適的節(jié)點(diǎn)中去?
- CPI 和內(nèi)存停滯周期頻率是多少?
- 內(nèi)存總線的平衡性?
- 相對(duì)于遠(yuǎn)程內(nèi)存I/O,執(zhí)行了多少本地內(nèi)存I/O?
性能監(jiān)測(cè)
- 使用率
- 飽和度:交換,oom
內(nèi)存泄露
當(dāng)應(yīng)用程序或者內(nèi)核模塊無(wú)盡地增長(zhǎng),從空閑鏈表、文件系統(tǒng)緩存,最終從其他進(jìn)程消耗內(nèi)存時(shí),就出現(xiàn)了這個(gè)問(wèn)題
- 內(nèi)存泄漏:一種類型的軟件bug,忘記分配過(guò)的內(nèi)存而沒(méi)有釋放。通過(guò)修改軟件代碼,或應(yīng)用補(bǔ)丁及進(jìn)行升級(jí)(進(jìn)而修改代碼)能修復(fù)。
- 內(nèi)存增長(zhǎng):軟件在正常地消耗內(nèi)存,遠(yuǎn)高于系統(tǒng)允許的速率。通過(guò)修改軟件配置,或者由軟件開(kāi)發(fā)人員修改軟件內(nèi)存的消耗方式來(lái)進(jìn)行修復(fù)
靜態(tài)性能調(diào)優(yōu)
- 主存有多少?
- 配置允許應(yīng)用程序使用多少內(nèi)存(它們自己的配置)?
- 應(yīng)用程序使用哪個(gè)分配器?
- 主存的速度?是否是可用的最快的類型?
- 系統(tǒng)架構(gòu)是什么?NUMA、UMA?
- 操作系統(tǒng)支持NUMA 嗎?
- 有多少內(nèi)存總線?
- CPU 緩存的數(shù)量和大小是多少?TLB?
- 是否配置和使用了大頁(yè)面?
- 是否支持和配置了過(guò)度提交?
- 還使用了哪些其他的內(nèi)存可調(diào)參數(shù)?
- 是否有軟件強(qiáng)制的內(nèi)存限制(資源控制)
可調(diào)的內(nèi)核參數(shù)
文件系統(tǒng)
概念和架構(gòu)
文件系統(tǒng)性能比磁盤(pán)性能更為重要。文件系統(tǒng)通過(guò)緩存、緩沖以及異步I/O 等手段來(lái)緩和磁盤(pán)(或者遠(yuǎn)程系統(tǒng))的延時(shí)對(duì)應(yīng)用程序的影響
-
文件系統(tǒng)接口
-
文件系統(tǒng)緩存。讀操作從緩存返回(緩存命中)或者從磁盤(pán)返回(緩存未命中)。未命中的操作被存儲(chǔ)在緩存中,并填充緩存(熱身)。文件系統(tǒng)緩存可能也用來(lái)緩沖寫(xiě)操作,使之延時(shí)寫(xiě)入
-
文件系統(tǒng)延時(shí),一個(gè)文件系統(tǒng)邏輯請(qǐng)求從開(kāi)始到結(jié)束的時(shí)間。它包括了消耗在文件系統(tǒng)、內(nèi)核磁盤(pán)I/O 子系統(tǒng)以及等待磁盤(pán)設(shè)備——物理I/O 的時(shí)間
-
隨機(jī)與順序IO,一連串的文件系統(tǒng)邏輯I/O,按照每個(gè)I/O 的文件偏移量,可以分為隨機(jī)I/O 與順序I/O
文件系統(tǒng)一直以來(lái)在磁盤(pán)上順序和連續(xù)地存放文件數(shù)據(jù),以努力減小隨機(jī)I/O 的數(shù)目。當(dāng)文件系統(tǒng)未能達(dá)成這個(gè)目標(biāo)時(shí),文件的擺放變得雜亂無(wú)章,順序的邏輯I/O 被分解成隨機(jī)的物理I/O,這種情況我們稱為碎片化
-
預(yù)取,通過(guò)檢查當(dāng)前和上一個(gè)I/O 的文件偏移量,可以檢測(cè)出當(dāng)前是否是順序讀負(fù)載,并且做出預(yù)測(cè),在應(yīng)用程序請(qǐng)求前向磁盤(pán)發(fā)出讀命令,以填充文件系統(tǒng)緩存
-
回寫(xiě)緩存,當(dāng)數(shù)據(jù)寫(xiě)入主存后,就認(rèn)為寫(xiě)入已經(jīng)結(jié)束并返回,之后再異步地把數(shù)據(jù)刷入磁盤(pán)。文件系統(tǒng)寫(xiě)入“臟”數(shù)據(jù)的過(guò)程稱為刷新(flushing)。影響了數(shù)據(jù)的可靠性(斷電丟失),因此也會(huì)也提供一個(gè)同步寫(xiě)的選項(xiàng)繞過(guò)這個(gè)機(jī)制,把數(shù)據(jù)直接寫(xiě)在磁盤(pán)上
-
同步寫(xiě),同步寫(xiě)完成的標(biāo)志是,所有的數(shù)據(jù)以及必要的文件系統(tǒng)元數(shù)據(jù)被完整地寫(xiě)入到永久存儲(chǔ)介質(zhì)(如磁盤(pán)設(shè)備)中。由于包含了磁盤(pán)I/O 的延時(shí),所以肯定比異步寫(xiě)(寫(xiě)回緩存)慢得多
-
裸IO,繞過(guò)了整個(gè)文件系統(tǒng),直接發(fā)給磁盤(pán)地址。其缺點(diǎn)在于難以管理,即不能使用常用文件系統(tǒng)工具執(zhí)行備份/恢復(fù)和監(jiān)控
-
直接IO,允許應(yīng)用程序繞過(guò)緩存使用文件系統(tǒng)
-
非阻塞IO,如果需要等待,應(yīng)用程序線程會(huì)被阻塞并讓出CPU,在等待期間給其他線程執(zhí)行的機(jī)會(huì)
-
內(nèi)存映射文件,通過(guò)把文件映射到進(jìn)程地址空間,并直接存取內(nèi)存地址的方法來(lái)提高文件系統(tǒng)I/O 性能。這樣可以避免調(diào)用read()和write()存取文件數(shù)據(jù)時(shí)產(chǎn)生的系統(tǒng)調(diào)用和上下文切換開(kāi)銷。內(nèi)存映射通過(guò)系統(tǒng)調(diào)用mmap()創(chuàng)建,通過(guò)munmap()銷
Go Mmap 文件內(nèi)存映射簡(jiǎn)明教程
-
元數(shù)據(jù),數(shù)據(jù)對(duì)應(yīng)了文件和目錄的內(nèi)容,那元數(shù)據(jù)則對(duì)應(yīng)了有關(guān)它們的信息。元數(shù)據(jù)可能是通過(guò)文件系統(tǒng)接口(POSIX)讀出的信息,也可能是文件系統(tǒng)實(shí)現(xiàn)磁盤(pán)布局所需的信息。前者被稱為邏輯元數(shù)據(jù),后者被稱為物理元數(shù)據(jù)
-
邏輯和物理IO,與應(yīng)用程序I/O 相比,磁盤(pán)I/O 有時(shí)顯得無(wú)關(guān)、間接、放大或者縮小
文件系統(tǒng)的工作不僅僅是在永久存儲(chǔ)介質(zhì)(磁盤(pán))上提供一個(gè)基于文件的接口那么簡(jiǎn)單。它們緩存讀、緩沖寫(xiě),發(fā)起額外的I/O 維護(hù)磁盤(pán)上與物理布局相關(guān)的元數(shù)據(jù),這些元數(shù)據(jù)記錄了數(shù)據(jù)存儲(chǔ)的位置
- 無(wú)關(guān),以下因素可能造成磁盤(pán)I/O 與應(yīng)用程序無(wú)關(guān)。
- 其他應(yīng)用程序:磁盤(pán)I/O 來(lái)源于其他應(yīng)用程序。
- 其他租戶:磁盤(pán)I/O 來(lái)源于其他租戶(可在虛擬化技術(shù)的幫助下通過(guò)系統(tǒng)工具查看)。
- 其他內(nèi)核任務(wù):例如內(nèi)核在重建一個(gè)軟RAID 卷或者執(zhí)行異步文件系統(tǒng)校驗(yàn)驗(yàn)證時(shí)。
- 間接,以下因素可能造成應(yīng)用程序I/O 與磁盤(pán)I/O 之間沒(méi)有直接對(duì)應(yīng)關(guān)系。
- 文件系統(tǒng)預(yù)取:增加額外的I/O,這些I/O 應(yīng)用程序可能用得到,也可能用不到。
- 文件系統(tǒng)緩沖:通過(guò)寫(xiě)回緩存技術(shù)推遲和歸并寫(xiě)操作,之后再一并刷入磁盤(pán)。有些文件系統(tǒng)可能會(huì)緩沖數(shù)十秒后一起寫(xiě)入,造成偶爾的突發(fā)大I/O。
- 縮小,以下因素可能造成磁盤(pán)I/O 小于應(yīng)用程序I/O,甚至完全消失。
- 文件系統(tǒng)緩存:直接從主存返回,而非磁盤(pán)。
- 文件系統(tǒng)寫(xiě)抵消:在一次性寫(xiě)回到磁盤(pán)之前,同一個(gè)地址被修改了多次。
- 壓縮:減少了從邏輯I/O 到物理I/O 的數(shù)據(jù)量。
- 歸并:在向磁盤(pán)發(fā)I/O 前合并連續(xù)I/O。
- 內(nèi)存文件系統(tǒng):也許永遠(yuǎn)不需要寫(xiě)入到磁盤(pán)的內(nèi)容(如tmpfs)
- 放大
- 以下因素可能造成磁盤(pán)I/O 大于應(yīng)用程序I/O。
- 文件系統(tǒng)元數(shù)據(jù):增加了額外的I/O。
- 文件系統(tǒng)記錄尺寸:向上對(duì)齊的I/O 大小(增加了字節(jié)數(shù)),或者被打散的I/O(增加了I/O 數(shù)量)。
- 卷管理器奇偶校驗(yàn):讀-改-寫(xiě)的周期會(huì)增加額外的I/O。
- 無(wú)關(guān),以下因素可能造成磁盤(pán)I/O 與應(yīng)用程序無(wú)關(guān)。
-
特殊文件系統(tǒng),有些特殊的文件系統(tǒng)也有著其他用途,比如臨時(shí)文件(/tmp)、內(nèi)核設(shè)備路徑(/dev)和系統(tǒng)統(tǒng)計(jì)信息(/proc)
-
文件系統(tǒng)緩存
- 頁(yè)緩存,緩存了虛擬內(nèi)存的頁(yè)面,包括文件系統(tǒng)的頁(yè)面,提升了文件和目錄的性能。頁(yè)緩存大小是動(dòng)態(tài)的,它會(huì)不斷增長(zhǎng)消耗可用的內(nèi)存,并在應(yīng)用程序需要的時(shí)候釋放
- 目錄項(xiàng)緩存(Dcache)記錄了從目錄項(xiàng)(struct dentry)到VFS inode 的映射關(guān)系
- inode 緩存這個(gè)緩存的對(duì)象是VFS inode(struct inode),每個(gè)都描述了文件系統(tǒng)一個(gè)對(duì)象的屬性
-
文件系統(tǒng)類型:ext4,xfs,btrfs等
-
卷和池
具體分析方法
延時(shí)分析
操作延時(shí) = 時(shí)刻(完成操作)-時(shí)刻(發(fā)起操作)
負(fù)載特征歸納
- 操作頻率和操作類型
- 文件I/O 吞吐量
- 文件I/O 大小
- 讀寫(xiě)比例
- 同步寫(xiě)比例
- 文件隨機(jī)和連續(xù)訪問(wèn)比例
- 文件系統(tǒng)緩存命中率是多少?未命中率是多少?
- 文件系統(tǒng)緩存有多大?當(dāng)前使用情況如何?
- 現(xiàn)在還使用了其他什么緩存(目錄、inode、高速緩沖區(qū))和它們的使用情況?
- 哪個(gè)應(yīng)用程序或者用戶在使用文件系統(tǒng)?
- 哪些文件和目錄正在被訪問(wèn)?是創(chuàng)建和刪除嗎?
- 碰到了什么錯(cuò)誤嗎?是不是由于一些非法請(qǐng)求,或者文件系統(tǒng)自身的問(wèn)題?
- 為什么要發(fā)起文件系統(tǒng)I/O(用戶程序的調(diào)用路徑)?
- 應(yīng)用發(fā)起的文件系統(tǒng)I/O 中同步的比例占到多少?
- I/O 抵達(dá)時(shí)間的分布是怎樣的?
性能監(jiān)控
- 操作頻率,操作頻率是負(fù)載的最基本特征
- 操作延時(shí),延時(shí)是好是差,取決于負(fù)載、環(huán)境和延時(shí)需求
事件追蹤
事件跟蹤捕獲文件系統(tǒng)每個(gè)操作的細(xì)節(jié)
- 文件系統(tǒng)類型。
- 文件系統(tǒng)掛載點(diǎn)。
- 操作類型:讀取、寫(xiě)入、統(tǒng)計(jì)、打開(kāi)、關(guān)閉、建目錄,等等。
- 操作大小(如果適用):字節(jié)數(shù)。
- 操作開(kāi)始時(shí)間戳:向文件系統(tǒng)發(fā)起操作的時(shí)間。
- 操作結(jié)束時(shí)間戳:文件系統(tǒng)完成操作的時(shí)間。
- 操作完成狀態(tài):錯(cuò)誤。
- 路徑名(如果適用)。
- 進(jìn)程ID。
- 應(yīng)用程序名。
靜態(tài)性能調(diào)優(yōu)
- 當(dāng)前掛載并使用了多少個(gè)文件系統(tǒng)?
- 文件系統(tǒng)記錄大小?
- 啟用了訪問(wèn)時(shí)間戳嗎?
- 還啟用了哪些文件系統(tǒng)選項(xiàng)(壓縮、加密等)?
- 文件系統(tǒng)緩存是怎么配置的?最大緩存大小是多少?
- 其他緩存(目錄、inode、高速緩沖區(qū))是怎么配置的?
- 有二級(jí)緩存嗎?用了嗎?
- 有多少個(gè)存儲(chǔ)設(shè)備?用了幾個(gè)?
- 存儲(chǔ)設(shè)備是怎么配置的?用了RAID 嗎?
- 用了哪種文件系統(tǒng)?
- 用了哪個(gè)文件系統(tǒng)的版本(或者內(nèi)核)?
- 有什么需要考慮的文件系統(tǒng)bug/補(bǔ)丁?
- 啟用文件系統(tǒng)I/O 的資源控制了嗎?
微基準(zhǔn)測(cè)試的參數(shù)
- 操作類型:讀、寫(xiě)和其他文件系統(tǒng)操作的頻率。
- I/O 大小:從1B 到1MB 甚至更大。
- 文件偏移量模式:隨機(jī)或者連續(xù)。
- 隨機(jī)訪問(wèn)模式:統(tǒng)一的隨機(jī)分布或者帕累托分布。
- 寫(xiě)類型:異步或同步(O_SYNC)。
- 工作集大小:文件系統(tǒng)緩存是否放得下。
- 并發(fā):同時(shí)執(zhí)行的I/O 數(shù),或者執(zhí)行I/O 的線程數(shù)。
- 內(nèi)存映射:文件通過(guò)mmap()訪問(wèn)而非read()/write()。
- 緩存狀態(tài):文件系統(tǒng)緩存是“冷的”(未填充)還是“熱的”。
- 文件系統(tǒng)可調(diào)參數(shù):可能包括了壓縮、數(shù)據(jù)消重等。
磁盤(pán)
在高負(fù)載下,磁盤(pán)成為了瓶頸,CPU 持續(xù)空閑以等待磁盤(pán)I/O 結(jié)束
概念和架構(gòu)
-
緩存磁盤(pán)和磁盤(pán)控制器
-
磁盤(pán)響應(yīng)時(shí)間,也叫磁盤(pán)I/O 延時(shí),指的是從I/O 請(qǐng)求到結(jié)束的時(shí)間。它由服務(wù)和等待時(shí)間組成
- 服務(wù)時(shí)間:I/O 得到主動(dòng)處理(服務(wù))的時(shí)間,不包括在隊(duì)列中等待的時(shí)間。
- 等待時(shí)間:I/O 在隊(duì)列中等待服務(wù)的時(shí)間
響應(yīng)時(shí)間、服務(wù)時(shí)間和等待時(shí)間全部取決于測(cè)量所處的位置
- 對(duì)內(nèi)核的角度
- 塊io等待時(shí)間,塊IO創(chuàng)建到插入內(nèi)核IO隊(duì)列到離開(kāi)內(nèi)核IO隊(duì)列并發(fā)送到設(shè)備的事件
- 塊io服務(wù)事件,發(fā)出請(qǐng)求到設(shè)備完成中斷之間的時(shí)間
- 對(duì)磁盤(pán)的角度
- 磁盤(pán)等待時(shí)間,話再磁盤(pán)隊(duì)列上的時(shí)間
- 磁盤(pán)服務(wù)時(shí)間,進(jìn)入磁盤(pán)隊(duì)列后IO被主動(dòng)處理的時(shí)間
-
磁盤(pán)IO延時(shí)的時(shí)間尺度
-
緩存,最好的磁盤(pán)IO就是沒(méi)有IO,通過(guò)緩存讀和緩沖寫(xiě)來(lái)避免磁盤(pán)I/O 抵達(dá)磁盤(pán)
-
連續(xù)IO和隨機(jī)IO,讀和寫(xiě),IO大小
-
非磁盤(pán)傳輸命令,將緩存協(xié)會(huì)磁盤(pán)
-
使用率
-
飽和度
-
IO等待,針對(duì)單個(gè)CPU 的性能指標(biāo),表示當(dāng)CPU 分發(fā)隊(duì)列(在睡眠態(tài))里有線程被阻塞在磁盤(pán)I/O 上時(shí)消耗的空閑時(shí)間。較高的每CPU I/O 等待時(shí)間表示磁盤(pán)可能是瓶頸所在,導(dǎo)致CPU 等待而空閑
-
磁盤(pán)IO和應(yīng)用程序IO,磁盤(pán)I/O 是多個(gè)內(nèi)核組件的終點(diǎn),包括文件系統(tǒng)和設(shè)備驅(qū)動(dòng)。磁盤(pán)I/O 與應(yīng)用程序發(fā)出的I/O 在頻率和大小上都不匹配??赡茉?/p>
- 文件系統(tǒng)放大、縮小和不相關(guān)的I/O。
- 由于系統(tǒng)內(nèi)存短缺造成的換頁(yè)。
- 設(shè)備驅(qū)動(dòng)I/O 大小:I/O 大小的向上取整,或者I/O 的碎片化
具體分析方法
常用工具
- iostat:使用擴(kuò)展模式尋找繁忙磁盤(pán)(超過(guò)60%使用率),較高的平均服務(wù)時(shí)間(超過(guò)大概10ms),以及高IOPS(可能)
- iotop:發(fā)現(xiàn)哪個(gè)進(jìn)程引發(fā)了磁盤(pán)I/O。
- bitlatency,直方圖檢查IO延時(shí)分布
- biosnoop,檢查單個(gè)IO
- bpftrace,發(fā)出IO的用戶和內(nèi)核棧
負(fù)載特征歸納
- I/O 頻率
- I/O 吞吐量
- I/O 大小
- 隨機(jī)和連續(xù)比例
- 讀寫(xiě)比
- 系統(tǒng)IOPS 是多少?每個(gè)磁盤(pán)呢?每個(gè)控制器呢?
- 系統(tǒng)吞吐量是多少?每個(gè)磁盤(pán)呢?每個(gè)控制器呢?
- 哪個(gè)應(yīng)用程序或者用戶正在使用磁盤(pán)?
- 哪個(gè)文件系統(tǒng)或者文件正在被訪問(wèn)?
- 碰到什么錯(cuò)誤了嗎?這些錯(cuò)誤是源于非法請(qǐng)求,還是磁盤(pán)的問(wèn)題?
- I/O 在可用磁盤(pán)之間均衡嗎?
- 每條參與的傳輸總線上的IOPS 是多少?
- 每條參與的傳輸總線上的吞吐量是多少?
- 發(fā)出了哪些非數(shù)據(jù)傳輸磁盤(pán)命令?
- 為什么會(huì)發(fā)起磁盤(pán)I/O(內(nèi)核調(diào)用路徑)?
- 磁盤(pán)I/O 里應(yīng)用程序同步的調(diào)用占到多少?
- I/O 到達(dá)時(shí)間的分布是什么樣的?
性能特征歸納
- 每塊盤(pán)有多忙(使用率)?
- 每塊盤(pán)的I/O 飽和度是多少(等待隊(duì)列)?
- 平均I/O 服務(wù)時(shí)間是多少?
- 平均I/O 等待時(shí)間是多少?
- 是否存在高延時(shí)的I/O 離群點(diǎn)?
- I/O 延時(shí)的全分布是什么樣的?
- 是否有例如I/O 流控的系統(tǒng)資源控制,存在并且激活了嗎?
- 非數(shù)據(jù)傳輸磁盤(pán)命令的延時(shí)是多少?
延時(shí)分析
發(fā)起I/O 請(qǐng)求和完成中斷之間的時(shí)間。如果這個(gè)時(shí)間與應(yīng)用程序感受到的I/O 延時(shí)一致,通??梢园踩赝茢喑鯥/O 延時(shí)源于磁盤(pán)
例如,B 的延時(shí)看上去來(lái)自文件系統(tǒng)層(鎖或者隊(duì)列?),因?yàn)榈讓拥腎/O 延時(shí)只占了較小的部分
事件跟蹤
- 磁盤(pán)設(shè)備ID。
- I/O 類型:讀或?qū)憽?/li>
- I/O 偏移量:磁盤(pán)位置。
- I/O 大小:字節(jié)數(shù)。
- I/O 請(qǐng)求時(shí)間戳:I/O 發(fā)到設(shè)備的時(shí)間(也稱為I/O 策略)。
- I/O 完成時(shí)間戳:I/O 事件完成的時(shí)間(完成中斷)。
- I/O 完成狀態(tài):錯(cuò)誤。
網(wǎng)絡(luò)
除了改進(jìn)網(wǎng)絡(luò)延時(shí)和吞吐量以外,另一個(gè)常見(jiàn)的任務(wù)是消除可能由丟包引起的延時(shí)異常
網(wǎng)絡(luò)分析是跨硬件和軟件的。這里的硬件指的是物理網(wǎng)絡(luò),包括網(wǎng)絡(luò)接口卡、交換機(jī),路由器和網(wǎng)關(guān)(這通常也含有軟件)。這里的系統(tǒng)軟件指的是內(nèi)核協(xié)議棧,通常是TCP/IP,以及每個(gè)所涉及的協(xié)議的行為
網(wǎng)絡(luò)工程師解惑篇,推薦這個(gè)可以在空閑充電的音頻,理解基本的網(wǎng)絡(luò)協(xié)議和架構(gòu)
概念和架構(gòu)
-
網(wǎng)絡(luò)接口和控制器,網(wǎng)絡(luò)接口卡(NIC)給系統(tǒng)提供一個(gè)或多個(gè)網(wǎng)絡(luò)端口并且設(shè)有一個(gè)網(wǎng)絡(luò)控制器,一個(gè)在端口與系統(tǒng)I/O 傳輸通道間傳輸包的微處理器
-
協(xié)議棧,不同的IP 協(xié)議版本IPv4 和IPv6,可能會(huì)由不同的內(nèi)核代碼路徑處理,進(jìn)而表現(xiàn)出不同的性能特性
-
路由,路由管理稱為包的報(bào)文跨網(wǎng)絡(luò)傳遞
-
單播和多播,成對(duì)主機(jī)間由單播(unicast)傳輸連接。多播(multicast)傳輸允許一個(gè)發(fā)送者可能跨越多個(gè)網(wǎng)絡(luò)同時(shí)傳輸給多個(gè)目標(biāo)。它的傳遞依賴于路由器配置的支持
-
包長(zhǎng)度,包的長(zhǎng)度通常受限于網(wǎng)絡(luò)接口的最大傳輸單元(MTU)長(zhǎng)度。巨型幀(9000B)夠提高網(wǎng)絡(luò)吞吐性能
-
延時(shí),包括主機(jī)名解析延時(shí)、ping 延時(shí)、連接延時(shí)、首字節(jié)延時(shí)、往返時(shí)間,以及連接生命周期
- ping延時(shí),ICMP echo 請(qǐng)求到echo 響應(yīng)所需的時(shí)間,衡量主機(jī)對(duì)之間包括網(wǎng)絡(luò)跳躍的網(wǎng)絡(luò)延時(shí),而且它測(cè)量的是包往返的總時(shí)間
- 連接延時(shí),是傳輸任何數(shù)據(jù)前建立網(wǎng)絡(luò)連接所需的時(shí)間
- 首字節(jié)延時(shí),是從連接建立到接收到第一個(gè)字節(jié)數(shù)據(jù)所需的時(shí)間。這包括遠(yuǎn)程主機(jī)接受連接、調(diào)度提供服務(wù)的線程,并且執(zhí)行線程以及發(fā)送第一個(gè)字節(jié)所需的時(shí)間
- 往返時(shí)間,指網(wǎng)絡(luò)包往返兩個(gè)端點(diǎn)所需的時(shí)間
- 連接生命周期,指一個(gè)網(wǎng)絡(luò)連接從建立到關(guān)閉所需的時(shí)間
-
緩沖,TCP 利用緩沖以及可變的發(fā)送窗口提升吞吐量。網(wǎng)絡(luò)套接字也保有緩沖,并且應(yīng)用程序可能也會(huì)利用它們自己的緩沖在發(fā)送前聚集數(shù)據(jù)。外部的網(wǎng)絡(luò)組件,如交換機(jī)和路由器,也會(huì)利用緩沖提高它們的吞吐量
-
接口協(xié)商,通過(guò)與對(duì)端自動(dòng)協(xié)商,網(wǎng)絡(luò)接口能夠工作于不同的模式,包括帶寬和雙工模式
谷歌開(kāi)源、高性能RPC框架:gRPC 使用體驗(yàn)
-
協(xié)議,TCP和UPD協(xié)議的特性
-
硬件,包括接口,控制器,路由器和交換機(jī)
-
軟件,內(nèi)核協(xié)議棧
現(xiàn)代內(nèi)核中網(wǎng)絡(luò)棧是多線程的,并且傳入的包能被多個(gè)CPU 處理。傳入的包與CPU 的映射可用多個(gè)方法完成:可能基于源IP 地址哈希以平均分布負(fù)載,或者基于最近處理的CPU 以有效利用CPU 緩存熱度以及內(nèi)存本地性
TCP、IP 以及通用網(wǎng)絡(luò)驅(qū)動(dòng)軟件是內(nèi)核的核心組件,而設(shè)備驅(qū)動(dòng)程序是附加模塊。數(shù)據(jù)包以struct sk_buff 數(shù)據(jù)類型穿過(guò)這些內(nèi)核組件
-
TCP積壓隊(duì)列,突發(fā)的連接由積壓隊(duì)列處理。這里有兩個(gè)此類隊(duì)列,一個(gè)在TCP 握手完成(也稱為SYN積壓隊(duì)列)前處理未完成的連接,而另一個(gè)處理等待應(yīng)用程序接收(也稱為偵聽(tīng)積壓隊(duì)列)的已建立的會(huì)話
-
TCP緩沖區(qū),發(fā)送和接受緩沖區(qū)的大小是可調(diào)的,但需要消耗更多主存,大緩沖能夠提升吞吐量
網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)接受的數(shù)據(jù)包大小最大到MSS最大段大小,可能小到1500字節(jié)
-
網(wǎng)卡的發(fā)送和接收,發(fā)送數(shù)據(jù)包網(wǎng)卡收到通知,并使用DMA從內(nèi)核內(nèi)存中讀取幀提高效率。收到的數(shù)據(jù)包使用DMA放入內(nèi)核環(huán)形緩沖區(qū)中,并中斷通知內(nèi)核
具體分析方法
常用工具
- netstat -s:查找高流量的重新傳輸和亂序數(shù)據(jù)包。哪些是“高”重新傳輸率依客戶機(jī)而不同,面向互聯(lián)網(wǎng)的系統(tǒng)因具有不穩(wěn)定的遠(yuǎn)程客戶會(huì)比僅擁有同數(shù)據(jù)中心客戶的內(nèi)部系統(tǒng)具有更高的重新傳輸率。
- ip -s link/netstat -i:檢查接口的錯(cuò)誤計(jì)數(shù)器,檢查“錯(cuò)誤”、“丟棄”、“超限”
- ss -tiepm,檢查重要套接字的限制其標(biāo)志
- ip -s link/nicstat,檢查傳輸和接受字節(jié)的速率
- tcplife,記錄tcp會(huì)話的進(jìn)程細(xì)節(jié)
- tcptop,實(shí)時(shí)觀測(cè)速率最高的tcp會(huì)話
- tcpdump,抓包
- dtrace/stap/perf:用來(lái)檢查包括內(nèi)核狀態(tài)在內(nèi)的應(yīng)用程序與線路間選中的數(shù)據(jù)
USE方法
- 使用率:接口忙于發(fā)送或接收幀的時(shí)間。
- 飽和度:由于接口滿負(fù)載,額外的隊(duì)列、緩沖或者阻塞的程度。
- 錯(cuò)誤:對(duì)于接收,校驗(yàn)錯(cuò)誤、幀過(guò)短(小于數(shù)據(jù)鏈路報(bào)文頭)或者過(guò)長(zhǎng)、沖突(在交換網(wǎng)絡(luò)中不大可能);對(duì)于傳輸,延時(shí)碰撞(線路故障)
負(fù)載特征歸納
- 網(wǎng)絡(luò)接口吞吐量:RX 和TX,B/s。
- 網(wǎng)絡(luò)接口IOPS:RX 和TX,幀每秒。
- TCP 連接率:主動(dòng)和被動(dòng),每秒連接數(shù)。
- 平均數(shù)據(jù)包的大小是多少?RX、TX?
- 協(xié)議是什么?TCP 還是UDP?
- 活躍的TCP/UDP 端口是多少?B/s、每秒連接數(shù)?
- 哪個(gè)進(jìn)程在主動(dòng)地使用網(wǎng)絡(luò)?
延時(shí)分析
延時(shí) | 描述 |
---|---|
主機(jī)名解析 | |
ping延時(shí) | |
tcp連接初始化延時(shí) | |
tcp首字節(jié)延時(shí) | |
tcp重傳輸 | |
tcp TIME_WAIT延時(shí) | |
連接會(huì)話延時(shí) | |
系統(tǒng)調(diào)用發(fā)送/接收延時(shí) | |
系統(tǒng)調(diào)用連接延時(shí) | |
網(wǎng)絡(luò)往返延時(shí) | |
中斷延時(shí) | |
棧間延時(shí) | 數(shù)據(jù)包在內(nèi)核棧種移動(dòng)的時(shí)間 |
靜態(tài)性能調(diào)優(yōu)
- 有多少網(wǎng)絡(luò)接口可供使用?當(dāng)前使用中的有哪些?
- 網(wǎng)絡(luò)接口的最大速度是多少?
- 當(dāng)前協(xié)商的網(wǎng)絡(luò)接口速度是多少?
- 網(wǎng)絡(luò)接口協(xié)商為半雙工還是全雙工?
- 網(wǎng)絡(luò)接口配置的MTU 是多少?
- 網(wǎng)絡(luò)接口是否使用了鏈路聚合?(多個(gè)網(wǎng)卡提升帶寬)
- 有哪些適用于設(shè)備驅(qū)動(dòng)的可調(diào)參數(shù)?IP 層?TCP 層?
- 有哪些可調(diào)參數(shù)已不再是默認(rèn)值?
- 路由是如何配置的?默認(rèn)路由是什么?
- 數(shù)據(jù)路徑中網(wǎng)絡(luò)組件的最大吞吐量是多少(所有組件,包括交換機(jī)和路由器背板)?
- 數(shù)據(jù)轉(zhuǎn)發(fā)是否啟用?該系統(tǒng)是否作為路由器使用?
- DNS 是如何設(shè)置的?它距離服務(wù)器有多遠(yuǎn)?
- 該版本的網(wǎng)絡(luò)接口固件是否有已知的性能問(wèn)題(bug)?
- 該網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)是否有已知的性能問(wèn)題(bug)?內(nèi)核TCP/IP 棧呢?
- 是否存在軟件施加的網(wǎng)絡(luò)吞吐量限制(資源控制)?它們是什么?