预购商品
书目分类
特别推荐
本書不僅介紹了如何測量CPU、記憶體、磁片/SSD、網路的性能,如何觀察、記錄、跟蹤、匯總性能指標,還討論了如何設計和創建性能測試工具KUtrace,以及如何對觀察結果進行推理。 本書不僅適合軟體發展人員閱讀,還適合電腦相關專業的師生參考。
第一部分 測量 第1章 我的程式太慢了 3 1.1 資料中心環境 3 1.2 資料中心的硬體 5 1.3 資料中心的軟體 6 1.4 長尾時延 7 1.5 思維框架 9 1.6 數量級估測 9 1.7 為什麼事務很慢 10 1.8 5種基本資源 11 1.9 小結 12 第2章 測量CPU時間 13 2.1 發展歷史 14 2.2 現狀 17 2.3 測量add指令的時延 18 2.4 直線代碼失敗 19 2.5 簡單迴圈、迴圈開銷失敗、優化編譯器失敗 19 2.6 死變數失敗 22 2.7 更好的迴圈 23 2.8 依賴變數 24 2.9 實際執行時延 25 2.10 更多細微差別 25 2.11 小結 26 習題 26 第3章 測量記憶體層次 28 3.1 記憶體計時 28 3.2 關於記憶體 29 3.3 緩存組織 30 3.4 數據對齊 32 3.5 頁表緩存組織 33 3.6 測量記憶體的步驟 34 3.7 測量緩存行的大小 34 3.8 問題:預取第N+1行 36 3.9 依賴載入 37 3.10 非隨機的DRAM 38 3.11 測量每個緩存級別的總大小 39 3.12 測量每個級別的緩存相聯度 41 3.13 頁表緩存時間 42 3.14 緩存利用不足 42 3.15 小結 42 習題 43 第4章 CPU與記憶體的交互 45 4.1 緩存交互 45 4.2 簡單矩陣乘法的動態 47 4.3 估測 47 4.4 初始化、反復核對和觀察 48 4.5 初始結果 49 4.6 更快的矩陣乘法,轉置方法 51 4.7 更快的矩陣乘法,子塊方法 53 4.8 感知緩存的計算 54 4.9 小結 55 習題 55 第5章 測量磁片/SSD的傳輸時間 56 5.1 關於硬碟 56 5.2 關於SSD 58 5.3 軟體磁片訪問和磁片緩衝 60 5.4 磁片讀取有多快 62 5.5 一次粗略估算 65 5.6 磁片寫入有多快 66 5.7 結果 66 5.8 從磁片讀取 67 5.9 寫入磁片 71 5.10 從SSD讀取 74 5.11 寫入SSD 75 5.12 多次傳輸 76 5.13 小結 77 習題 77 第6章 測量網路流量 79 6.1 關於乙太網 81 6.2 關於集線器、交換機和路由器 82 6.3 關於TCP/IP 83 6.4 關於資料包 84 6.5 關於RPC 85 6.6 空程差 87 6.7 觀察網路流量 88 6.8 示例RPC消息的定義 90 6.9 示例日誌設計 92 6.10 使用RPC的示例客戶-伺服器系統 93 6.11 示例伺服器程式 94 6.12 自旋鎖 95 6.13 示例用戶端程式 96 6.14 測量一個示例客戶-伺服器RPC 98 6.15 後處理RPC日誌 99 6.16 觀察 100 6.17 小結 101 習題 102 第7章 磁片和網路資料庫的交互 103 7.1 時間對齊 103 7.2 多個用戶端 109 7.3 自旋鎖的應用 109 7.4 實驗1 110 7.5 磁片資料庫 113 7.6 實驗2 113 7.7 實驗3 117 7.8 日誌 119 7.9 理解事務時延的變化 120 7.10 小結 120 習題 121 第二部分 觀察 第8章 日誌 125 8.1 觀察工具 125 8.2 日誌 125 8.3 基本日誌 126 8.4 擴展日誌 127 8.5 時間戳記 127 8.6 RPC ID 128 8.7 日誌檔的格式 129 8.8 管理日誌檔 130 8.9 小結 131 第9章 聚合措施測量 132 9.1 均勻的事件率與陣發的事件率 133 9.2 測量間隔 133 9.3 時間線 134 9.4 進一步匯總時間線 136 9.5 長條圖的時間尺度 138 9.6 聚合每個事件的測量結果 140 9.7 一段時間的值的模式 142 9.8 更新間隔 143 9.9 事務採樣 144 9.10 小結 145 第10章 儀錶板 147 10.1 示例服務 147 10.2 示例儀錶板 149 10.3 主儀錶板 149 10.4 實例儀錶板 153 10.5 伺服器儀錶板 154 10.6 健全檢查 154 10.7 小結 155 習題 155 第11章 其他現有工具 156 11.1 觀察工具的分類 156 11.2 要觀察的資料 158 11.3 top命令 159 11.4 /proc和/sys偽文件 160 11.5 time命令 160 11.6 perf命令 161 11.7 oprofile 162 11.8 strace 165 11.9 ltrace 168 11.10 ftrace 169 11.11 mtrace 172 11.12 blktrace 174 11.13 tcpdump和Wireshark 177 11.14 locktrace 179 11.15 輸入負載、出站調用 179 11.16 小結 180 習題 181 第12章 跟蹤工具 182 12.1 跟蹤工具的優勢 182 12.2 跟蹤工具的缺點 183 12.3 3個起始問題 183 12.4 示例1:早期的程式計數器跟蹤 186 12.5 示例2:每個函數的計數和時間 188 12.6 案例分析:Gmail的按函數跟蹤 191 12.7 小結 196 第13章 優秀觀察工具的設計原則 197 13.1 需要觀察什麼 197 13.2 有多頻繁?要多久 198 13.3 開銷有多大 199 13.4 設計的後果 200 13.5 案例分析:長條圖桶 200 13.6 設計資料顯示 202 13.7 小結 203 第三部分 內核-使用者跟蹤 第14章 KUtrace的目標、設計、實現 207 14.1 概述 207 14.2 目標 208 14.3 設計 209 14.4 實現 211 14.5 內核補丁和Linux內核可載入模組 211 14.6 控制程式 212 14.7 後處理 213 14.8 關於安全問題的一點說明 213 14.9 小結 213 第15章 KUtrace中的Linux內核補丁 214 15.1 跟蹤緩衝區資料結構 215 15.2 原始跟蹤塊的格式 216 15.3 跟蹤條目 217 15.4 IPC跟蹤條目 218 15.5 時間戳記 219 15.6 事件編號 219 15.7 嵌套的跟蹤條目 219 15.8 代碼 220 15.9 資料包跟蹤 221 15.10 AMD/Intel x86-64補丁 222 15.11 小結 224 習題 224 第16章 KUtrace的Linux內核可載入模組 225 16.1 內核介面資料結構 225 16.2 模組載入/卸載 226 16.3 初始化和控制跟蹤 226 16.4 實現跟蹤調用 227 16.5 Insert1 227 16.6 InsertN 229 16.7 切換到一個新的跟蹤塊 230 16.8 小結 230 第17章 KUtrace的用戶態的運行時控制 231 17.1 控制跟蹤 232 17.2 獨立的kutrace_control程式 232 17.3 底層的kutrace_lib庫 233 17.4 可載入模組的控制介面 233 17.5 小結 234 第18章 KUtrace的後處理 235 18.1 後處理的細節 235 18.2 rawtoevent程式 236 18.3 eventtospan程式 237 18.4 spantotrim程式 239 18.5 spantospan程式 239 18.6 samptoname_k和samptoname_u程式 240 18.7 makeself程式 240 18.8 KUtrace的JSON格式 240 18.9 小結 242 第19章 KUtrace中軟體動態的顯示 243 19.1 概述 243 19.2 區域①——控制項 244 19.3 區域②——y軸 246 19.4 區域③——主時間線 246 19.5 區域④——IPC圖例 251 19.6 區域⑤——x軸 252 19.7 區域⑥——保存/還原 252 19.8 輔助控制項 252 19.9 小結 253 第四部分 推理 第20章 尋找什麼 257 20.1 概述 257 20.2 尋找原因 258 第 21章 執行太多 259 21.1 概述 259 21.2 程式 259 21.3 謎團 260 21.4 探索和分析 261 21.5 理解謎團 265 21.6 小結 265 第22章 執行緩慢 267 22.1 概述 267 22.2 程式 268 22.3 謎團 268 22.4 浮點運算對立程式 270 22.5 記憶體對立程式 273 22.6 理解謎團 274 22.7 小結 274 第23章 等待CPU 276 23.1 程式 276 23.2 謎團1 276 23.3 探索和分析 277 23.4 謎團2 279 23.5 理解謎團2 280 23.6 附加謎團 282 23.7 小結 284 習題 284 第 24章 等待記憶體 285 24.1 程式 285 24.2 謎團1 286 24.3 探索和分析 286 24.4 謎團2:訪問頁表 290 24.5 理解謎團2 290 24.6 小結 292 習題 292 第25章 等待磁片 293 25.1 程式 293 25.2 謎團 294 25.3 探索和分析 294 25.4 讀取40 MB 296 25.5 順序讀取4 KB的塊 297 25.6 隨機讀取4 KB的塊 299 25.7 在SSD上寫入和同步40 MB 301 25.8 在SSD上讀取40 MB 301 25.9 兩個程式同時訪問兩個檔 302 25.10 理解謎團 303 25.11 小結 304 習題 304 第26章 等待網路 305 26.1 概述 305 26.2 程式 306 26.3 實驗1 307 26.4 實驗1中的謎團 308 26.5 實驗1的探索與分析 309 26.6 實驗1中RPC之間的時間 313 26.7 實驗2 315 26.8 實驗3 315 26.9 實驗4 316 26.10 理解謎團 319 26.11 附加異常 320 26.12 小結 322 第27章 等待鎖 323 27.1 概述 323 27.2 程式 327 27.3 實驗1:長時間持有鎖 330 27.4 實驗1中的謎團 331 27.5 探索和分析實驗1 332 27.6 實驗2:修復鎖捕獲 334 27.7 實驗3:通過多個鎖修復鎖爭用 335 27.8 實驗4:通過鎖住更少的工作來修復鎖爭用 337 27.9 實驗5:通過為儀錶板使用RCU來修復鎖爭用 338 27.10 小結 340 第28章 等待時間 341 28.1 定期工作 341 28.2 超時 342 28.3 時間分片 342 28.4 內在的執行延遲 343 28.5 小結 343 第29章 等待佇列 344 29.1 概述 344 29.2 請求的分佈 346 29.3 佇列的結構 347 29.4 工作任務 348 29.5 主任務 348 29.6 Dequeue操作 348 29.7 Enqueue操作 349 29.8 PlainSpinLock類 349 29.9 “工作”常式 350 29.10 簡單的示例 350 29.11 哪些地方可能發生了問題 351 29.12 CPU頻率 352 29.13 複雜的示例 353 29.14 等待CPU:RPC日誌 353 29.15 等待CPU:KUtrace 354 29.16 PlainSpinLock存在的缺陷 357 29.17 根本原因 358 29.18 修復PlainSpinLock:可觀察性 359 29.19 負載均衡 360 29.20 佇列深度:可觀察性 361 29.21 結尾處的自旋 361 29.22 剩下的Z後一個缺陷 362 29.23 交叉檢查 362 29.24 小結 363 習題 363 第30章 全書回顧 365 30.1 你學到了什麼 365 30.2 我們沒有講什麼 367 30.3 接下來的工作 367 30.4 全書小結 368 附錄A 示例伺服器 369 附錄B 跟蹤條目 372 術語表 377 參考文獻 383 KUtrace HTML圖例 384
理查· L. 賽茨(Richard L.Sites),美國國家工程院院士。在職業生涯的大部分時間中,他負責硬體與軟體的交接,特別關注 CPU/軟體性能交互。他擔任了DEC Alpha處理器的架構師,發明了處理器的效能計數器。他還在DEC、Adobe、Google和Tesla公司編寫過低開銷的微代碼,負責過軟體跟蹤
客服公告
热门活动
订阅电子报