引言
綜合來講,這是一本介紹方法論的書,作者通過概念、模型、觀測、實驗手段來進行問題的剖析。另外本書的涉及範圍之廣,從記憶體、CPU、檔案系統、存儲硬體、網絡等各個方面。并且本書通常以一個執行個體入手,深入的介紹系統原理,特别是在一些重點細節上,往往有超出一般的認識和方法。
本書函蓋範圍太廣,更适合作為工具書時常翻閱,是以在閱讀過程中也關注自己目前需要的方面。
第一章 緒論
系統性能是對整個系統的研究,包括了所有的硬體元件和整個軟體棧。所有資料路徑上和軟硬體上所發生的事情都包括在内,因為這些都有可能影響性能。
1、通用系統軟體棧

2、性能的事情清單
性能領域包括了以下的事情:
- 設定性能目标和建立性能模型
- 基于軟體或硬體原型進行性能特征歸納
- 對開發代碼進行性能分析(軟體整合之前)
- 執行軟體非回歸性測試(軟體釋出前或釋出後)
- 針對軟體釋出版本的基準測試
- 目标環境中的概念驗證測試
- 生産環境部署的配置優化
- 監控生産環境中運作的軟體
- 特定問題的性能分析
3、兩種性能分析視覺:資源分析和負載分析
術語容量規劃 (
capacity planning
) 指的是一系列事前行動。在設計階段,包括通過研究開發軟體的資源占用情況,來得知原有設計在多大程度上能滿足目标需求。在部署後,包括監控資源的使用情況,這樣問題在出現之前就能被預測。
- 資源分析名額:IOPS,吞吐量,使用率,飽和度
- 工作負載名額:吞吐量和延時。
性能分析必須量化問題的重要程度,有一個名額非常合适,就是延時(latency)。
動态跟蹤技術把所有的軟體變得可以監控,而且能用在真實的生産環境中。這項技術利用記憶體中的 CPU 指令并在這些指令之上動态建構檢測資料。這樣能從任何運作的軟體中都可以獲得定制話的性能統計資料,進而提供了遠超系統的自帶統計所能給予的觀測性。
DTrace 對使用者态和核心态的軟體都提供了靜态跟蹤和動态跟蹤,并且資料是實時産生的
4、受測系統
擾動(perturbation)是會影響結果的,擾動包括定時執行的系統活動、系統的其他使用者以及其他的工作負載。現代環境的另一個困難是系統很可能由若幹個網絡化的元件組成,都用于處理輸入工作負載,包括負載平衡、Web 伺服器、資料庫伺服器、應用程式伺服器,以及存儲系統。
5、排隊系統
6、排隊理論以及使用率響應時間關系
7、方法
在取得資料之前就把事情理論化是一個嚴重的錯誤。不理智的人扭曲事實來适應理論,而不是改變理論來适應事實。
面對一個性能不佳且複雜的系統環境時,首先需要知道的挑戰就是從什麼地方開始分析、收集什麼樣的資料,以及如何分析這些資料。
7.1、通用的性能分析方法
- 街燈訛方法(奇葩的命名)
- 在熟悉的工具或流程中試錯,比較盲目
- Ad Hoc核對清單法
- 保證所有人知道如何檢查最糟糕的問題,覆寫全面,但必須保持清單及時更新
- 診斷循環
- 假設--儀器檢驗--資料--假設
- USE方法
- 本書重點方法,對于所有資源,檢視它的使用率、飽和度、錯誤
第三章 作業系統
了解作業系統和它的核心對于系統性能分析是至關重要的。你會經常需要進行針對系統行為的開發和測試,如系統調用是如何執行的、CPU 是如何排程線程的、有限大小的記憶體是如何影響性能的,或者是檔案系統是如何處理 I/O 的。
這部分的内容本書主要介紹了基本的概念,最好還是結合《深入了解計算機系統》來弄懂,不然真的很容易一知半解,列舉如下:
- 核心:核心執行、時鐘、核心态
- 棧:使用者棧和核心棧
- 中斷和中斷線程
- 中斷優先級
- 程序:程序建立、程序生命周期、程序環境
- 系統調用
- 虛拟記憶體
- 記憶體管理
- 排程器
- 檔案系統:VFS、I/O 棧
- 緩存(括号内為例子):應用程式緩存、伺服器緩存(Apache 緩存)、緩存伺服器(Redis)、資料庫緩存(MySQL 緩沖區高速緩存)、目錄緩存(DNLC)、檔案中繼資料緩存(inode 緩存)、作業系統緩沖區高速緩存(segvn)、檔案系統主緩存(ZFS ARC)、檔案系統次緩存(ZFS L2ARC)、裝置緩存(ZFS vdev)、塊緩存(緩沖區高速緩存)、磁盤控制器緩存(RAID 卡緩存)、存儲陣列緩存、磁盤内置緩存
- 網絡
- 裝置驅動
- 多處理器:CPU 交叉調用
- 搶占
- 資源管理
- 觀測性
第四章 觀測工具
性能觀測工具可以按照系統級别和程序級别來分類,多數的工具要麼基于計數器要麼基于跟蹤:
1、計數器
核心維護了各種統計資料,稱為計數器,用于對事件計數。通常計數器實作為無符号的整型數,發生事件時遞增。
系統級别的計數器有:
- vmstat: 虛拟記憶體和實體記憶體的統計,系統級别
- mpstat: 每個 CPU 的使用情況
- iostat: 每個磁盤 I/O 的使用情況,由塊裝置接口報告
- netstat: 網絡接口的統計,TCP/IP 棧的統計,以及每個連接配接的一些統計資訊
- sar: 各種各樣的統計,能歸檔曆史資料
程序級别:
- ps: 程序狀态,顯示程序的各種統計資訊,包括記憶體和 CPU 的使用
- top: 按一個統計資料排序,顯示排名高的程序
- pmap: 将程序的記憶體段和使用統計一起列出
一般來說,上述這些工具是從
/proc
檔案系統裡讀取統計資訊的
2、跟蹤
跟蹤收集每一個事件的資料以供分析。跟蹤架構一般預設是不啟用的,因為跟蹤捕獲資料會有 CPU 開銷,另外還需要不小的存儲空間來存放資料。
系統級别:
- tcpdump: 網絡包跟蹤(libpcap lib)
- blktrace: 塊 I/O 跟蹤
- DTrace: 跟蹤核心的内部活動和所有資源的使用情況,支援靜态和動态的跟蹤
- SystemTap: 同上
- perf: Linux 性能事件,跟蹤靜态和動态的指針
- strace: 系統調用跟蹤
- gbd: 源碼級别的調試器
第五章 應用程式
性能調整離工作所執行的地方越近越好:最好在應用程式裡,包括 Web 伺服器、應用伺服器、負載均衡器、檔案伺服器,等等。
設立性能目标能為你的性能分析工作指明方向,并幫助你選擇要做的事情。沒有清晰的目标,性能分析容易淪為随機的『釣魚探險』。
常見目标:
- 延時
- 吞吐量
- 資源使用率
應用程式性能技術:選擇 I/O 尺寸、緩存、緩沖區、輪訓(epoll)、并發和并行、非阻塞 I/O、處理器綁定
程式設計語言相關:編譯語言使用編譯器優化、解釋語言一般不是首選、虛拟機、垃圾回收
第六章 CPU - 第九章 磁盤
1、CPU分析工具
2、記憶體分析工具
3、檔案系統分析工具
4、磁盤分析工具
5、CPU調優
- 多少CPU可用?是核嗎?是硬體線程?
- CPU 架構是單還是多處理器?
- CPU 緩存大小是多少?共享?
- CPU 時鐘頻率是多少?是動态?甚于BIOS?
- CPU 有其它特性?
- CPU 勘誤表上有硬體上的bug?
- BIOS 版本有bug?
- CPU 使用軟體限制?
6、記憶體調優
- 主存有多少?
- 配置允許應用程式使用的記憶體大小?
- 使用哪個配置設定器?
- 主存速度?
- 系統架構?NUMA? UMA?
NUMA 共享存儲器實體上是分布在所有處理機的本地存儲器上
UMA 均勻存儲器存取
- 記憶體總線大小?
- 是否配置使用了大頁面?
- 是否支援和配置過度送出?
- 使用了哪些記憶體可調參數?
- 軟體強制記憶體限制?
7、檔案系統調優
- 目前挂載并使用的檔案系統數量?
- 檔案系統記錄大小?
- 啟用了通路時間戳?
- 是否有其它參數(壓縮?加密?)
- 緩存大小?二級緩存?
- 儲存設備數量?何配置?RAID?
- 哪種檔案系統?版本?
- 啟用I/O控制?
8、磁盤調優
- 盤數量?類型?
- 磁盤固件版本?
- 多少個磁盤控制器?版本?接口類型?
- 是否為調速插槽?
- 配置了RAID?
- 是否啟用多路徑?
- 磁盤裝置驅動?
第十章 網絡
網絡通信是由一組協定棧組成的,其中的每一層實作一個特定的目标:
一些網絡通信和網絡性能相關概念:網絡和路由、協定、封裝、包長度、延時(主機名解析延時、ping 延時、連接配接延時、首位元組延時、往返時間、連接配接生命周期)、緩沖、連接配接積壓隊列、接口協商、使用率、本地連接配接。
對于日常監測來說,最常用的還是各種工具,如:
- netstat -s: 查找高流量的重新傳輸和亂序資料包
- netstat -i: 檢查接口的錯誤計數器
- ifconfig: 檢查『錯誤』『丢棄』和『超限』
- ip(8): 檢查傳輸和接收的位元組率
- tcpdump/snoop: 盡管需要大量的 CPU 開銷,短期使用可能就足以發現誰在使用網絡并且定位可以消除的不必要操作
- dtrace/stap/perf: 用來檢查包括核心狀态在内的應用程式與線路間選中的資料
第十一章 雲計算 - 第十二章 基準測試
這兩章主要介紹相關底層概念,很多時候隻是作為選擇雲服務提供商的依據(畢竟不能自己開發),暫略。
1、術語
1.1、方法
- IOPS: 每秒發生的輸入/輸出操作的次數,是資料傳輸的一個度量方法。對于磁盤的讀寫,IOPS 指的是每秒讀和寫的次數
- 吞吐量: 評價工作執行的速率,尤其是在資料傳輸方面,這個術語用于描述資料傳輸速度。在某些情況下(如資料庫),吞吐量指的是操作的速度(每秒操作數或每秒業務數)
- 響應事件: 一次操作完成的事件。包括用于等待和服務的事件,也包括用來傳回結果的時間
- 延時: 描述操作裡用來等待服務的事件。在某些情況下,它可以指的是整個操作時間,等同于響應時間
- 使用率: 對于服務所請求的資源,使用率描述在所給定的時間區間内資源的繁忙成都。對于存儲資源來說,使用率指的就是所消耗的存儲容量(例如,記憶體使用率)
- 飽和度: 指的是某一資源無法滿足服務的排隊工作量
- 瓶頸: 在系統性能力,瓶頸指的是限制系統性能的那個資源。分辨和移除系統瓶頸是系統性能的一項重要工作
- 工作負載: 系統的輸入或者是對系統所施加的負載叫做工作負載。對于資料庫來說,工作負載就是用戶端發出的資料庫請求和指令
- 緩存: 用于複制或者緩沖一定量資料的高速存儲區域,目的是為了避免對較慢的存儲層級的直接通路,進而提高性能。
1.2、作業系統
- 作業系統: 這裡指的是安裝在系統上的軟體和檔案,使得系統可以啟動和運作程式。作業系統包括核心、管理工具,以及系統庫
- 核心: 核心是管理系統的程式,包括裝置(硬體)、記憶體和 CPU 排程。它運作在 CPU 的特權模式,允許直接通路硬體,稱為核心态
- 程序: 是一個作業系統的抽象概念,是用來執行程式的環境。程式通常運作在使用者模式,通過系統調用或陷阱來進入核心模式
- 線程: 可被排程的運作在 CPU 上的可執行上下文。核心有多個線程,一個程序有一個或多個線程
- 任務: 一個 Linux 的可運作實體,可以指一個程序(含有單個線程),或一個多線程的程序裡的一個線程,或者核心線程
- 核心空間: 核心的記憶體位址空間
- 使用者空間: 程序的記憶體位址空間
- 上下文切換: 核心程式切換 CPU 讓其在不同的位址空間上做操作
- 系統調用: 一套定義明确的協定,為使用者程式請求核心執行特權操作,包括裝置 I/O
- 陷阱: 信号發送到核心,請求執行一段系統程式(特權操作)。陷阱類型包括系統調用、處理器異常以及中斷
- 中斷: 由實體裝置發送給核心的信号,通常是請求 I/O 服務
2、USE 法 Linux 檢查清單
2.1、軟體資源
小結
本書作者是著名的性能大師,他有一篇60秒分析性能的文章,其中有一個著名的性能checklist如下: