性能之巅:洞悉系统、企业与云计算

性能之巅:洞悉系统、企业与云计算 pdf epub mobi txt 电子书 下载 2025

Brendan Gregg(布兰登·格雷格) 著,徐章宁,吴寒思,陈磊 译
图书标签:
  • 性能优化
  • 系统架构
  • 企业级应用
  • 云计算
  • 软件工程
  • 可观测性
  • 容量规划
  • 性能测试
  • SRE
  • DevOps
想要找书就要到 静流书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 电子工业出版社
ISBN:9787121267925
版次:1
商品编码:11755695
品牌:Broadview
包装:平装
开本:16开
出版时间:2015-08-01
用纸:胶版纸
页数:628
正文语种:中文

具体描述

产品特色

编辑推荐

适读人群 :各个企业的网络维护人员,高校计算机专业学生

  本书是企业和云计算环境运维人员的必备指导:系统管理员、网络管理员、数据库管理员和Web管理员、开发工程师以及其他专业人员。对于新接触性能优化的学生等人员,本书还提供了饱含Gregg丰富的教学经验的练习题目。

  □ 现代性能分析与调优:术语、概念、模型、方法和技术

  □ 动态跟踪技术与工具,收录DTrace、SystemTap和Perf示例

  □ 内核内幕:揭示OS在做什么

  □ 如何使用系统观测工具、接口和框架

  □ 理解和监控应用程序性能

  □ 优化CPU:处理器、核、硬件线程、缓存、互联与内核调度

  □ 内存优化:虚拟内存、换页、交换、内存架构、总线、地址空间与分配器

  □ 文件系统I/O,包括缓存

  □ 存储设备/控制器、磁盘I/O工作负载、RAID,以及内核I/O

  □ 网络相关性能问题:协议、套接字、网卡和物理连接。

  □ OS和基于硬件虚拟化的性能实现,以及云计算所遇到的新问题

  □ 基准测试:如何得到精确的结果并避免一般性的错误

内容简介

  《性能之巅:洞悉系统、企业与云计算》基于Linux 和Solaris 系统阐述了适用于所有系统的性能理论和方法,Brendan Gregg 将业界普遍承认的性能方法、工具和指标收集于本书之中。阅读本书,你能洞悉系统运作的方式,学习到分析和提高系统与应用程序性能的方法,这些性能方法同样适用于大型企业与云计算这类较为复杂的环境的性能分析与调优。

作者简介

  Brendan Gregg,是Joyent公司的首席性能工程师,通过软件栈分析性能和扩展。在Sun Microsystem公司(之后为Oracle)作为首席性能和内核工程师期间,他的工作包括开发ZFS L2ARC,这是一个利用闪速存储器提升性能的文件系统。他还开发了许许多多的性能工具,部分工具收录在Mac OS X和Oracle Solaris 11的发行版中。他最近从事的工作覆盖针对Linux和illumos内核分析的性能可视化。他还是《DTrace》(Prentice Hall出版社,2011年)和《Solaris Performance and Tools》的两书合著者。


  译者介绍:

  ·徐章宁,1984年生,毕业于上海交通大学,硕士毕业后一直从事软件运维工作,在云存储与虚拟化领域浸沁多年,现于百度公司担任高级运维工程师,致力于大数据方向运维。钟爱开源软件,平日热爱读书和写作,《算法谜题》《编程格调》合译者。


  ·吴寒思,2010年毕业于南京大学软件学院,目前就职于EMC公司核心技术部从事文件系统研发工作,拥有2项文件系统方面专利。对程序设计、系统存储、云计算和操作系统有浓厚兴趣。


  ·陈磊,1979年生,毕业于同济大学。从事网络、系统和IT管理14年。曾就职于EMC中国卓越研发集团,任实验室经理。目前在互联网金融企业负责基础架构。兴趣广泛,尤其热爱开源软件和其它各类新兴技术的探讨和研究。

内页插图

精彩书评

  我做分布式机器学习系统有八年了,其间很多时候要面对系统分析的问题。但是坦诚的说,大部分情况下我都只能尽快地找一个“近似”方法,处在没有时间深入琢磨上述系统问题的窘境。看到《系能之巅:洞悉系统、企业与云计算》一书之后,不禁眼前一亮。这本书从绪论之后,就开始介绍“方法”——概念、模型、观测和实验手段。作者不仅利用操作系统自带的观测工具,还自己开发了一套深入分析观测结果的脚本,这就是有名的DTrace Toolkit(大家可以直接找来使用)。《性能之巅》一书介绍的实验和观测方法,包括内存、CPU、文件系统、存储硬件、网络等各个方面。而且,在介绍方法之前会深入介绍系统原理——我没法期望更多了!

  ——王益 Linkedin高级主任分析师

  书的作者Gregg先生是业内性能优化方面大名鼎鼎的人物,早年在Sun公司的时候是性能主管和内核工程师,也是大名鼎鼎的DTrace的开发人员,要知道DTrace可是众多trace类工具中知名的,并且先后被移植到了很多别的OS上。全书统篇都在讨论性能优化,对于所有相关问题的认识,我相信读者在通读全书后会有不一样的感觉。记住,不要只读一遍,每一遍都必有不同的体会。

  ——丛磊 新浪SAE创始人/总负责人

  与软件瑕疵类似,性能问题也可能危害巨大!更可怕的是,性能方面的问题容易促发隐藏在软件深处的瑕疵,直接导致软件崩溃或者其它无法预计的故障。不论调试,还是调优,对软件工程师的技术要都求很高。很高兴看到有这样一本关于系统优化的好书引进到国内。

  ——张银奎 专业调试专家,《软件调试》和《格蠹汇编》作者 2015年7月22日于上海格蠹轩

  纵观全书,作者建立了系统性能优化的体系框架,并且骨肉丰满。很明显,他不仅擅长某方面的性能优化,更是全方位的专家,加之作为DTrace(一种可动态检测进程等状态的工具)主要开发者,使得本书的说服力和含金量大增。本书让我们有机会系统学习和掌握性能优化的各方面,有机会建立一种高屋建瓴的全局观,在面对复杂系统问题时再不会手足无措,或只能盲人摸象。Linux系统演化至今,基础的体系架构和关键组件并未发生多大改变,这使得这本好书即使再历经多年,价值毫无衰减,反而历久弥新。

  ——萧田国 触控科技运维总监 高效运维社区创始人

  《性能之巅》以一种奇妙而到位的方式,把高屋建瓴的视角和脚踏实地的实践结合了起来,对性能这一复杂、微妙甚至有些神秘的话题进行了外科手术式的解析,读来真是让人感觉豁然开朗。

  全书以罕见的遍历式结构,对软件系统的每一个部件都如庖丁解牛般加以剖析,几乎涉及到业务的每一个细节。然而,这些细节并非简单的罗列,而是每一段论述都与具体的角色和场景紧密结合,取舍之间极见智慧。方法论更是不单说理,而是通过一个又一个的具体实例,逐步地建构起来,并反复运用于各个部件之上,使读者明白原理普适性的同时也知道怎样举一反三。

  ——高博 青年计算机学会论坛(YOCSEF)会员,文津奖得主,《研究之美》译者

  性能问题一直是个热门话题,分布式系统时代更成为摆在开发运维人员面前的巨大难题。本书采用了自下而上的结构,从底层的操作系统、CPU、磁盘等基础元素开始,到工作原理层面分析性能受到的各种不同影响,以及如何评估、衡量各项性能指标,让读者知其所以然,在面对实际情况时能够更有针对性地做出判断和决定,而不是机械地、教条地行事。本书提供案例,手把手展示实际性能问题的排查调优过程。读者可据此结合业务系统实际情况展开工作。本书还对常用性能分析工具的使用和扩展做了详细介绍,这对日常工作效率的提升有很大的帮助。无论开发还是运维人员,无论设计、编码或排查调优,本书都能发挥重要的参考作用,尤其适合常备案头。

  ——林应 淘宝技术部高级技术专家

