店铺推荐
【推荐语】
性能之巅:洞悉系统、企业与云计算(第2版)(英文版)介绍了操作系统和应用程序的概念、策略、工具和调优,并用基于Linux的操作系统作为主要示例。对这些工具和技术的深刻理解对于今天的开发者来说至关重要,这个新版本针对这些工具和技术做了全面的修订和更新。实施本书中讲述的策略能够让最终用户有更好的体验并让运维成本更低,对于按操作系统实例收费的云计算环境尤为如此。
【作者】
布兰登·格雷格是计算性能和云计算方面的行业专家。他是 Net?ix 的高级性能架构 师,从事性能设计、评估、分析和调整工作。他是多本技术图书的作者,包括《BPF 之 巅》,他获得了 USENIX LISA 系统管理杰出成就奖。他还担任过内核工程师、性能负责 人和专业技术培训师,并曾担任 USENIX LISA 2018 会议的项目联合主席。他开发了可 用于多个操作系统的性能工具,以及包括火焰图在内的性能分析的可视化工具与方法。
【内容】
大型企业服务、云计算和虚拟计算系统都面临着严峻的性能挑战。如今,国际知名的性能专家布兰登·格雷格将业界验证的方法、工具和指标融汇在一起,足以应对复杂环境的性能分析和调优工作。本书着力讲述Liux的性能,但所论述的性能问题适用于所有的操作系统。你将了解到系统是如何工作与执行的,还将学习到分析和改进系统及应用程序性能的方法。本书对第1版的内容做了大量的更新,这些更新包括但不限于:近年来Liux内核各方面的变化对于资源性能的影响;云计算架构的主流演进方向;动态跟踪工具的新星(BPF及其前后端技术);常见性能工具使用方法的变化等。需要说明的是,在第1版中进行性能分析所用到的术语、概念和方法,在第2版中几乎没有变化,依然中肯适用,经得起时间的检验。本书的目标受众主要是系统管理员及企业与云计算环境的运维工程师。所有需要了解操作系统和应用程序性能的开发人员、数据库管理员和网站管理员都适合阅读本书。对于刚接触性能优化的学生等人员,本书还提供了包含格雷格丰富教学经验的练习题。
【目录】
第1章 绪论 35
1.1 系统性能 35
1.2 人员 36
1.3 活动 37
1.4 视角 38
1.5 性能工程是充满挑战的 39
1.5.1 主观性 39
1.5.2 复杂性 39
1.5.3 多个原因 40
1.5.4 多个性能问题 40
1.6 延时 40
1.7 可观测性 41
1.7.1 计数器、统计数据和指标 42
1.7.2 剖析 44
1.7.3 跟踪 45
1.8 实验 47
1.9 云计算 48
1.10 方法 49
1.10.1 Linux 性能分析 60 秒 49
1.11 案例研究 50
1.11.1 缓慢的磁盘 50
1.11.2 软件变更 52
1.11.3 更多阅读 53
1.12 参考资料 53
第2章 方法 55
2.1 术语 56
2.2 模型 57
2.2.1 受测系统 57
2.2.2 排队系统 57
2.3 概念 58
2.3.1 延时 58
2.3.2 时间量级 59
2.3.3 权衡 60
2.3.4 调优的影响 61
2.3.5 合适的层级 62
2.3.6 何时停止分析 63
2.3.7 性能推荐的时间点 63
2.3.8 负载与架构 64
2.3.9 扩展性 65
2.3.10 指标 66
2.3.11 使用率 67
2.3.12 饱和度 68
2.3.13 剖析 69
2.3.14 缓存 69
2.3.15 已知的未知 71
2.4 视角 71
2.4.1 资源分析 72
2.4.2 工作负载分析 73
2.5 方法 74
2.5.1 街灯讹方法 76
2.5.2 随机变动讹方法 76
2.5.3 责怪他人讹方法 77
2.5.4 Ad Hoc 核对清单法 77
2.5.5 问题陈述法 78
2.5.6 科学法 78
2.5.7 诊断循环 80
2.5.8 工具法 80
2.5.9 USE 方法 81
2.5.10 RED 方法 87
2.5.11 工作负载特征归纳 88
2.5.12 向下钻取分析 89
2.5.13 延时分析 90
2.5.14 R 方法 91
2.5.15 事件跟踪 91
2.5.16 基础线统计 93
2.5.17 静态性能调优 93
2.5.18 缓存调优 94
2.5.19 微基准测试 94
2.5.20 性能箴言 95
2.6 建模 96
2.6.1 企业与云 96
2.6.2 可视化识别 96
2.6.3 Amdahl 扩展定律 98
2.6.4 通用扩展定律 99
2.6.5 排队理论 100
2.7 容量规划 103
2.7.1 资源极限 104
2.7.2 因素分析 105
2.7.3 扩展方案 106
2.8 统计 107
2.8.1 量化性能收益 107
2.8.2 平均值 108
2.8.3 标准方差、百分位数、中位数 109
2.8.4 变异系数 110
2.8.5 多重模态分布 110
2.8.6 异常值 111
2.9 监测 111
2.9.1 基于时间的规律 111
2.9.2 监测产品 113
2.9.3 自启动以来的信息统计 113
2.10 可视化 113
2.10.1 线图 114
2.10.2 散点图 115
2.10.3 热图 116
2.10.4 时间线图 117
2.10.5 表面图 118
2.10.6 可视化工具 119
2.11 练习 119
2.12 参考资料 120
第3章 操作系统 123
3.1 术语 124
3.2 背景 125
3.2.1 内核 125
3.2.2 内核态与用户态 127
3.2.3 系统调用 128
3.2.4 中断 130
3.2.5 时钟和空闲 133
3.2.6 进程 133
3.2.7 栈 136
3.2.8 虚拟内存 138
3.2.9 调度器 139
3.2.10 文件系统 140
3.2.11 缓存 142
3.2.12 网络 143
3.2.13 设备驱动 143
3.2.14 多处理器 144
3.2.15 抢占 144
3.2.16 资源管理 144
3.2.17 可观测性 145
3.3 内核 145
3.3.1 UNIX 146
3.3.2 BSD 147
3.3.3 Solaris 148
3.4 Linux 148
3.4.1 Linux 内核开发 149
3.4.2 systemd 154
3.4.3 KPTI(meltdown) 155
3.4.4 eBPF 155
3.5 其他主题 156
3.5.1 PGO 内核 156
3.5.2 unikernel 157
3.5.3 微内核和混合内核 157
3.5.4 分布式操作系统 157
3.6 内核比较 158
3.7 练习 158
3.8 参考资料 159
3.8.1 延伸阅读 161
第4章 观测工具 163
4.1 工具范围 164
4.1.1 静态性能工具 164
4.1.2 危机处理工具 165
4.2 工具类型 167
4.2.1 固定计数器 167
4.2.2 剖析 169
4.2.3 跟踪 170
4.2.4 监测 171
4.3 监测来源 172
4.3.1 /proc 174
4.3.2 /sys 177
4.3.3 延时核算 179
4.3.4 netlink 179
4.3.5 tracepoint 180
4.3.6 kprobes 185
4.3.7 uprobes 187
4.3.8 USDT 189
4.3.9 硬件计数器 190
4.3.10 其他观测源 193
4.4 sar 194
4.4.1 sar(1) 的覆盖范围 195
4.4.2 sar(1) 监测 195
4.4.3 sar(1) 实时报告 199
4.4.4 sar(1) 文档 199
4.5 跟踪工具 200
4.6 观测工具的观测 201
4.7 练习 202
4.8 参考资料 202
第5章 应用程序 205
5.1 应用程序基础 206
5.1.1 目标 207
5.1.2 常见情况的优化 208
5.1.3 可观测性 208
5.1.4 大 O 标记法 209
5.2 应用程序性能技术 210
5.2.1 选择 I/O 尺寸 210
5.2.2 缓存 210
5.2.3 缓冲区 211
5.2.4 轮询 211
5.2.5 并发和并行 211
5.2.6 非阻塞 I/O 215
5.2.7 处理器绑定 215
5.2.8 性能箴言 216
5.3 编程语言 216
5.3.1 编译型语言 217
5.3.2 解释型语言 218
5.3.3 虚拟机 219
5.3.4 垃圾回收 219
5.4 方法 220
5.4.1 CPU 剖析 221
5.4.2 off-CPU 分析 223
5.4.3 系统调用分析 226
5.4.4 USE 方法 227
5.4.5 线程状态分析 227
5.4.6 锁分析 232
5.4.7 静态性能调优 232
5.4.8 分布式跟踪 233
5.5 观测工具 233
5.5.1 perf 234
5.5.2 profifile 237
5.5.3 offcputime 238
5.5.4 strace 239
5.5.5 execsnoop 241
5.5.6 syscount 242
5.5.7 bpftrace 243
5.6 明白了 247
5.6.1 缺少符号 248
5.6.2 缺少栈 249
5.7 练习 250
5.8 参考资料 251
第6章 CPU 253
6.1 术语 254
6.2 模型 255
6.2.1 CPU 架构 255
6.2.2 CPU 内存缓存 255
6.2.3 CPU 运行队列 256
6.3 概念 257
6.3.1 时钟频率 257
6.3.2 指令 257
6.3.3 指令流水线 258
6.3.4 指令宽度 258
6.3.5 指令尺寸 258
6.3.6 SMT 259
6.3.7 IPC 和 CPI 259
6.3.8 使用率 260
6.3.9 用户时间 / 内核时间 260
6.3.10 饱和度 260
6.3.11 抢占 261
6.3.12 优先级反转 261
6.3.13 多进程和多线程 261
6.3.14 字长 263
6.3.15 编译器优化 263
6.4 架构 263
6.4.1 硬件 264
6.4.2 软件 275
6.5 方法 278
6.5.1 工具法 279
6.5.2 USE 方法 279
6.5.3 负载特征归纳 280
6.5.4 剖析 281
6.5.5 周期分析 285
6.5.6 性能监测 285
6.5.7 静态性能调优 286
6.5.8 优先级调优 286
6.5.9 资源控制 287
6.5.10 CPU 绑定 287
6.5.11 微基准测试 287
6.6 观测工具 288
6.6.1 uptime 289
6.6.2 vmstat 292
6.6.3 mpstat 293
6.6.4 sar 294
6.6.5 ps 294
6.6.6 top 295
6.6.7 pidstat 296
6.6.8 time 和 ptime 297
6.6.9 turbostat 298
6.6.10 showboost 299
6.6.11 pmcarch 299
6.6.12 tlbstat 300
6.6.13 perf 301
6.6.14 profifile 311
6.6.15 cpudist 312
6.6.16 runqlat 313
6.6.17 runqlen 314
6.6.18 softirqs 315
6.6.19 hardirqs 316
6.6.20 bpftrace 316
6.6.21 其他工具 319
6.7 可视化 322
6.7.1 使用率热图 322
6.7.2 亚秒级偏移量热图 323
6.7.3 火焰图 323
6.7.4 FlameScope 326
6.8 实验 327
6.8.1 Ad Hoc 327
6.8.2 SysBench 328
6.9 调优 328
6.9.1 编译器选项 329
6.9.2 调度优先级和调度类 329
6.9.3 调度器选项 329
6.9.4 调节调速器 331
6.9.5 能耗状态 331
6.9.6 CPU 绑定 331
6.9.7 独占 CPU 组 332
6.9.8 资源控制 332
6.9.9 安全启动选项 332
6.9.10 处理器选项(BIOS 调优) 333
6.10 练习 333
6.11 参考资料 334
第7章 内存 337
7.1 术语 338
7.2 概念 339
7.2.1 虚拟内存 339
7.2.2 换页 340
7.2.3 按需换页 341
7.2.4 过度提交 342
7.2.5 进程交换 342
7.2.6 文件系统缓存用量 343
7.2.7 使用率和饱和度 343
7.2.8 分配器 343
7.2.9 共享内存 344
7.2.10 工作集大小 344
7.2.11 字长 344
7.3 架构 345
7.3.1 硬件 345
7.3.2 软件 349
7.3.3 进程虚拟地址空间 353
7.4 方法 357
7.4.1 工具法 357
7.4.2 USE 方法 358
7.4.3 描述使用情况 359
7.4.4 周期分析 360
7.4.5 性能监测 360
7.4.6 泄漏检测 360
7.4.7 静态性能调优 361
7.4.8 资源控制 362
7.4.9 微基准测试 362
7.4.10 内存收缩 362
7.5 观测工具 362
7.5.1 vmstat 363
7.5.2 PSI 364
7.5.3 swapon 365
7.5.4 sar 365
7.5.5 slabtop 367
7.5.6 numastat 368
7.5.7 ps 369
7.5.8 top 370
7.5.9 pmap 371
7.5.10 perf 372
7.5.11 drsnoop 376
7.5.12 wss 376
7.5.13 bpftrace 377
7.5.14 其他工具 381
7.6 调优 384
7.6.1 可调参数 384
7.6.2 多种页面大小 386
7.6.3 分配器 387
7.6.4 NUMA 绑定 387
7.6.5 资源控制 387
7.7 练习 388
7.8 参考资料 389
第8章 文件系统 393
8.1 术语 394
8.2 模型 395
8.2.1 文件系统接口 395
8.2.2 文件系统缓存 395
8.2.3 二级缓存 396
8.3 概念 396
8.3.1 文件系统延时 396
8.3.2 缓存 397
8.3.3 随机与顺序 I/O 397
8.3.4 预取 398
8.3.5 预读 399
8.3.6 回写缓存 399
8.3.7 同步写 400
8.3.8 裸 I/O 与直接 I/O 400
8.3.9 非阻塞 I/O 400
8.3.10 内存映射文件 401
8.3.11 元数据 401
8.3.12 逻辑 I/O 与物理 I/O 402
8.3.13 操作并不平等 404
8.3.14 特殊的文件系统 405
8.3.15 访问时间戳 405
8.3.16 容量 405
8.4 架构 406
8.4.1 文件系统 I/O 栈 406
8.4.2 VFS 407
8.4.3 文件系统缓存 407
8.4.4 文件系统特性 409
8.4.5 文件系统种类 411
8.4.6 卷和池 416
8.5 方法 417
8.5.1 磁盘分析 418
8.5.2 延时分析 418
8.5.3 负载特征归纳 420
8.5.4 性能监测 422
8.5.5 静态性能调优 423
8.5.6 缓存调优 423
8.5.7 负载分离 423
8.5.8 微基准测试 424
8.6 观测工具 425
8.6.1 mount 426
8.6.2 free 426
8.6.3 top 427
8.6.4 vmstat 427
8.6.5 sar 427
8.6.6 slabtop 428
8.6.7 strace 429
8.6.8 fatrace 429
8.6.9 LatencyTOP 430
8.6.10 opensnoop 431
8.6.11 fifiletop 432
8.6.12 cachestat 433
8.6.13 ext4dist(xfs、zfs、btrfs、nfs) 433
8.6.14 ext4slower(xfs、zfs、btrfs、nfs) 435
8.6.15 bpftrace 436
8.6.16 其他工具 443
8.6.17 可视化 444
8.7 实验 445
8.7.1 Ad Hoc 445
8.7.2 微基准测试工具 446
8.7.3 缓存刷新 448
8.8 调优 448
8.8.1 应用程序调用 449
8.8.2 ext4 450
8.8.3 ZFS 452
8.9 练习 453
8.10 参考资料 454
第9章 磁盘 457
9.1 术语 458
9.2 模型 459
9.2.1 简单磁盘 459
9.2.2 缓存磁盘 459
9.2.3 控制器 460
9.3 概念 461
9.3.1 测量时间 461
9.3.2 时间尺度 463
9.3.3 缓存 464
9.3.4 随机 I/O 与连续 I/O 464
9.3.5 读 / 写比 465
9.3.6 I/O 大小 466
9.3.7 IOPS 并不平等 466
9.3.8 非数据传输磁盘命令 466
9.3.9 使用率 467
9.3.10 饱和度 468
9.3.11 I/O 等待 468
9.3.12 同步与异步 468
9.3.13 磁盘 I/O 与应用程序 I/O 469
9.4 架构 469
9.4.1 磁盘类型 469
9.4.2 接口 476
9.4.3 存储类型 477
9.4.4 操作系统磁盘 I/O 栈 480
9.5 方法 483
9.5.1 工具法 484
9.5.2 USE 方法 484
9.5.3 性能监测 486
9.5.4 负载特征归纳 486
9.5.5 延时分析 488
9.5.6 静态性能调优 489
9.5.7 缓存调优 490
9.5.8 资源控制 490
9.5.9 微基准测试 490
9.5.10 伸缩 491
9.6 观测工具 492
9.6.1 iostat 493
9.6.2 sar 497
9.6.3 PSI 498
9.6.4 pidstat 498
9.6.5 perf 499
9.6.6 biolatency 502
9.6.7 biosnoop 504
9.6.8 iotop、biotop 506
9.6.9 biostacks 508
9.6.10 blktrace 509
9.6.11 bpftrace 513
9.6.12 MegaCli 518
9.6.13 smartctl 518
9.6.14 SCSI 日志 520
9.6.15 其他工具 521
9.7 可视化 521
9.7.1 折线图 521
9.7.2 延时散点图 522
9.7.3 延时热图 522
9.7.4 偏移量热图 523
9.7.5 使用率热图 524
9.8 实验 524
9.8.1 Ad Hoc 524
9.8.2 自定义负载生成器 525
9.8.3 微基准测试工具 525
9.8.4 随机读示例 525
9.8.5 ioping 526
9.8.6 fifio 527
9.8.7 blkreplay 527
9.9 调优 527
9.9.1 操作系统可调参数 527
9.9.2 磁盘设备可调参数 528
9.9.3 磁盘控制器可调参数 528
9.10 练习 529
9.11 参考资料 530
第10章 网络 533
10.1 术语 534
10.2 模型 535
10.2.1 网络接口 535
10.2.2 控制器 535
10.2.3 协议栈 536
10.3 概念 537
10.3.1 网络和路由 537
10.3.2 协议 538
10.3.3 封装 538
10.3.4 包的大小 538
10.3.5 延时 539
10.3.6 缓冲 541
10.3.7 连接积压队列 541
10.3.8 接口协商 542
10.3.9 避免阻塞 542
10.3.10 使用率 542
10.3.11 本地连接 543
10.4 架构 543
10.4.1 协议 543
10.4.2 硬件 549
10.4.3 软件 551
10.5 方法 558
10.5.1 工具法 559
10.5.2 USE 方法 560
10.5.3 工作负载特征归纳 561
10.5.4 延时分析 562
10.5.5 性能监测 563
10.5.6 数据包嗅探 564
10.5.7 TCP 分析 565
10.5.8 静态性能调优 565
10.5.9 资源控制 566
10.5.10 微基准测试 567
10.6 观测工具 567
10.6.1 ss 568
10.6.2 ip 570
10.6.3 ifconfifig 571
10.6.4 nstat 572
10.6.5 netstat 573
10.6.6 sar 577
10.6.7 nicstat 579
10.6.8 ethtool 580
10.6.9 tcplife 582
10.6.10 tcptop 583
10.6.11 tcpretrans 583
10.6.12 bpftrace 584
10.6.13 tcpdump 592
10.6.14 Wireshark 594
10.6.15 其他工具 594
10.7 实验 596
10.7.1 ping 596
10.7.2 traceroute 597
10.7.3 pathchar 598
10.7.4 iperf 598
10.7.5 netperf 599
10.7.6 tc 600
10.7.7 其他工具 601
10.8 调优 601
10.8.1 系统级可调参数 601
10.8.2 套接字选项 607
10.8.3 配置 608
10.9 练习 608
10.10 参考资料 609
第11章 云计算 613
11.1 背景 614
11.1.1 实例类型 615
11.1.2 可扩展的架构 615
11.1.3 容量规划 616
11.1.4 存储 618
11.1.5 多租户 619
11.1.6 编排(Kubernetes) 620
11.2 硬件虚拟化 621
11.2.1 实现 622
11.2.2 系统开销 623
11.2.3 资源控制 629
11.2.4 可观测性 631
11.3 操作系统虚拟化 639
11.3.1 实现方式 641
11.3.2 系统开销 644
11.3.3 资源控制 647
11.3.4 可观测性 651
11.4 轻量虚拟化 664
11.4.1 实现 665
11.4.2 开销 666
11.4.3 资源控制 666
11.4.4 可观测性 666
11.5 其他类型 668
11.6 比较 668
11.7 练习 670
11.8 参考资料 671
第12章 基准测试 675
12.1 背景 676
12.1.1 原因 676
12.1.2 有效的基准测试 677
12.1.3 基准测试失败 679
12.2 基准测试的类型 685
12.2.1 微基准测试 685
12.2.2 模拟 687
12.2.3 回放 688
12.2.4 行业标准 688
12.3 方法 690
12.3.1 被动基准测试 690
12.3.2 主动基准测试 691
12.3.3 CPU 剖析 694
12.3.4 USE 方法 695
12.3.5 工作负载特征归纳 696
12.3.6 自定义基准测试 696
12.3.7 逐渐增加负载 696
12.3.8 合理性检查 698
12.3.9 统计分析 699
12.3.10 基准测试检查清单 700
12.4 基准测试问题 701
12.5 练习 702
12.6 参考资料 703
第13章 perf 705
13.1 子命令概览 706
13.2 单行命令 708
13.3 perf事件 713
13.4 硬件事件 715
13.4.1 频率采样 716
13.5 软件事件 717
13.6 tracepoint事件 718
13.7 探针事件 719
13.7.1 kprobe 719
13.7.2 uprobe 721
13.7.3 USDT 探针 724
13.8 perf stat 725
13.8.1 选项 726
13.8.2 周期统计信息 727
13.8.3 CPU 均衡 727
13.8.4 事件过滤器 727
13.8.5 隐藏统计信息 728
13.9 perf record 728
13.9.1 选项 729
13.9.2 CPU 剖析 729
13.9.3 栈遍历 730
13.10 perf report 730
13.10.1 TUI 731
13.10.2 STDIO 731
13.11 perf 732
13.11.1 火焰图 734
13.11.2 跟踪脚本 734
13.12 perf trace 735
13.12.1 内核版本 736
13.13 其他命令 736
13.14 perf文档 737
13.15 参考资料 737
第14章 Ftrace 739
14.1 功能概述 740
14.2 tracefs(/sys) 742
14.2.1 tracefs 的内容 743
14.3 Ftrace函数剖析器 745
14.4 Ftrace函数跟踪 747
14.4.1 使用 trace 747
14.4.2 使用 trace_pipe 749
14.4.3 选项 750
14.5 跟踪点 751
14.5.1 过滤器 751
14.5.2 触发器 752
14.6 kprobes 753
14.6.1 事件跟踪 753
14.6.2 参数 754
14.6.3 返回值 755
14.6.4 过滤器和触发器 755
14.6.5 kprobe 剖析 756
14.7 uprobes 756
14.7.1 事件跟踪 756
14.7.2 参数和返回值 757
14.7.3 过滤器和触发器 757
14.7.4 uprobe 剖析 757
14.8 Ftrace function_graph 758
14.8.1 图表跟踪 758
14.8.2 选项 759
14.9 Ftrace hwlat 760
14.10 Ftrace hist触发器 761
14.10.1 单关键字 761
14.10.2 字段 762
14.10.3 修饰器 763
14.10.4 PID 过滤器 763
14.10.5 多关键字 764
14.10.6 栈踪迹关键字 764
14.10.7 综合事件 765
14.11 trace-cmd 768
14.11.1 子命令概述 768
14.11.2 trace-cmd 单行命令 770
14.11.3 trace-cmd 和 perf(1) 的比较 772
14.11.4 trace-cmd function_graph 773
14.11.5 KernelShark 773
14.11.6 trace-cmd 文档 774
14.12 perf ftrace 775
14.13 perf-tools 775
14.13.1 工具覆盖 776
14.13.2 单用途的工具 777
14.13.3 多用途工具 778
14.13.4 perf-tools 单行命令 779
14.13.5 示例 781
14.13.6 perf-tools 与 BCC/BPF 的对比 781
14.13.7 文档 782
14.14 Ftrace文档 782
14.15 参考资料 783
第15章 BPF 785
15.1 BCC 787
15.1.1 安装 788
15.1.2 工具范围 788
15.1.3 单用途工具 789
15.1.4 多用途工具 791
15.1.5 单行命令 791
15.1.6 多用途工具示例 793
15.1.7 BCC 与 bpftrace 的比较 794
15.1.8 文档 794
15.2 bpftrace 795
15.2.1 安装 796
15.2.2 工具 796
15.2.3 单行命令 797
15.2.4 编程 800
15.2.5 参考 808
15.2.6 文档 815
15.3 参考资料 816
第16章 案例研究 817
16.1 无法解释的收益 817
16.1.1 问题陈述 817
16.1.2 分析策略 818
16.1.3 统计数据 818
16.1.4 配置 820
16.1.5 PMC 822
16.1.6 软件事件 823
16.1.7 跟踪 824
16.1.8 结论 826
16.2 其他信息 726
16.3 参考资料 827
附录A USE方法:Linux 829
附录B sar总结 835
附录C bpftrace单行命令 837
附录D 精选练习题答案 843
附录E 系统性能名人录 845
【媒体评论】
"性能测量的水相当深,斯坦福大学的 John Ousterhout 教授在“Always Measure One Level Deeper”一文(《ACM 通讯》杂志,2018 年第 7 期)中提到,在他亲历的几十次系统性能评估中,没有哪次的首批测量结果是正确的,都是先掉进坑里,再慢慢爬出来。就拿文件 I/O 来说,你测得的是真实的磁盘性能,还是操作系统中文件系统的性能?存储是分级的。操作系统有页缓存,高档的磁盘控制器(阵列卡)有带电池备份的写缓存,机械硬盘上有高速缓存,混合型机械硬盘带有 SSD 缓存,消费级 TLC SSD 上带有 SLC 缓存。文件 I/O 的性能主要取决于读写操作击中的是哪一级缓存,而缓存颠簸(thrashing)是系统过载时造成性能急剧下降的重要因素。如今的计算机系统靠前复杂,性能优劣往往违反直觉。不少人可能先入为主地认为mmap() 比 read()/write() 读写文件更快,因为前者减少了系统调用和内存拷贝。这听上去很有道理,也正是 20 世纪 80 年代 UNIX 引入 mmap() 的理由。但是卡内基梅隆大学的 Andrew Crotty 等人本书作者 Brendan Gregg 是全球知名的实战派性能专家,他发明的火焰图是分析CPU 开销的有力工具,如今已是我们日常性能分析的标配。这本书是他多年工作经验的总结,既有理论深度,又有丰富案例,在同类图书中是较为全面深入的,非常值得深入阅读。这个新版本我会第一时间购买,常备案头,随时查阅。 ——陈硕 《Linux 多线程服务端编程 :使用 muduo C++ 网络库》作者 Gregg 在 Netflix 积累了丰富的云计算环境下的性能优化的经验后又加入 Intel,按他的说法,“将为从应用程序到硅的所有领域开发新的性能和调试技术。这将跨越所有xPU(CPU、GPU、IPU 等),并对世界产生巨大影响”。本书可作为大家入门性能优化的起点,以此为基础,一方面深入操作系统内核,另一方面广泛积累应用程序的优化经验,最后再回归到硬件,你将走入一个更广泛的世界。 ——陈莉君 西安邮电大学教授 作为高性能计算和云计算系统的设计、开发和运维人员,任何时候讨论性能优化总是一个充满挑战却令人期望的事情。你似乎永远无法知道所设计的系统架构、调度策略和数据结构是否能达到最理想的状态,但经过各种不断尝试后因取得的性能提升而获得的满足感却是如此让人陶醉。本书从性能分析和调优的基础概念和方法入手,沿着操作系统内核、应用、CPU、内存、文件系统、磁盘、网络、云计算系统以及调优工具的线索,展开一幅计算机系统性能优化的全栈式画卷,向读者介绍影响计算机系统性能的关键因素,以及深入理解如何动手去解决这些性能瓶颈。作为国家超级计算中心的总工程师,让高性能计算机系统在运行时任务执行最快、用户在队列的等待时间最短、系统平均无故障时间越长,是我追求的永恒目标。我所带领的运维与系统开发团队一直在为提高我国超级计算的系统性能努力,这本书让我有推荐给我们运维团队每一个成员的强烈冲动。毫无疑问,本书的内容将有助于我们深入理解系统性能背后的知识,建立完整的“系统观”。同时我还要将本书推荐给我的研究生们,值得每一位立志做体系结构研究的学生将其作为入门教材,在动手进行高性能系统和云计算系统优化研究前,对何为性能优化有一个全面完整的认识,有助于他们在研究过程中将问题考虑得更全面。最后我要把这本书推荐给所有从事高性能计算与云计算领域的从业者,无论你是资深架构师还是运维人员,相信我,本书对你重新思考系统设计、性能优化将会起到很大的作用,值得一读。 ——唐卓 国家超级计算长沙中心总工程师、湖南大学教授 作为一名讲授操作系统课程的教师,性能一直是课堂中很难的主题,因为你永远不知道什么样的性能问题在等着你。就在几天前,我在部署一批机器时排查了一台机器的性能问题,最终发现竟然是 USB 接口发生了短路(一个真正的物理 bug),导致kworker/0:0+pm 一直处于活动的状态!正是本能地使用了 Linux 的 perf 工具(本书在第13 章中详细介绍)帮助我瞬间定位到 xhci 相关的代码,将性能问题指向了 USB 子系统。在暴力“拆除”USB 接口后,问题解除。在课堂上,我会和学生谈论“理解性能就是理解程序在时间轴上的执行”,但这谈何容易!我们既想看得清楚,对每条指令执行的踪迹和所属都了如指掌,又不想付出任何代价,因为任何插入程序中的探针都会干扰程序的执行。在系统中的所有组件都成为木桶的短板之后,性能调优更是一项艰苦卓绝,但却对生产系统来说至关重要的任务。 幸运的是,今天我们有了许多成熟的性能分析方法和工具。我找不到任何一份资料可以和 Brendan Gregg 的这本全面、深入的书籍相提并论。Brendan Gregg 作为性能分析领域首屈一指的专家,毫无保留地将其真知灼见和技术细节与读者分享。读完本书,你就有了世界上最优选的性能分析“武器库”,不再惧怕任何系统的性能分析。 ——蒋炎岩 南京大学教师 当前云计算等复杂场景下的系统性能问题日益严峻,需要专业的方法才能找到瓶颈所在,然后才能有针对性地对其做优化,以让业务高并发地运行。本书从性能分析所需要的内存、文件系统、网络、CPU 等方面进行了详细介绍,并结合丰富的案例将读者快速带入实战状态,作者还总结了一套性能分析的理论和方法,让读者把提高性能的法宝掌握在手中。另外,本书针对如今火到天际的 BPF 前后端技术及相应工具也进行了介绍。本书的作者 Gregg 是国际知名的性能专家,译者在操作系统和性能领域也是身经百战、经验丰富,无论你是系统运维人员、研发工程师,还是性能架构师,通过阅读本书,都能帮你打开解决性能问题的大门。强烈推荐本书! ——毛文安,龙蜥社区系统运维 SIG Maintainer 系统性能问题一直是我们面临的难题之一。本书从系统性能、优化分析到应用程序性能及 CPU、内存、文件系统、磁盘、网络,并结合案例由浅入深地讲述了性能方面的知识。本书的作译者都是性能优化领域的专家,实战经验丰富。本书对系统管理员、运维工程师、研发工程师具有极高的参考价值,阅读本书,收获颇多,力荐! ——田国杰(@JackTian),微信公众号“杰哥的 IT 之旅”作者 本书详尽地介绍了企业环境和云计算环境下的性能测试方法与工具,能为读者带来立竿见影的帮助。“无法衡量就无法管理”,本书先对组件性能进行分析与观测,然后在此之上进行改进。书中的方法与思路能够“授人以渔”,引领读者在系统性能领域进行长期思考。优秀的著作离不开译者的付出,本书的译者通过精准的翻译,原汁原味地将这本经典技术著作呈现给大家。无论你是系统管理员、云计算运维人员、技术爱好者,还是立志成为系统性能架构师、专家,这本经典著作都值得力荐给你。 ——吕昭波,《云端架构》作者 多年前我第一次接触到火焰图这种神奇的性能剖析方法时,Brendan Gregg 令我惊为天人,后来读《性能之巅:洞悉系统、企业与云计算》一书更是受益良多。这次再版,作者补充了近年热门的可观测性、eBPF、Kubenertes 等方面的知识,并将第一版中多处分析方法进一步细化成具体的观测工具指南。高屋建瓴的理论配合深入浅出的落地实践,绝对是广大 IT 工程师的案头推荐书籍。 ——饶琛琳,日志易产品副总裁,前微博系统架构师 分析性能问题需要的技术是很广泛的,操作系统、数据库、网络、语言、存储、架构等方面的知识都需要理解和掌握。而要想具备性能瓶颈分析和定位的能力,掌握操作系统方面的知识是绝对跳不过去的一个环节。本书从性能分析的角度出发来理解操作系统,对广大开发人员梳理性能分析思路有很好的借鉴作用。本书在不同的操作系统模块中提供了实用的分析思路和方法,为应用程序、CPU、内存、网络、文件系统、磁盘等的性能分析提供了对应的工具,同时给出了相应的操作实例,最后还结合一些基准测试工具以及 BPF 工具给出进一步进行系统级性能分析的操作指导。这是一本如果要学习性能分析就必然要看的书。 ——高楼,盾山科技 CEO、7DGroup 创始人 在计算机技术的发展长河中,性能问题一直是绕不开的话题。现在市面上针对性能测试的图书有很多,但和本书一样面面俱到的,却是凤毛麟角。本书不仅从操作系统、CPU、内存、文件系统、磁盘、网络等方面介绍了计算机性能的基础知识,同时还与时俱进,从云计算等当前热门技术的角度,介绍了如何进行性能优化。除此之外,本书还介绍了性能测试的相关方法论和性能测试工具,具有很高的实用性。本书的作译者都是性能领域的专家,在业内享有极高声望。这本经典的著作,非常适合研发人员、运维人员、测试人员当作性能优化的参考书,力荐! ——臻叔,微信公众号“程序员臻叔”,作者 本书采用自下而上的结构,从底层的操作系统、CPU、磁盘等基础元素开始,到从工作原理层面分析性能受到的各种不同影响,以及如何评估、衡量各项性能指标,让读者知其然并知其所以然,在面对实际情况时能够更有针对性地做出判断和决定,而不是机械地、教条地行事。本书还提供了案例,一步步地展示了实际性能问题的排查调优过程。 ——林应 技术部高级技术专家 本书以一种奇妙而到位的方式,把高屋建瓴的视角和脚踏实地的实践结合了起来,对性能这一复杂、微妙甚至有些神秘的话题进行了外科手术般的解析,读来真是让人感觉豁然开朗。全书以罕见的遍历式结构,对软件系统的每一个部件都如庖丁解牛般地加以剖析,几乎涉及业务的每一个细节。然而,对这些细节并非简单罗列,而是每一段论述都与具体的角色和场景紧密结合,取舍之间极见智慧。方法论更不是单说理,而是通过一个又一个的具体实例,逐步地建构起来的,并反复运用于各个部件之上,使读者明白原理普适性的同时也知道怎样举一反三。本书也是难得的 UNIX/Linux 系统管理员和运维工程师的百科全书式参考手册,相对于工作在 Windows 上的同行而言,他们获得的知识更加零碎,甚至在很多场合下不得不求助于网络上的只言片语,并只能通过耗时的、高风险的生产环境实验来取得一手经验数据。 ——高博 青年计算机学会论坛(YOCSEF)会员,文津奖得主,《研究之美》译者 纵观全书,作者建立了系统性能优化的体系框架,并且骨肉丰满,很明显,他不仅擅长某方面的性能优化,而且是全方位的专家,加之他作为 DTrace(一种可动态检测进程状态的工具)的主要开发者,使得本书的说服力和含金量大增。本书首先提及性能优化的方法论和常见性能检测工具的使用,具体内容更是涉及可能影响 Linux 系统性能的方方面面,从操作系统、应用程序、CPU、内存、文件系统、磁盘到网络,无所不包。在以上这些话题的探讨中,作者的表述方法值得称道—每章都程式化地介绍了术语、模型、概念、架构、方法、分析工具和调优建议等,这对于因长期工作形成一定强迫症的某些技术人员,如我自己,阅读时感到赏心悦目,这也从侧面体现了作者深厚的技术功底和文字驾驭能力。本书提供的性能优化方法论也令人印象深刻,包括几种常见的错误思考方法,如街灯法、随意猜测法和责怪他人法。在列举各种不正确的方法后,作者建议采用科学法,科学法的“套路”是 :描述问题→假设→预测→实验→分析。本书用单独的章节系统性地介绍了操作系统、性能检测方法和各种基准测试,还特别介绍了作者主导开发的 DTrace(在本书的例子中,用 DTrace 监控 SSH 客户端当前执行的每个命令并实时输出),这使得本书作为工具书的价值更得以彰显。云计算的出现,对系统优化带来新的挑战。作者作为某云计算提供商的首席性能工程师,带来了一个真实的云客户案例分析,包括如何利用本书提及的技术、方法和工具,一步一步地分析和解决问题。 ——萧田国 触控科技运维总监,高效运维社区创始人 学习调优技术有很多挑战,很高兴看到有这样一本关于系统优化的好书被引进到国内。 ——张银奎 资深调试专家,《软件调试》和《格蠹汇编》作者 本书的作者 Gregg 先生是业内性能优化方面大名鼎鼎的人物,他早年在 Sun 公司的时候是性能主管和内核工程师,也是大名鼎鼎的 DTrace 的开发人员,要知道 DTrace 先后被移植到很多操作系统上。全书都在讨论性能优化,详细介绍了诸如 DTrace、vmstat、mpstat、sar、SystemTap 等工具,如何将这些工具组合并应用在适当的场景中,是一门学问,相信读者会在书中找到答案。顺便说一句,DTrace+SystemTap 帮助 SAE 解决过非常多的性能疑难杂症,一定会对读者的业务分析有所帮助!单个进程的性能分析是简单的,因为我们可以定位到系统调用或者库调用级别,然后对照代码很快就能解决问题,但整个业务的性能分析是复杂的,这里面涉及多个业务单元、庞大的系统组件,随机变动、诊断循环等多种方法,并且介绍了涉及分析的数学建模和概念,详细讨论了操作系统,这对读者是很有用的。因为很多时候我们在不改代码的情况下优化系统,也就是优化内存分配比例,优化 CPU 亲密度,尝试各种调度算法,做操作系统层面的各种网络参数调优等。对于上述所有问题的认识,我相信读者在通读全书后会有不一样的感觉。记住,不要只读一遍,每读一遍都必有不同的体会。不多说了,我要赶紧再去读一遍! ——丛磊 新浪 SAE 创始人 / 总负责人"
返回顶部