猜你喜欢
深入理解软件性能——一种动态视角

深入理解软件性能——一种动态视角

书籍作者:理查德·L.赛茨 ISBN:9787115616562
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:3957
创建日期:2024-05-06 发布日期:2024-05-06
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书不仅介绍了如何测量CPU、内存、磁盘/SSD、网络的性能,如何观察、记录、跟踪、汇总性能指标,还讨论了如何设计和创建性能测试工具KUtrace,以及如何对观察结果进行推理。

本书不仅适合软件开发人员阅读,还适合计算机相关专业的师生参考。

作者简介

理查德. L. 赛茨(Richard L.Sites),美国国家工程院院士。在职业生涯的大部分时间中,他负责硬件与软件的交接,特别关注 CPU/软件性能交互。他担任了 DEC Alpha 处理器的架构师,发明了处理器的性能计数器。他还在 DEC、Adobe、Google 和 Tesla 公司编写过低开销的微代码,负责过软件跟踪

编辑推荐
适读人群 :本书不仅适合软件开发人员阅读,还适合计算机相关专业的师生参考。

1.理解复杂软件动态:本书通过介绍多种环境的优化原则和技术,帮助读者更好地理解复杂软件的动态。

2.提高软件可靠性:通过解决与CPU、内存、磁盘/SSD、网络以及它们之间如何交互有关的问题,可以大大提高软件的可靠性。

3.修复程序运行问题:本书提供了具体的示例和技术,帮助读者修复运行速度缓慢或无缘无故变慢的程序。

4.更有效地分析性能数据:通过介绍如何使用开源软件工具KUtrace收集信息,读者可以更有效地分析性能数据,了解现实与期望的差距。

5.发现问题并解决:本书帮助读者发现问题,例如执行太多指令、指令执行缓慢、等待资源和软件加锁等,并提供了相应的解决方案。


目录

第一部分 测量


第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

产品特色