目录

第1章 绪论 1
1.1 系统性能 1
1.2 人员 2
1.3 事情 3
1.4 视角 4
1.5 性能是充满挑战的 4
1.5.1 性能是主观的 4
1.5.2 系统是复杂的 5
1.5.3 可能有多个问题并存 6
1.6 延时 6
1.7 动态跟踪 7
1.8 云计算 8
1.9 案例研究 8
1.9.1 缓慢的磁盘 9
1.9.2 软件变更 10
1.9.3 更多阅读 12
第2章 方法 13
2.1 术语 14
2.2 模型 14
2.2.1 受测系统 15
2.2.2 排队系统 15
2.3 概念 16
2.3.1 延时 16
2.3.2 时间量级 17
2.3.3 权衡三角 18
2.3.4 调整的影响 19
2.3.5 合适的层级 19
2.3.6 性能建议的时间点 20
2.3.7 负载vs.架构 20
2.3.8 扩展性 21
2.3.9 已知的未知 22
2.3.10 指标 23
2.3.11 使用率 24
2.3.12 饱和度 25
2.3.13 剖析 26
2.3.14 缓存 26
2.4 视角 28
2.4.1 资源分析 28
2.4.2 工作负载分析 29
2.5 方法 30
2.5.1 街灯反方法 31
2.5.2 随机变动反方法 32
2.5.3 责怪他人反方法 32
2.5.4 ad hoc核对清单法 33
2.5.5 问题陈述法 33
2.5.6 科学法 34
2.5.7 诊断循环 35
2.5.8 工具法 35
2.5.9 USE方法 36
2.5.10 工作负载特征归纳 42
2.5.11 向下挖掘分析 43
2.5.12 延时分析 44
2.5.13 R方法 45
2.5.14 事件跟踪 45
2.5.15 基础线统计 47
2.5.16 静态性能调整 47
2.5.17 缓存调优 47
2.5.18 微基准测试 48
2.6 建模 49
2.6.1 企业vs.云 49
2.6.2 可视化识别 49
2.6.3 Amdahl扩展定律 51
2.6.4 通用扩展定律 52
2.6.5 排队理论 52
2.7 容量规划 56
2.7.1 资源极限 56
2.7.2 因素分析 58
2.7.3 扩展方案 58
2.8 统计 59
2.8.1 量化性能 59
2.8.2 平均值 60
2.8.3 标准方差、百分位数、中位数 61
2.8.4 变异系数 62
2.8.5 多重模态分布 62
2.8.6 异常值 63
2.9 监视 63
2.9.1 基于时间的规律 63
2.9.2 监测产品 65
2.9.3 启动以来的信息统计 65
2.10 可视化 65
2.10.1 线图 65
2.10.2 散点图 66
2.10.3 热图 67
2.10.4 表面图 68
2.10.5 可视化工具 69
2.11 练习 70
2.12 参考 70
第3章 操作系统 72
3.1 术语 72
3.2 背景 73
3.2.1 内核 73
3.2.2 栈 76
3.2.2 中断和中断线程 77
3.2.4 中断优先级 78
3.2.5 进程 78
3.2.6 系统调用 80
3.2.7 虚拟内存 82
3.2.8 内存管理 82
3.2.9 调度器 83
3.2.10 文件系统 84
3.2.11 缓存 86
3.2.12 网络 87
3.2.13 设备驱动 87
3.2.14 多处理器 87
3.2.15 抢占 88
3.2.16 资源管理 88
3.2.17 观测性 89
3.3 内核 89
3.3.1 UNIX 90
3.3.2 基于Solaris 90
3.3.3 基于Linux 93
3.3.4 差异 95
3.4 练习 96
3.5  参考 96
第4章 观测工具 98
4.1 工具类型 98
4.1.1 计数器 99
4.1.2 跟踪 100
4.1.3 剖析 101
4.1.4 监视(sar) 102
4.2 观测来源 103
4.2.1 /proc 103
4.2.2 /sys 108
4.2.3 kstat 109
4.2.4 延时核算 111
4.2.5 微状态核算 112
4.2.6 其他的观测源 112
4.3 DTrace 114
4.3.1 静态和动态跟踪 115
4.3.2 探针 116
4.3.3 provider 116
4.3.4 参数 117
4.3.5 D语言 117
4.3.6 内置变量 118
4.3.7 action 118
4.3.8 变量类型 119
4.3.9 单行命令 121
4.3.10 脚本 121
4.3.11 开销 122
4.3.12 文档和资源 123
4.4 SystemTap 124
4.4.1 探针 124
4.4.2 tapset 125
4.4.3 action和内置变量 125
4.4.4 示例 125
4.4.5 开销 127
4.4.6 文档和资源 128
4.5 perf 128
4.6 观测工具的观测 129
4.7 练习 130
4.8 参考 130
第5章 应用程序 131
5.1 应用程序基础 131
5.1.1 目标 132
5.1.2 常见情况的优化 133
5.1.3 观测性 134
5.1.4 大O标记法 134
5.2 应用程序性能技术 135
5.2.1 选择I/O尺寸 135
5.2.2 缓存 136
5.2.3 缓冲区 136
5.2.4 轮询 136
5.2.5 并发和并行 137
5.2.6 非阻塞I/O 139
5.2.7 处理器绑定 139
5.3 编程语言 140
5.3.1 编译语言 140
5.3.2 解释语言 141
5.3.3 虚拟机 142
5.3.4 垃圾回收 142
5.4 方法和分析 143
5.4.1 线程状态分析 143
5.4.2 CPU剖析 146
5.4.3 系统调用分析 148
5.4.4 I/O剖析 154
5.4.5 工作负载特征归纳 155
5.4.6 USE方法 155
5.4.7 向下挖掘法 156
5.4.8 锁分析 156
5.4.9 静态性能调优 159
5.5 练习 160
5.6 参考 161
第6章 CPU 162
6.1 术语 163
6.2 模型 163
6.2.1 CPU架构 163
6.2.2 CPU内存缓存 164
6.2.3 CPU运行队列 165
6.3 概念 165
6.3.1 时钟频率 165
6.3.2 指令 166
6.3.3 指令流水线 166
6.3.4 指令宽度 167
6.3.5 CPI,IPC 167
6.3.6 使用率 167
6.3.7 用户时间/内核时间 168
6.3.8 饱和度 168
6.3.9 抢占 168
6.3.10 优先级反转 169
6.3.11 多进程,多线程 169
6.3.12 字长 170
6.3.13 编译器优化 171
6.4 架构 171
6.4.1 硬件 171
6.4.2 软件 179
6.5 方法 184
6.5.1 工具法 184
6.5.2 USE方法 185
6.5.3 负载特征归纳 186
6.5.4 剖析 187
6.5.5 周期分析 188
6.5.6 性能监控 189
6.5.7 静态性能调优 189
6.5.8 优先级调优 189
6.5.9 资源控制 190
6.5.10 CPU绑定 190
6.5.11 微型基准测试 191
6.5.12 扩展 191
6.6 分析 192
6.6.1 uptime 192
6.6.2 vmstat 194
6.6.3 mpstat 195
6.6.4 sar 197
6.6.5 ps 198
6.6.6 top 199
6.6.7 prstat 200
6.6.8 pidstat 201
6.6.9 time和ptime 202
6.6.10 DTrace 203
6.5.11 SystemTap 209
6.6.12 perf 209
6.6.13 cpustat 215
6.6.14 其他工具 216
6.6.15 可视化 216
6.7 实验 219
6.7.1 Ad Hoc 219
6.7.2 SysBench 220
6.8 调优 220
6.8.1 编译器选项 221
6.8.2 调度优先级和调度类 221
6.8.3 调度器选项 221
6.8.4 进程绑定 223
6.8.5 独占CPU组 224
6.8.6 资源控制 224
6.8.7 处理器选项(BIOS调优) 224
6.9 练习 225
6.10 参考资料 226
第7章 内存 228
7.1 术语 229
7.2 概念 229
7.2.1 虚拟内存 230
7.2.2 换页 230
7.2.3 按需换页 231
7.2.4 过度提交 233
7.2.5 交换 233
7.2.6 文件系统缓存占用 233
7.2.7 使用率和饱和度 234
7.2.8 分配器 234
7.2.9 字长 234
7.3 架构 234
7.3.1 硬件 235
7.3.2 软件 239
7.3.3 进程地址空间 244
7.4 方法 248
7.4.1 工具法 249
7.4.2 USE方法 249
7.4.3 使用特征归纳 250
7.4.4 周期分析 251
7.4.5 性能监测 251
7.4.6 泄漏检测 252
7.4.7 静态性能调优 252
7.4.8 资源控制 253
7.4.9 微基准测试 253
7.5 分析 253
7.5.1 vmstat 254
7.5.2 sar 256
7.5.3 slabtop 259
7.5.4 ::kmstat 260
7.5.5 ps 261
7.5.6 top 262
7.5.7 prstat 263
7.5.8 pmap 264
7.5.9 DTrace 265
7.5.10 SystemTap 269
7.5.11 其他工具 269
7.6 调优 270
7.6.1 可调参数 271
7.6.2 多个页面大小 273
7.6.3 分配器 274
7.6.4 资源控制 274
7.7  练习 274
7.8 参考资料 276
第8章 文件系统 278
8.1 术语 279
8.2 模型 279
8.2.1 文件系统接口 279
8.2.2 文件系统缓存 280
8.2.3 二级缓存 281
8.3 概念 281
8.3.1 文件系统延时 281
8.3.2 缓存 282
8.3.3 随机与顺序I/O 282
8.3.4 预取 283
8.3.5 预读 284
8.3.6 写回缓存 284
8.3.7 同步写 284
8.3.8 裸I/O和直接I/O 285
8.3.9 非阻塞I/O 285
8.3.10 内存映射文件 286
8.3.11 元数据 286
8.3.12 逻辑I/O vs.物理I/O 287
8.3.13 操作并非不平等 288
8.3.14 特殊文件系统 289
8.3.15 访问时间戳 289
8.3.16 容量 289
8.4 架构 290
8.4.1 文件系统I/O栈 290
8.4.2 VFS 291
8.4.3 文件系统缓存 291
8.4.4 文件系统特性 296
8.4.5 文件系统种类 297
8.4.6 卷和池 302
8.5 方法 303
8.5.1 磁盘分析 304
8.5.2 延时分析 304
8.5.3 负载特征归纳 306
8.5.4 性能监控 308
8.5.5 事件跟踪 308
8.5.6 静态性能调优 309
8.5.7 缓存调优 310
8.5.8 负载分离 310
8.5.9 内存文件系统 310
8.5.10 微型基准测试 310
8.6 分析 312
8.6.1 vfsstat 312
8.6.2 fsstat 313
8.6.3 strace、truss 314
8.6.4 DTrace 314
8.6.5 SystemTap 323
8.6.6 LatencyTOP 323
8.6.7 free 324
8.6.8 top 324
8.6.9 vmstat 324
8.6.10 sar 325
8.6.11 slabtop 326
8.6.12 mdb ::kmastat 327
8.6.13 fcachestat 327
8.6.14 /proc/meminfo 328
8.6.15 mdb ::memstat 328
8.6.16 kstat 329
8.6.17 其他工具 330
8.6.18 可视化 331
8.7 实验 331
8.7.1 Ad Hoc 332
8.7.2 微型基准测试工具 332
8.7.3 缓存写回 334
8.8 调优 334
8.8.1 应用程序调用 335
8.8.2 ext3 336
8.8.3 ZFS 336
8.9 练习 338
8.10 参考资料 339
第9章 磁盘 341
9.1 术语 342
9.2 模型 342
9.2.1 简单磁盘 342
9.2.2 缓存磁盘 343
9.2.3 控制器 344
9.3 概念 344
9.3.1 测量时间 344
9.3.2 时间尺度 346
9.3.3 缓存 347
9.3.4 随机 vs 连续I/O 347
9.3.5 读/写比 348
9.3.6 I/O大小 348
9.3.7 IOPS并不平等 349
9.3.8 非数据传输磁盘命令 349
9.3.9 使用率 349
9.3.10 饱和度 350
9.3.11 I/O等待 350
9.3.12 同步 vs 异步 351
9.3.13 磁盘 vs 应用程序I/O 351
9.4 架构 352
9.4.1 磁盘类型 352
9.4.2 接口 357
9.4.3 存储类型 358
9.4.4 操作系统磁盘I/O栈 360
9.5 方法 363
9.5.1 工具法 364
9.5.2 USE方法 364
9.5.3 性能监控 365
9.5.4 负载特征归纳 366
9.5.5 延时分析 367
9.5.6 事件跟踪 368
9.5.7 静态性能调优 369
9.5.8 缓存调优 370
9.5.9 资源控制 370
9.5.10 微基准测试 370
9.5.11 伸缩 371
9.6 分析 372
9.6.1 iostat 373
9.6.2 sar 380
9.6.3 pidstat 381
9.6.4 DTrace 382
9.6.5 SystemTap 390
9.6.6 perf 390
9.6.7 iotop 391
9.6.8 iosnoop 393
9.6.9 blktrace 396
9.6.10 MegaCli 397
9.6.11 smartctl 398
9.6.12 可视化 399
9.7 实验 402
9.7.1 Ad Hoc 402
9.7.2 自定义负载生成器 403
9.7.3 微基准测试工具 403
9.7.4 随机读示例 403
9.8 调优 404
9.8.1 操作系统可调参数 404
9.8.2 磁盘设备可调参数 406
9.8.3 磁盘控制器可调参数 406
9.9 练习 407
9.10 参考资料 408
第10章 网络 410
10.1 术语 411
10.2 模型 411
10.2.1 网络接口 411
10.2.2 控制器 412
10.2.3 协议栈 412
10.3 概念 413
10.3.1 网络和路由 413
10.3.2 协议 414
10.3.3 封装 414
10.3.4 包长度 414
10.3.5 延时 415
10.3.6 缓冲 417
10.3.7 连接积压队列 417
10.3.8 接口协商 417
10.3.9 使用率 418
10.3.10 本地连接 418
10.4 架构 418
10.4.1 协议 418
10.4.2 硬件 421
10.4.3 软件 423
10.5 方法 427
10.5.1 工具法 428
10.5.2 USE方法 428
10.5.3 工作负载特征归纳 429
10.5.4 延时分析 430
10.5.5 性能监测 431
10.5.6 数据包嗅探 431
10.5.7 TCP分析 432
10.5.8 挖掘分析 433
10.5.9 静态性能调优 433
10.5.10 资源控制 434
10.5.11 微基准测试 434
10.6 分析 435
10.6.1 netstat 435
10.6.2 sar 440
10.6.3 ifconfig 442
10.6.4 ip 443
10.6.5 nicstat 443
10.6.6 dladm 444
10.6.7 ping 445
10.6.8 traceroute 445
10.6.9 pathchar 446
10.6.10 tcpdump 446
10.6.11 snoop 447
10.6.12 Wireshark 450
10.6.13 DTrace 450
10.6.14 SystemTap 461
10.6.15 perf 461
10.6.16 其他工具 462
10.7 实验 463
10.7.1 iperf 463
10.8 调优 464
10.8.1 Linux 465
10.8.2 Solaris 467
10.8.3 配置 469
10.9 练习 470
10.10 参考 471
第11章 云计算 473
11.1 背景 474
11.1.1 性价比 474
11.1.2 可扩展的架构 474
11.1.3 容量规划 475
11.1.4 存储 477
11.1.5 多租户 477
11.2 OS虚拟化 478
11.2.1 系统开销 479
11.2.2 资源控制 481
11.2.3 可观测性 484
11.3 硬件虚拟化 489
11.3.1 系统开销 490
11.3.2 资源控制 495
11.3.3 可观测性 498
11.4 比较 503
11.5 练习 505
11.6 参考资料 506
第12章 基准测试 508
12.1 背景 508
12.1.1 事情 509
12.1.2 有效的基准测试 509
12.1.3 基准测试之罪 511
12.2  基准测试的类型 516
12.2.1 微基准测试 517
12.2.2 模拟 518
12.2.3 回放 519
12.2.4 行业标准 519
12.3 方法 521
12.3.1 被动基准测试 521
12.3.2 主动基准测试 522
12.3.3 CPU剖析 524
12.3.4 USE方法 525
12.3.5 工作负载特征归纳 526
12.3.6 自定义基准测试 526
12.3.7 逐渐增加负载 526
12.3.8 完整性检查 528
12.3.9 统计分析 529
12.4 基准测试问题 530
12.5 练习 531
12.6 参考 532
第13章 案例研究 534
13.1 案例研究:红鲸 534
13.1.1 问题陈述 535
13.1.2 支持 536
13.1.3 上手 537
13.1.4 选择征途 538
13.1.5 USE方法 539
13.1.6 我们做完了吗 542
13.1.7 二度出击 542
13.1.8 基础 543
13.1.9 忽略红鲸 544
13.1.10 审问内核 545
13.1.11 为什么 546
13.1.12 尾声 548
13.2 结语 548
13.3 附加信息 549
13.4 参考 549
附录A USE法:Linux 551
附录B USE法:Solaris 556
附录C sar 总结 561
附录D DTrace单行命令 563
附录E 从DTrace到SystemTap 573
附录F 精选练习题答案 582
附录G 系统性能名人录 585

