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