前言/序言

  有已知的已知;有些事情我们知道自己知道。

  我们也知道有已知的未知;这是指我们知道有些事情自己不知道。

  但是还有未知的未知——有些事情我们不知道自己不知道。

  ——美国国防部长 唐纳德·拉姆斯菲尔德 2002 年2 月12 日

  虽然上述的发言在新闻发布会上引来了记者的笑声,但是它总结出了一个重要的原则,适用于任何如地缘政治般复杂的技术系统:性能问题可能来源于任何地方,包括系统中因你一无所知而不曾检查的地方(未知的未知)。本书将揭示许多这样的领域,并为其分析提供方法和工具。

  关于本书

  欢迎来到《系统性能:企业与云计算》!本书以操作系统为背景讲解操作系统和应用程序的性能,针对企业环境和云计算环境编写而成。本书的目的是帮助你更好地利用自己的系统。当你的工作与持续开发的应用程序软件为伍,你可能会认为内核经过几十年的开发调整,操作系统的性能已是一个解决了的问题了,但事情并非如此!操作系统是一个复杂的软件体,管理着各种不断变化的物理设备,应对着不同的新应用程序的工作负载。内核也在持续地发展,不断增加新的特性以提高特定的工作负载的性能,随着系统继续扩展,所遇到的瓶颈被逐一移除。改进操作系统性能需要不断的分析和努力,这样才能带来性能的持续提升。应用程序的性能也可以在操作系统的背景下做分析,此点本书也覆盖了。

  操作系统范围

  本书的重点就是系统性能的研究,所用的工具、示例,乃至可调的参数都是Linux 系统和基于Solaris 的系统里的。除非注明,在示例中所用到的操作系统的特定发行版并不重要。基于Linux 的系统,示例所含的范围从各种裸机系统到虚拟化的运行着Ubuntu、Fedora 或CentOS的云租户。对于基于Solaris 的系统,示例也是裸机系统以及基于Joyent SmartOS 或OmniTI OmniOS 的虚拟化系统。SmartOS 和OmniOS 用的是开源的illumos 内核:这是OpenSolaris 内核的一个活跃的分支,所基于的开发版本后来成为了Oracle Solaris 11。

  覆盖两种不同的操作系统给每位读者提供了一个新的视角,帮助读者可以更深入地理解这两种系统的特点,尤其是二者设计不同的地方,并且可以帮助读者更全面地理解性能,而不只局限于某个单一的系统,这样读者可以更加客观地思考操作系统。

  过去,开发者对基于Solaris 的系统做了较多的性能工作,让其成为某些情形下更好的选择。Linux 的情况也有了很大的改观。在十多年前的System Performance Tuning出版时,作者同时介绍了Linux 和Solaris,但是更侧重后者。作者的理由是:

  Solaris 机器更多地注重性能。我怀疑这是因为Sun 的系统平均来说要比同等的Linux 系统贵得多。这带来的结果是,花大价钱的人更倾向于挑剔性能,因此Solaris 在这个领域做的工作更多。如果你的Linux 机器性能不够好,你可以再买一台并对工作负载做切分——毕竟便宜。如果花了你几百万美金的Ultra Enterprise 10000 性能不好,你公司也因此会每时每刻都在承受不小的损失,你会打Sun 的服务电话寻求答案。

  上面这段解释了Sun 注重性能的历史传统:Solaris 的利润是与硬件销售绑定的,不少资金频繁地花在性能的提升上。Sun 需要,也付得起,雇用超过100 名的全职性能工程师(包括我自己和穆苏梅奇(Musumeci Gian))。与Sun 的内核工程师团队一起,我们在系统性能领域取得了许多进展。

  Linux 在性能工作和观测工具这一块走了很长的路。尤其是现在,Linux 正在应用到大型的云计算环境之中。本书涵盖了许多Linux 的性能特性,这些特性都是在过去五年里开发起来的。

  其他内容

  示例会包括性能工具的截屏,这样做不仅是为了显示数据,而且是为了对可用的数据类型做阐释。一般来说工具展现数据的方式更为直观,很多UNIX 早期风格的工具生成的输出都是相近的,意义常常可以不言自明。这意味着屏幕截图可以很好地传递这些工具的意图,只有某些需要极少的附加说明。(如果一款工具需要费力的说明,这就很可能是一个失败的设计!)

  技术的历史演化所展示出的洞察力能深化你的理解,这些都会在书中一一讲到。除此之外,了解一些这个行业的重要人物也是很用的(这个世界很小):你很可能会碰到他们或者接触到他们在性能领域的工作成果。附录G 是一张“谁是谁”的清单。

  什么未提及

  本书着眼于性能。如果你要执行所有的示例任务,有时可能需要做些系统管理员的工作,包括软件的安装或编译(这些本书没有提及)。尤其是在Linux 上,你需要安装sysstat 软件包,还有很多书中用到的工具也有同样的要求。

  书中关于操作系统内部总结的内容会在单独的篇章中有详尽的介绍。对性能分析高阶专题的概述,是为了让你知道这些内容的存在,以便在需要的时候依靠其他的知识来源做进一步的学习。

  本书的结构

  本书的内容如下。

  第1 章,绪论。介绍系统性能分析,总结关键的概念并展示了与性能相关的一些例子。

  第2 章,方法。性能分析和调整的背景知识,包括术语、概念、模型、观测和实验的方法,容量规划,分析,以及统计。

  第3 章 ,操作系统。总结了内核内部的性能分析。对于解释和理解操作系统行为,这些是必要的背景知识。

  第4 章,观测工具。介绍系统观测工具的类型,以及构建这些工具所基于的接口和框架。

  第5 章,应用程序。讨论了应用程序性能的内容,并从操作系统的角度观测应用程序。

  第6 章,CPU。内容包括处理器、硬件线程、CPU 缓存、CPU 互联,以及内核调度。

  第7 章,内存。虚拟内存、换页、swapping、内存架构、总线、地址空间和内存分配器。

  第8 章,文件系统。文件系统I/O 性能,包括涉及的不同缓存。

  第9 章,磁盘。内容包括存储设备、磁盘I/O 工作负载、存储控制器、RAID,以及内核I/O子系统。

  第10 章,网络。 网络协议、套接字、接口,以及物理连接。

  第11 章,云计算。介绍广泛应用于云计算的操作系统级和硬件级虚拟化方法,以及这些方法的性能开销、隔离和观测特征。

  第12 章,基准测试。介绍如何精确地做基准测试,如何解读别人的基准测试结果。这是一个棘手的话题,这一章会告诉你怎样避免常见的错误,并试图理解这一点。

  第13 章,案例研究。包含一个系统性能的案例研究,讲述了如何从始至终地分析一个真实的云客户案例。

  第1~4 章提供了必要的背景知识。阅读完这几章后,你可以根据需要参考本书的其余部分。

  第13 章的写法是不同的,该章用讲故事的方法描绘了性能工程师的工作场景。如果你是性能分析的新手,想先了解个大概,可能会想先读读这一章,当读完其他章的时候还可以再次重温。

  作为未来的参考

  通过着力于系统性能分析的背景知识与方法,本书的编写经得起推敲。

  为了做到这一点,许多章都被分为了两个部分。一部分的内容组成是术语、概念和方法(一般附有标题),这些内容许多年后应该还依然中肯适用。另一部分的内容是前一部分如何实现的示例:架构、分析工具,还有可调参数。这部分内容即便有朝一日淘汰了,作为示例讲解也是依然有用的。

  跟踪示例

  我们经常需要深入探索操作系统,这项工作要用到内核跟踪工具。有很多这样的工具,它们所针对的开发阶段也各不相同,例如,ftrace、perf、DTrace、SystemTap、LTTng 和ktap。其中有一款工具被选择用在了绝大多数的跟踪示例中,并在Linux 和基于Solaris 的系统上都有演示:它就是DTrace。该工具提供了这些示例所需要的功能,并且关于它还有大量的外部参考资料,包括可以用于高级跟踪的脚本。

  你可能需要或愿意选用别的跟踪工具,这很好。DTrace 的示例展示的是你能向系统掷出的问题。这些问题以及提出这些问题的方法,常常才是最困难的。

  目标受众

  本书的目标受众主要是系统管理员以及企业与云计算环境的运维工程师。所有需要了解操作系统和应用程序性能的开发人员、数据库管理员和网站管理员都适合参阅本书。

  作为云计算提供商的首席性能工程师,我的工作会与支持人员和顾客打交道,他们经常要承受巨大时间压力去解决多个性能问题。对于许多人来说,性能并不是他们的主要工作,但却需要了解足够多的性能知识来解决手头的问题。因为清楚读者学习本书的时间会非常有限,我将本书编写得尽可能简洁。但不会简短:有太多知识需要覆盖才能保证你是准备好了的。

  另一个受众群体是学生:本书适合作为系统性能课程的补充教材。在本书的编写期间(以及开始动笔的多年以前)我就曾经教授过这样的课程,并帮助学生解决仿真的性能问题(事前不会公布答案!)。这段经历帮我弄清了什么样的材料能最好地引导学生解决性能问题,这也成就了本书的部分内容。

  无论你是不是学生,每章的习题都会带给你一个审视和应用知识的机会。其中有一些可选的高阶练习,可能你完成不了(也许做不到,但至少可以启发思维)。

  本书涵盖了足够的知识细节,无论是大公司还是小公司,乃至雇用了不少性能专职人员的公司,本书都可以满足其需要。对于众多的小型公司,日常用到的可能只是书中的某些部分,但本书作为参考也可备不时之需。

  排版约定

  本书贯穿始终用到的排版约定如下:

  netif_receive_skb() 函数名

  iostat(1) Man 手册

  Documentation/ . . . Linux 文档

  CONFIG_ . . . Linux 配置选项

  kernel/ . . . Linux 内核源代码

  fs/ Linux 内核源代码,文件系统

  usr/src/uts/ . . . 基于Solaris 内核源代码

  # 超级用户(root)shell 提示符

  $ 普通用户(non-root)shell 提示符

  ^C 命令被中断(Ctrl+C)

  [...] 文本截断

  mpstat 1 键入的命令或高亮的文字

  致谢

  Deirdré Straughan 再次提供了不可思议的帮助,使我对技术教育的热忱得以延伸至另一本书。从想法到手稿,从最开始就帮助我构想这本书是什么样子,到花费了无数的时间编辑和讨论每一页的内容,找出了许多我没有解释清楚的部分。至今我和她已经合作了超过了2000 页的技术内容(加上博客),能得到如此大的帮助我深感荣幸。

  Barbara Wood 作为拷贝编辑,花了大量的时间在本书的细节上,做了无数的修改,文字才有了现在的质量、可读性和连贯性。考虑到本书的长度和复杂性,这项工作绝不简单,我非常感谢Barbara 的帮助和他辛勤的工作。

  对于每一位给予本书反馈的人,我都心怀感激。这是一本深层次的技术书,有很多新内容需要严谨的审阅——经常需要频繁地反复确认和理解不同内核的内核代码。

  不管是深层次的技术还是材料的组织和展示,Darryl Gove 都给予了无与伦比的反馈意见。他本身就是一个作家,看到他是如此迫切地向我们的读者提供最好的内容,我非常期待着他将来的著作。

  我还非常感谢Richard Lowe 和Robert Mustacchi,他们通审了整本书,发现了我所缺失的内容和一些需要做更好阐述的部分。Richard 对不同内核的内部机理的理解令人震惊,厉害得甚至有点可怕。Robert 对云计算章节给予了极大的帮助,他还将自己在KVM 上的工作专长转移到了illumos 上。

  感谢Jim Mauro 和Dominic Kay 的反馈意见:我曾经与他们一起出过书,理解艰深的技术内容,再把这些内容解释给读者,他们是此中的天才。

  Jerry Jelinek 和Max Bruning,两人都有着内核工程的专长,提供了多章的详尽反馈。

  Adam Leventhal 对“文件系统”一章和“磁盘”一章给予了专家级建议,特别是帮我理解了闪存当前的细微差别——他在这个领域有着长期的经验,在Sun 公司的时候就发明过不少闪存创新性的使用方法。

  David Pacheco 对“应用程序”一章给予了极好的反馈, Dan McDonald 则是对“网络”那一章,我很幸运可以让他们在自己如此了解的领域把他们自己的技术展示出来。

  Carlos Cardenas 看过了整本书,在统计分析方面给予了独特的建议,这些建议正是我之前一直所追寻的。

  我很感激Bryan Cantrill、Keith Wesolowski、Paul Eggleton、Marsell Kukuljevic-Pearce 和Adrian Cockcroft,为他们的反馈和贡献。Adrian 的意见促使我重新排列章节顺序,这让读者可以更好地关联所覆盖的内容。

  我感谢在我之前的作者们,他们的名字都列在了参考附录之中,是他们铺就了通往系统性

  能的道路并把自己的发现记录了下来。感谢与我一同工作多年的性能专家们,包括Bryan Cantrill、Roch Bourbonnais、Jim Mauro、Richard McDougall,等等。我从他们身上学到了很多很多。

  感谢Bryan Cantrill 对这个项目的支持,感谢 Jason Hoffman 的热忱。

  感谢Claire、Mitchell 和其他家人朋友为支持我这个项目所做出的牺牲。

  特别要感谢Pearson 公司的高级总监Greg Doench,感谢他的帮助、耐心和对项目的建议。

  我很享受本书编写的过程,即使期间也有过不时的气馁。要是十年前的话,我写起来会容易得多,那时候我对复杂性和系统性能微妙的所知不及现在,我在企业、存储和云计算领域做过软件工程师、内核工程师和系统工程师。无论是栈的各个层级,还是从应用程序到硬件,在所有这些地方我都处理过性能问题。这些经历,我知道还有好多都还没有记录下来。所有这些既让我受过挫,也激励着我把它们写下来。这本书是我一直想要写就的,本书的完成是我莫大的安慰。

  译者序

  作为一名运维工程师,系统出现一些“诡异”问题的情况并不罕见。有些时候面对束手无策的问题着实让人头痛,这时我总会感慨,学生时代课本上计算机科学那些诸多的概念和理论所呈现出的完美感觉更多是在书本上,在真实系统中往往更多是另外一幅更为“现实”的景象。工作多年后,我自发形成了一个简单的认知:当系统庞大到一定程度时,其复杂性会变得不容易控制是一件很正常的事情。用技术手段把这些“失控”的点妥善摆平就是工程师价值的体现。在翻译本书的过程中,我对这个问题又有了不同的认识:

  “已知的已知,已知的未知,未知的未知。”

  这是本书多次提到过的概念,说的是有些事情我们知道自己知道,有些事情我们知道自己不知道,还有些事情我们不知道自己不知道。这个概念就系统(特别是复杂系统,诸如云计算或大数据)而言,特别贴切:就系统内部来说,无论用到的是某一操作系统,还是某一编程语言,其实本身就已经是复杂度较高的实体,要透彻掌握并非易事,何况系统皆由这些技术组合构建而成,方方面面无所不知是不可能做到的事情,这里的未知源于技术本身的复杂;就系统外部来说,如今时事变化一日千里,现在系统要处理的外界变化,可能最初的系统设计者都从未想过,这里的未知来源于未来的不定。所以,有让你手足无措的问题出现其实是一种很正常的状态,对此的恐惧只是人施加给自己的情感层面的东西。与此相反,始终对未知心生敬畏才是对待未知正常的态度,更是本应有的觉悟。

  这里并不是说我们要对未知“投降”,而是说对“未知”有正确的认识才是我们取得进步的前提。其实我们多数人对“系统的未知”存在误区,我们常常将系统等同于具象的技术实体,例如某种编程语言、OS 内核、网络。总觉得系统出问题肯定是我某些技术知识有漏洞没学好。可惜“学海无涯,而吾生有涯,以有涯随无涯,殆矣”,拘泥于各种眼花缭乱的技术只会让自己迷失造成时间的浪费。技术都是末节,真正要把握的主体其实只是系统本身。道理虽简单,但舍本逐末的事情却还是屡见不鲜。

  要做好这一点,首要的是要有全局的系统观。更准确地说,是要有对系统各层知识的理解和实践能力,要有对系统架构的认知和理解的能力。只有对系统了如指掌,才有希望将已知的未知转化为已知的已知,将未知的未知转化为已知的未知,进而增加对系统的掌控能力,避免盲人摸象的悲剧。事实的真相是也本应是这样:技术的价值依附于系统及其价值,没有孤立存在的技术,一切价值的体现都在于系统本身。唯有立足系统本身,工程师才能打通性能这条经脉,领略到性能之巅的风采!

  回观《性能之巅》这本书,全书的安排也深有此意。本书第1~5 章可谓是精华部分,讲述了与系统性能相关的通用模型和通用方法;第6~12 章才落实到具体的知识细节,讲述各性能组件(CPU、内存等)的知识(第6~10 章)、云计算的基础(第11 章),基准测试的方法(第12 章)。本书最后一章是一个性能分析的实例,若是让长期与系统打交道的工程师读来,必然感同身受;若是性能新手阅读,则可以对性能工作的日常状况有个基本的了解。

  本书是一座桥梁,作者Brendan 是在系统性能领域耕耘多年的技术专家,在Sun 和Oracle公司有过卓越的贡献,动态跟踪工具DTrace 就是他主力开发的,他用自己多年的经验和实践归纳并总结出了系统性能的理论和方法,这些理论和方法的作用就像桥梁,把业界可用的工具(或是你自己开发的工具)与系统内部的原理机制联通让它们有机地结合起来,让与性能相关的工作(无论是性能分析还是性能调优)做到有的放矢、有章可循!这与单纯提供知识的技术书籍截然不同,“授人以鱼不如授人以渔”,其立意确实难能可贵。

  现代IT 技术的源头并非中国,但IT 技术在这片土地上生根发芽,欣欣向荣。如今国人日常生活中所依赖的系统服务已经比比皆是,不信者打开自己的手机数数所装的App 自然清楚,这些App 背后多半都有远在某个数据中心的一个或多个系统作为支撑。随着互联网技术向各行业以及生活各方面的渗透,这样的系统今后会越来越多。加之伴随着云计算和大数据技术的兴起和蓬勃发展,除了系统越来越多之外,系统自身还会变得越来越庞大和复杂。在这么一个总的大趋势下,系统性能的重要性自然不言而喻。你会发现Brendan 所著的《性能之巅》是如此地契合我们这个时代,本书不是第一本论述系统性能的书,但本书对现有系统性能的方法和理论所做的提炼、概括和归纳,不敢说后无来者,但绝对可以称得上是前无古人的了。

  全书翻译由EMC 资深软件工程师吴寒思、点融网资深运维工程师陈磊与我共同完成,在此感谢二位的辛苦耕耘和我们作为团队三人之间彼此的精诚合作,一年多的翻译历程,大量的时间和精力的投入自是不提,但回过头来看整个过程于我们译者自觉仍是获益良多的。本书内容量大涉及面广,尽管我们付出了许多的辛苦和努力,还是难以避免错误的出现,仍会存在一些不尽如人意的地方,欢迎广大读者批评指正,以便改进。

  感谢博文视点出版社主编张春雨对本书出版的大力支持,感谢编辑贾莉对本书的悉心校对;感谢高博学长在翻译道路上给予我的指引;在本书成稿过程中,感谢EMC 蔡小华、EMC 陈立、EMC 胡世杰、百度冯玮、百度林向东、百度文立经理、淘宝的林应经理,还要感谢我所在的团队上海百度研发中心离线运维组的同事们。另外,更要感谢我的父母和女友吴颖对我的理解和支持。愿这本书的出版给你们带来快乐。

  徐章宁

  于百度上海研发中心

  2013 年7 月


《代码的艺术:重构、优雅与高效的编程之道》 引言 在数字世界的基石之上,代码是构建一切的语言。它承载着逻辑,驱动着创新,也塑造着我们与技术互动的方方面面。然而,代码并非一成不变的僵化指令,而是一门不断演进的艺术。本书《代码的艺术:重构、优雅与高效的编程之道》并非关于系统性能的极致优化,也不是关于企业级架构的宏大蓝图,更非探讨云计算的未来趋势。相反,它将深入代码的微观世界,聚焦于程序员日常工作中最为直接、也最能体现个体功力的方面:如何写出更优雅、更具可读性、更易于维护、并最终更为高效的代码。 在这个信息爆炸、技术迭代日新月异的时代,软件的复杂性日益增加,开发周期却要求越来越短。在这种环境下,一个写得“好”的代码,其价值远超仅仅能够工作的代码。它意味着更低的维护成本,更快的迭代速度,更少的潜在bug,以及更顺畅的团队协作。本书的目标,便是带领读者穿越代码的迷雾,掌握那些能够将平凡代码转化为卓越艺术的技巧与原则。 第一篇:重塑代码的灵魂——精炼与清晰 代码的“重构”并非简单的修改,而是一种有意识的、结构化的改进代码内部设计,使其更容易理解和修改,同时不改变其外在行为的过程。这就像一位雕塑家,在保留作品神韵的基础上,剔除多余的石块,打磨出更完美的线条。 命名艺术:意义与简洁的平衡 变量、函数、类、模块的命名,是代码清晰度的第一道门槛。一个糟糕的命名,足以让最简单的逻辑变得晦涩难懂。本书将深入探讨命名时应遵循的原则: 明确意图: 名称应清晰地表达其所代表的实体或操作的目的。避免使用含糊不清、模棱两可的词语。例如,`processData`远不如`validateUserData`或`calculateOrderTotal`来得具体。 一致性: 在整个项目乃至团队中,建立统一的命名约定。例如,布尔值变量可以前缀`is_`或`has_`,常量使用全大写字母并用下划线分隔。 避免误导: 不要使用与实际功能不符的名称,例如,一个名为`getUserInfo`的函数如果返回的是用户ID,则极易引起混淆。 简洁有力: 在保证明确性的前提下,尽量保持名称的简洁。过长的名称会增加输入负担,并可能导致阅读疲劳。 富有表现力: 好的名称本身就应该讲述一个故事,传达信息。它应该能让其他开发者(或未来的自己)在不查看函数体的情况下,大致了解其作用。 我们将通过大量实际代码示例,展示从坏的命名到好的命名的演变过程,以及在不同场景下如何选择最恰当的名称。 函数设计:单一职责与小巧玲珑 函数是代码的基本单元,其设计质量直接影响到代码的可读性、可测试性和可维护性。本书将重点剖析优秀函数的设计原则: 单一职责原则 (SRP): 一个函数只应做一件事情,并且做好。这意味着函数不应该承担过多的责任,例如,一个函数不应同时负责数据的验证、处理和输出。我们将学习如何识别和拆分具有多个职责的函数。 短小精悍: 理想的函数应该尽可能短小。过长的函数往往意味着它承担了过多的逻辑,难以理解和调试。我们将探讨如何通过提取局部变量、封装逻辑块等方式来缩短函数。 减少参数: 参数过多是函数设计糟糕的常见信号。过多的参数不仅增加了调用时的复杂度,也暗示了函数可能承担了过多的职责。我们将讨论如何通过引入参数对象、使用函数式编程的技巧来减少参数数量。 明确的返回值: 函数的返回值应该清晰、明确,避免返回多个类型不确定的值,或者通过副作用来传递信息。 可读性优先: 函数的内部逻辑应该清晰易懂,使用有意义的变量名和适当的注释。 模块化与内聚:构建稳定健康的结构 将复杂的系统分解为相互独立的模块,是管理软件复杂性的核心策略。本书将深入探讨模块化设计的精髓: 高内聚: 模块内的元素(变量、函数、类)应该紧密相关,共同完成一个特定的功能。高内聚的模块更容易理解、测试和重用。 低耦合: 模块之间的依赖关系应该最小化。模块间的紧密耦合意味着一个模块的修改可能导致其他模块出现问题,增加维护难度。我们将学习如何通过接口、抽象和事件驱动等方式来降低模块间的耦合度。 封装: 模块应该隐藏其内部的实现细节,只暴露必要的接口。这使得模块的内部实现可以独立于外部进行修改,而不会影响使用它的其他部分。 依赖注入: 作为一种重要的解耦技术,我们将探讨如何通过依赖注入来减少模块间的硬编码依赖,提高代码的灵活性和可测试性。 第二篇:代码的优雅之道——美学与可读性 代码的美学并非纯粹的视觉享受,而是逻辑清晰、结构合理的体现。优雅的代码如同精美的建筑,不仅功能强大,而且赏心悦目,易于理解和欣赏。 代码风格的一致性:团队协作的基石 统一的代码风格是团队协作的润滑剂。无论是个人的编码习惯如何,在团队项目中,一致性是绝对必要的。本书将强调: 自动化工具: Linting工具(如ESLint, Pylint, Checkstyle)和代码格式化工具(如Prettier, Black)能够自动检查和修正代码风格问题,极大地减轻了人工检查的负担。 团队约定: 建立明确的代码风格指南,并在团队内部强制执行。这包括缩进、空格、换行、命名约定等方方面面。 版本控制中的应用: 将代码风格检查集成到提交(commit)或合并请求(pull request)流程中,确保代码在进入主分支前符合规范。 避免“魔法数字”与“硬编码”:让代码充满生命力 “魔法数字”是指代码中出现的、没有明确含义的字面量数字,如 `if (status == 3)`。而“硬编码”则泛指将固定值直接写在代码中。这些做法严重降低了代码的可读性和可维护性。本书将倡导: 常量化: 将这些字面量值定义为具有明确意义的常量,例如 `const STATUS_APPROVED = 3; if (status == STATUS_APPROVED)`。 配置文件: 对于需要在不同环境下调整的配置信息,使用配置文件(如`.env`, `.json`, `.yaml`)来管理,而不是将其硬编码在代码中。 枚举: 对于一组相关的常量,使用枚举(enum)来组织,增强代码的可读性和类型安全性。 注释的艺术:点睛之笔而非累赘 注释是代码的说明,但并非越多越好。好的注释能够解释“为什么”和“如何”,而不是仅仅重复代码做了什么。我们将探讨: 解释复杂逻辑: 对于晦涩难懂的算法、特殊的设计决策,需要用清晰的注释来解释其原因和实现方式。 标记TODO与FIXME: 用于标记待办事项或已知问题,提醒开发者后续需要改进的地方。 文档注释: 对于公共API(函数、类),编写清晰的文档注释,说明其功能、参数、返回值以及可能的异常。 避免冗余注释: 不要注释那些显而易见的代码,例如 `i++; // 增加i`。过多的冗余注释反而会干扰阅读。 保持注释与代码同步: 当代码发生变化时,务必同步更新相关的注释,避免误导。 第三篇:高效编程的实践——简洁与可维护性 高效的编程不仅仅是执行速度快,更重要的是能够以最少的投入产出最大的价值,并且易于长期维护和演进。 DRY 原则 (Don't Repeat Yourself):消除代码冗余 DRY原则是软件开发中最核心的原则之一,它强调“不要重复自己”。重复的代码会增加出错的概率,并且在修改时需要同步修改多个地方,效率低下。本书将深入讲解: 提取函数/方法: 将重复的代码块提取成独立的函数或方法。 创建类/模块: 将重复的属性和行为封装到类或模块中。 使用模板或生成器: 对于某些重复模式,可以使用代码模板或生成器来自动化。 继承与组合: 学习如何利用面向对象的设计模式来复用代码。 KISS 原则 (Keep It Simple, Stupid):保持简单 KISS原则鼓励在设计和实现中尽量保持简单。复杂的解决方案往往更容易出错,也更难理解和维护。我们将探讨: 选择最简单的解决方案: 避免过度设计,选择能够满足当前需求的、最直接的解决方案。 分解复杂问题: 将复杂的问题分解成一系列更小的、可管理的部分。 避免不必要的抽象: 只有当确有必要时才引入抽象层。 清晰的控制流: 编写易于理解和追踪的控制流,避免过多的嵌套和复杂的条件判断。 SOLID 原则:面向对象设计的基石 SOLID是一组面向对象设计原则的首字母缩写,它们有助于构建易于理解、灵活且可维护的软件系统。本书将逐一讲解: S - 单一职责原则 (Single Responsibility Principle): 每个类或模块应该只有一个引起它变化的原因。 O - 开闭原则 (Open/Closed Principle): 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 L - 里氏替换原则 (Liskov Substitution Principle): 子类型必须能够替换掉它们的基类型,而程序的行为不会改变。 I - 接口隔离原则 (Interface Segregation Principle): 客户端不应该被迫依赖于它不使用的方法。 D - 依赖倒置原则 (Dependency Inversion Principle): 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 通过丰富的代码示例,我们将展示如何在实际开发中应用这些原则,以及它们如何帮助我们构建更健壮、更易于扩展的系统。 测试驱动开发 (TDD) 与行为驱动开发 (BDD) 的实践 虽然本书不是专门关于测试的书籍,但高质量的代码离不开有效的测试。我们将简要介绍TDD和BDD的核心思想: TDD: 先编写测试用例,然后编写刚好能通过测试的代码,最后进行重构。这种方式能够确保代码的可测试性,并指导开发过程。 BDD: 将需求转化为可执行的规范,并在此基础上进行开发。BDD强调开发人员、测试人员和业务人员之间的协作。 学习这些实践,能够帮助开发者写出更健壮、更符合预期的代码。 结语 《代码的艺术:重构、优雅与高效的编程之道》所追求的,并非是那些深奥难懂的理论,也不是那些仅存于学术论文中的概念。它是一本实实在在的实践指南,旨在帮助每一位开发者,无论其经验水平如何,都能在日常的编码工作中,提升代码的质量,从而构建出更可靠、更易于维护、也更具生命力的软件。 掌握了这些代码的艺术,你将不再是那个仅仅“让代码跑起来”的程序员,而是一位能够用代码雕琢出艺术品的匠人。你的代码将不再是晦涩难懂的机器指令,而是清晰、优雅、高效的语言,是通向成功的坚实阶梯。希望本书能成为你在这条通往代码艺术之路上的良伴。

用户评价

评分

整本书的最后一部分,聚焦于“面向未来的性能优化趋势”,给我留下了深刻的印象。作者并没有停留在当前的技术层面,而是展望了未来性能优化的方向。他关于“AI 在性能优化中的应用”、“自动化性能测试”的讨论,让我对未来的技术发展有了更清晰的认识。我之前就听说过 AI 可以帮助优化系统,但这本书给出了更具体的应用场景,比如智能调参、异常检测、预测性维护等等。作者还提到了“量子计算”和“生物计算”对未来性能可能带来的颠覆性影响,虽然这些目前还比较遥远,但这种宏大的视野,着实令人惊叹。他对“绿色计算”和“可持续性”的关注,也让我意识到,性能优化不仅仅是为了追求极致的速度,更要兼顾资源效率和环境影响。这本书的结尾,并没有仅仅是技术的堆砌,而是上升到了哲学层面,探讨了“技术伦理”和“人类的未来”与性能优化的关系。这种深度和广度,是我在这类技术书籍中从未见过的。总而言之,《性能之巅》是一本集理论、实践、前瞻性于一体的杰作,强烈推荐给所有对性能优化感兴趣的读者。

评分

这本书的第四部分,关于“性能监控与故障排除”,是实践性最强的一章。我之前的很多性能问题都是在生产环境中爆发后才去处理,往往措手不及。作者在这部分,系统地介绍了各种性能监控工具和方法,从基础的日志分析到高级的可观测性平台,都有详尽的讲解。他强调了“告警机制”的重要性,以及如何设置合理的阈值来及时发现潜在的性能问题。我尤其喜欢作者在讲解“故障定位”时,那种“大海捞针”的比喻。他教我们如何通过日志、链路追踪、Metrics 等多维度的数据,层层深入,最终找到问题的根源。其中关于“性能回归测试”的章节,让我意识到,很多性能问题是在代码更新后引入的,而及时有效的回归测试可以有效地避免这种情况。他还分享了一些“常见性能故障的排查思路”,比如 CPU 飙升、内存泄漏、网络抖动等,这些都非常实用。读完这一部分,我感觉自己就像获得了一本“性能故障排除秘籍”,在面对生产环境的性能问题时,能够更加从容和自信。

评分

《性能之巅》的第三个部分,聚焦于“云计算时代的性能挑战”,这部分内容对我来说,简直是及时雨。我们公司最近也在大力推进云原生转型,但过程中遇到了不少性能方面的困惑。作者在这个部分,将云计算的特性与性能优化紧密结合,提出了很多独到的见解。他关于“容器化与性能”、“微服务架构在云上的性能表现”的论述,非常深入。我印象深刻的是,作者在分析“云服务商的性能差异”时,并没有泛泛而谈,而是结合了具体的云厂商(虽然书中没有点名,但读者的经验可以对号入座),分析了不同云服务在网络、存储、计算能力上的细微差别,以及这些差别如何影响应用的性能。他还详细讲解了“弹性伸缩”和“负载均衡”在云计算中的关键作用,以及如何通过合理的配置来优化性能,避免资源浪费。最让我惊喜的是,作者还提到了“Serverless”架构对性能的影响,以及如何在这种新型架构下进行性能监控和调优。这部分内容非常有前瞻性,让我对云计算的性能优化有了全新的认识,也为我们团队的云原生实践提供了宝贵的指导。

评分

刚看完《性能之巅:洞悉系统、企业与云计算》的第一部分,简直是醍醐灌顶!作者的叙事方式非常引人入胜,他并没有一开始就抛出一大堆晦涩的技术名词,而是从一个非常宏观的视角切入,用生动的比喻和现实的案例,将我们带入了一个对“性能”本质的探索之旅。我尤其喜欢作者在讲解“系统性能”时,那种层层剥茧的逻辑。他没有仅仅停留在CPU、内存、磁盘这些基础概念,而是深入探讨了它们之间的相互作用,以及在真实负载下,这些组件是如何成为瓶颈的。其中关于 I/O 瓶颈的那几章,我反复看了好几遍,作者用一个简单的电商网站秒杀场景,就把复杂的磁盘调度、缓存机制、网络延迟等问题描绘得淋漓尽致。我之前总觉得性能问题是某个环节出了问题,但这本书让我明白,性能是一个系统性的问题,需要从全局出发去审视。而且,作者的语言非常接地气,即使是刚接触性能优化的新手,也能通过他的讲解,建立起对系统性能的基本认知。他强调的“测量是优化的前提”,这句话看似简单,但真正做起来却知易行难,这本书无疑为我指明了方向,让我知道从哪里着手,如何科学地进行性能分析。

评分

这本书的第二个部分,关于“企业级性能优化”,让我眼前一亮。我之前的工作主要集中在单体应用性能调优,但随着业务的扩展,微服务和分布式系统的出现,让我感到力不从心。这本书恰好填补了我的知识空白。作者在探讨企业级性能时,并没有回避分布式系统的复杂性,而是巧妙地将“ CAP 定理”、“一致性哈希”等概念融入到性能优化的语境中。他特别强调了服务间的依赖关系对整体性能的影响,以及如何通过合理的架构设计来规避这些风险。我最欣赏的是作者在讲解“分布式事务”和“消息队列”的性能考量时,那种权衡利弊的分析。他没有简单地推荐某种技术,而是让我们思考在不同的业务场景下,哪种方案更适合。这种辩证的思维方式,对于我们在实际工作中做出技术决策至关重要。此外,作者还分享了一些在大型企业中常见的性能问题,比如“数据存储的性能挑战”、“缓存策略的演进”等等,这些都极具参考价值。读完这一部分,我感觉自己对构建和维护高性能的企业级系统,有了更深刻的理解,也更有信心去应对未来的技术挑战。

评分

这本没有包装,看上去像二手。

评分

还不错,从环境的角度讲性能

评分

没有包膜!书表面有磨痕!如图,书后面标签贴的也不好!总体感觉不好

评分

书籍不错,正版的,同事挺喜欢,很给力很赞

评分

此用户未及时填写评价内容,系统默认好评!

评分

换了一次,其实还是烂的,还是算了吧,不换了。

评分

运维经典之作,好书一本

评分

还没看,经典读物!!!!!

评分

书写的很好,大牛写的书,包装好,送货快。好

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有