一、全书概览
一句话总结
分布式系统的性能优化不能靠头痛医头,需要从一行代码(点)、一条执行路径(线)、一个模块(面)到整个系统(体)四个维度协同发力,构建完整的优化体系。
这本书的切入点很明确:市面上讲性能优化的书不少,但多数只盯着某一层——要么讲 JVM 调优,要么讲数据库索引,要么讲前端渲染。五位作者(均来自一线互联网公司)想做的事是把整条链路串起来,给出一个全栈视角的性能优化框架。
书里反复强调一个理念:"没有绝对的好设计,只有适合的设计"。这句话听起来像正确的废话,但在性能优化领域其实很有针对性——太多工程师迷信某个"银弹"方案(比如缓存能解决一切),结果在错误场景下反而引入了更多问题。
全书结构
| 篇 | 章节 | 主题 | 一句话概括 | |---|---|---|---| | 认知篇 | 第1章 | 软件架构的时空观 | 从时间和空间两个基本维度理解架构设计的本质 | | 认知篇 | 第2章 | 软件性能的时空观 | 性能问题的根因往往隐藏在时空权衡之中 | | 认知篇 | 第3章 | 软件性能优化体系 | 构建"点-线-面-体"四维优化方法论 | | 认知篇 | 第4章 | 性能测试与评估 | 没有度量就没有优化,先建立基线再谈改进 | | 实践篇 | 第5章 | 网络性能 | 网络是分布式系统的命脉,延迟和带宽是两个永恒的敌人 | | 实践篇 | 第6章 | 通信性能 | RPC、序列化协议的选择直接影响系统吞吐 | | 实践篇 | 第7章 | 客户端/前端性能优化 | 用户感知的性能才是真正的性能 | | 实践篇 | 第8章 | 单服务实体的性能优化 | 线程模型、连接池、内存管理是单机优化的三板斧 | | 实践篇 | 第9章 | 数据库性能 | 索引、锁、事务隔离级别的取舍决定数据库上限 | | 实践篇 | 第10章 | 缓存的应用 | 缓存是性能优化的利器,也是一致性问题的温床 | | 实践篇 | 第11章 | 消息队列 | 解耦和削峰填谷,但引入了新的复杂度 | | 案例篇 | 第12章 | 小度音箱的性能优化 | IoT 场景下的资源受限型优化 | | 案例篇 | 第13章 | 网上商城的性能优化 | 高并发电商场景的全链路优化实战 | | 案例篇 | 第14章 | 营销红包的性能优化 | 典型并发场景——如何扛住红包雨 | | 案例篇 | 第15章 | 支付系统/核心交易系统的性能优化 | 金融级系统的极致性能与极致可靠性 | | 扩展篇 | 第16章 | 全链路性能压测 | 如何模拟真实流量进行系统性压测 | | 扩展篇 | 第17章 | 云原生技术为性能带来的机遇与变革 | 容器化、Serverless 等新技术对性能的影响 |
二、逐章要点
第1章:软件架构的时空观
核心观点
软件架构的本质是对时间和空间资源的分配策略。每一个架构决策,都是在用一种资源换另一种资源。
这章试图建立一个认知框架:所有架构问题都可以映射到时间(延迟、吞吐、响应时间)和空间(内存、存储、带宽)两个维度上。这个视角的好处是统一了——不管你面对的是缓存策略、数据分区还是服务拆分,都可以用"时空权衡"这个标尺来衡量。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | 时间复杂度 | 算法执行时间随输入规模的增长关系 | 数据量翻倍,耗时翻几倍 | | 空间复杂度 | 算法所需存储空间随输入规模的增长关系 | 数据量翻倍,内存吃几倍 | | 时空权衡 | 用空间换时间(缓存)或用时间换空间(压缩) | 天下没有免费的午餐,选一个你愿意付的 | | 架构演进 | 随业务规模增长,架构从单体走向分布式的必然过程 | 不是"想不想拆",是"不拆不行了" |
行动清单
- [ ] 审视当前系统的架构决策,识别出哪些是"时空权衡"的结果
- [ ] 画出系统的时间维度图(请求链路上每个节点的耗时分布)
- [ ] 画出系统的空间维度图(每个服务的内存/存储使用情况)
第2章:软件性能的时空观
核心观点
性能问题从来不是孤立的,它是架构决策在运行时的投影。
如果说第1章讲的是"设计时"的时空观,这章关注的就是"运行时"。作者引入了几个关键的性能指标分类:
- 响应时间(Response Time):用户最直观的感受
- 吞吐量(Throughput):系统单位时间能处理的请求数
- 资源利用率(Resource Utilization):CPU、内存、磁盘、网络的使用率
这三者之间存在一个经典的三角关系:追求低延迟往往牺牲吞吐量,追求高吞吐往往拉高资源利用率,而资源利用率过高时延迟又会急剧上升(排队效应)。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | 延迟 vs 吞吐 | Little's Law 描述的系统守恒关系 | 队列越长,延迟越高,但吞吐可以维持 | | 尾延迟(P99/P999) | 最慢的 1%/0.1% 请求的响应时间 | 平均值会骗人,长尾才是用户真正感受到的 | | Amdahl 定律 | 系统加速比受限于串行部分的比例 | 一个程序 50% 串行,无论怎么并行最多快 2 倍 | | 通用加速比 | Gustafson 定律,增加问题规模时并行效率 | 不是加速固定问题,而是处理更大的问题 |
行动清单
- [ ] 为你的服务加上 P50/P90/P99/P999 延迟监控
- [ ] 用 Little's Law 估算当前系统的理论吞吐上限
- [ ] 找出系统中的串行瓶颈(Amdahl 定律的"不可并行"部分)
第3章:软件性能优化体系
核心观点
性能优化的"点-线-面-体"四维模型,是全书的方法论核心。
这是全书最关键的一章,因为它搭建了整个优化体系的骨架:
点(代码级):单条语句、单个函数的优化。比如用 StringBuilder 代替字符串拼接、减少不必要的对象创建、选择合适的数据结构。这是程序员最熟悉的优化层次。
线(路径级):一个请求从进入到返回的完整执行路径。比如减少一次远程调用、合并多次数据库查询、优化调用链路。这一层关注的是"路走对了没有"。
面(模块级):一个子系统或服务的整体性能。比如服务的线程模型设计、连接池配置、缓存策略。这一层关注的是"组织架构对不对"。
体(系统级):多个服务协同工作的整体性能。比如服务间的负载均衡策略、全局的容量规划、跨服务的性能瓶颈定位。这一层关注的是"生态是否健康"。
| 维度 | 优化对象 | 典型手段 | 影响范围 | |---|---|---|---| | 点 | 单行代码/函数 | 算法优化、数据结构选择 | 局部 | | 线 | 请求执行路径 | 调用链路优化、批量处理 | 单请求 | | 面 | 模块/服务 | 架构调整、缓存策略、连接池 | 单服务 | | 体 | 整个系统 | 负载均衡、容量规划、全链路优化 | 全局 |
行动清单
- [ ] 梳理当前系统在四个维度的优化现状,找出最薄弱的一层
- [ ] 建立从"点"到"体"的逐层性能优化 checklist
- [ ] 避免"只看点不看体"的局部优化陷阱
第4章:性能测试与评估
核心观点
没有度量就没有优化。性能测试不是为了证明系统够快,而是为了发现系统在哪里慢。
这一章讲了性能测试的方法论和工具链,包括:
- 基准测试(Benchmark):在可控条件下测量特定组件的性能
- 负载测试(Load Test):模拟正常负载下的系统表现
- 压力测试(Stress Test):逐步加压找到系统崩溃点
- 稳定性测试(Soak Test):长时间运行检测内存泄漏等隐患
书里特别强调了测试环境与生产环境的一致性问题——很多性能问题只在生产环境出现,因为数据分布、网络拓扑、硬件配置都不同。建议在条件允许的情况下,直接在类生产环境做压测。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | 性能基线 | 系统在正常条件下的性能指标 | 优化的起点,没有基线就没有对比 | | 吞吐量拐点 | 延迟开始急剧上升的负载点 | 超过这个点,系统进入"过载"状态 | | JMeter / wrk / Locust | 主流压测工具 | 选哪个看你的技术栈和团队习惯 | | 全链路压测 | 模拟真实业务流量的端到端压测 | 比单服务压测更能暴露真实问题 |
行动清单
- [ ] 为核心服务建立性能基线文档(包含 P50/P99 延迟、QPS 上限、资源使用率)
- [ ] 定期执行全链路压测,至少每季度一次
- [ ] 建立性能回归告警机制——核心指标下降超过阈值自动告警
第5章:网络性能
核心观点
在分布式系统中,网络延迟是性能的天花板。你可以在应用层做很多优化,但一个 RTT(往返时间)的物理限制是无法绕过的。
这一章从 TCP/IP 协议栈的角度分析了网络性能的关键因素:
- TCP 三次握手:每次新连接需要 1 个 RTT,TLS 握手再加 1-2 个 RTT。长连接和连接复用是降低握手开销的基本手段。
- Nagle 算法 vs 延迟确认:TCP 的这两个默认行为在小包高频场景下会产生意外的延迟。
- 带宽 vs 延迟:大文件传输受带宽限制,小消息交互受延迟限制。优化策略完全不同。
- 网络分区容错:CAP 定律在分布式系统中的实际影响。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | RTT | 一个请求从发出到收到响应的时间 | 网络延迟的基本单位 | | TCP 长连接 | 复用已建立的连接避免重复握手 | 几乎是所有 RPC 框架的标配 | | 零拷贝(Zero-copy) | 数据在内核空间直接传递,避免用户态拷贝 | Kafka 和 Netty 都用了这个技术 | | RDMA | 远程直接内存访问,绕过内核协议栈 | 极致低延迟场景的杀手锏,但部署成本高 |
行动清单
- [ ] 检查服务间通信是否都使用了长连接
- [ ] 分析网络延迟占总请求耗时的比例,找出"网络密集型"服务
- [ ] 评估是否需要引入 RDMA 或其他低延迟网络技术
第6章:通信性能
核心观点
RPC 框架的选择、序列化协议的设计、连接池的配置,这三件事决定了服务间通信的上限。
这章聚焦于服务间通信的技术选型和优化:
- 序列化协议对比:JSON(可读性好,性能差)、Protobuf(性能好,需要定义 schema)、Thrift(折中方案)、Hessian(历史包袱)。选型时需要权衡性能、可读性、兼容性和生态。
- RPC 框架设计:连接管理、超时控制、重试策略、熔断降级。这些看似是"工程细节",实际上对性能影响巨大。
- 异步 vs 同步:异步通信能提高吞吐量,但增加了编程复杂度。不是所有场景都适合异步。
| 序列化协议 | 体积 | 速度 | 可读性 | 跨语言 | 典型场景 | |---|---|---|---|---|---| | JSON | 大 | 慢 | 好 | 好 | REST API、配置文件 | | Protobuf | 小 | 快 | 差 | 好 | 微服务内部通信 | | Thrift | 中 | 中 | 差 | 好 | 跨语言 RPC | | Hessian | 中 | 中 | 差 | 中 | 遗留系统 | | MessagePack | 小 | 快 | 差 | 好 | 实时通信 |
行动清单
- [ ] 审视当前序列化协议选型,是否有优化空间
- [ ] 检查 RPC 调用的超时配置是否合理(过长会拖垮调用方,过短会导致误熔断)
- [ ] 对高频调用的接口做序列化协议的 benchmark 对比
第7章:客户端性能/前端性能优化
核心观点
用户感知的性能 = 真实的网络时间 + 渲染时间 + 用户心理等待时间。优化不仅是让系统快,还要让用户"感觉快"。
这一章涵盖了前端性能优化的方方面面:
- 关键渲染路径优化:减少关键资源数量和体积,加快首屏渲染
- 资源加载策略:懒加载、预加载、按需加载
- 缓存策略:强缓存(Cache-Control)、协商缓存(ETag)、Service Worker
- 感知性能优化:骨架屏、进度条、渐进式渲染——即使实际速度没变,用户体感会好很多
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | FCP | First Contentful Paint,首次内容绘制 | 页面开始有东西出现的时间 | | LCP | Largest Contentful Paint,最大内容绘制 | 用户觉得"页面加载好了"的时间 | | TTI | Time to Interactive,可交互时间 | 用户可以开始操作的时间 | | CLS | Cumulative Layout Shift,累计布局偏移 | 页面加载过程中元素跳动让人烦躁的程度 |
行动清单
- [ ] 用 Lighthouse 给你的前端项目跑一次性能评估
- [ ] 实现骨架屏或 loading 状态,优化用户感知性能
- [ ] 检查静态资源的缓存策略,确保利用好浏览器缓存
第8章:单服务实体的性能优化
核心观点
在考虑分布式优化之前,先确保每个单体服务已经做到了它能做到的最好。
这章是后端工程师的"基本功":
- 线程模型:BIO vs NIO vs AIO,Reactor vs Proactor 模式。Netty 的线程模型是这章的重点分析对象。
- 连接池管理:数据库连接池、HTTP 连接池的大小不是越大越好。过大的连接池会导致上下文切换开销增加、数据库连接数耗尽。
- 内存管理:对象池减少 GC 压力、堆外内存降低 GC 暂停、内存泄漏排查方法。
- 锁优化:减少锁粒度、读写锁分离、无锁数据结构(CAS)、避免死锁的策略。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | Reactor 模式 | I/O 多路复用 + 事件驱动的线程模型 | Netty/Tomcat/Nginx 都在用 | | GC 调优 | 通过调整 GC 参数减少停顿时间 | Young Gen/Old Gen 大小比例是核心参数 | | 连接池调优 | 合理配置最小/最大连接数、超时时间 | 不是越大越好,要看后端能承受多少 | | 热点数据 | 被高频访问的少量数据 | 识别热点、单独处理是单机优化的关键 |
行动清单
- [ ] 用 jstat/jmap/arthas 等工具分析服务的 GC 情况
- [ ] 审查连接池配置,特别是最大连接数是否与后端容量匹配
- [ ] 识别服务中的热点代码路径,考虑加缓存或异步化
第9章:数据库性能
核心观点
数据库往往是系统性能的最大瓶颈。优化数据库不等于加索引,它是一个涉及 schema 设计、查询优化、事务管理和硬件配置的系统工程。
- 索引优化:B+ 树索引的选择性、覆盖索引减少回表、联合索引的最左前缀原则。索引不是越多越好——每个索引都是写入时的额外开销。
- 查询优化:避免 SELECT *、减少子查询、合理使用 JOIN、分页查询的深分页问题。
- 事务隔离级别:读未提交、读已提交、可重复读、串行化——隔离级别越高,性能越差。选择能满足业务需求的最低隔离级别。
- 分库分表:垂直拆分(按业务)和水平拆分(按数据范围)。分库分表引入了分布式事务、跨库查询等新问题,要慎重评估。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | 索引选择性 | 不重复的值数 / 总行数 | 越接近 1 越好,太低的选择性不如不加索引 | | 覆盖索引 | 索引包含了查询需要的所有字段 | 不需要回表,性能提升明显 | | 慢查询日志 | 记录执行时间超过阈值的 SQL | 数据库优化的第一入口 | | 读写分离 | 写操作走主库,读操作走从库 | 最经典的数据库扩展方案 |
行动清单
- [ ] 开启慢查询日志,定期分析 Top 10 慢查询
- [ ] 用 EXPLAIN 分析核心 SQL 的执行计划
- [ ] 评估读写分离方案的可行性,减轻主库压力
第10章:缓存的应用
核心观点
缓存是性能优化中最有效的手段,也是最容易引入问题的手段。用好缓存的关键在于理解它的一致性代价。
- 缓存层次:本地缓存(Caffeine/Guava)→ 分布式缓存(Redis)→ CDN → 浏览器缓存。每一层有不同的容量、延迟和一致性特征。
- 缓存策略:Cache-Aside、Read-Through、Write-Through、Write-Behind。不同策略在一致性和性能之间做不同取舍。
- 缓存问题:缓存穿透(查不存在的数据)、缓存击穿(热点 key 过期)、缓存雪崩(大量 key 同时过期)。每种问题都有对应的解决方案。
- 缓存一致性:最终一致性 vs 强一致性。在大多数业务场景下,最终一致性就够了,但支付、库存等场景需要更强的一致性保证。
| 缓存策略 | 读流程 | 写流程 | 一致性 | 适用场景 | |---|---|---|---|---| | Cache-Aside | 先读缓存,miss 再读 DB | 先更新 DB,再删缓存 | 最终一致 | 最通用 | | Read-Through | 缓存层自动回源 | 同 Cache-Aside | 最终一致 | 读多写少 | | Write-Through | 同 Read-Through | 同步写缓存和 DB | 强一致 | 一致性要求高 | | Write-Behind | 同 Read-Through | 先写缓存,异步写 DB | 弱一致 | 写密集型 |
行动清单
- [ ] 梳理系统中所有使用缓存的地方,确认一致性策略是否匹配业务需求
- [ ] 检查是否有缓存穿透/击穿/雪崩的防护措施
- [ ] 为热点数据设置合理的过期时间,避免永不过期导致的内存膨胀
第11章:消息队列
核心观点
消息队列的核心价值是解耦和削峰填谷,但它引入了消息丢失、重复消费、顺序性等新问题。引入 MQ 之前先问自己:真的需要吗?
- 解耦:生产者和消费者不需要同时在线,不需要知道对方的存在。系统演进时可以独立修改。
- 削峰填谷:用消息队列缓冲突发流量,保护下游服务不被打垮。
- 可靠投递:生产者确认、消息持久化、消费者手动 ACK。至少一次投递是常见选择。
- 消息顺序:全局有序代价太大,通常只需要局部有序(同一订单的消息有序)。
关键概念
| 概念 | 定义 | 一句话理解 | |---|---|---| | 削峰填谷 | 用队列缓冲流量峰值 | 流量来了一波接住,下游慢慢消费 | | 消息幂等 | 同一条消息消费多次结果一样 | 至少一次投递的标配要求 | | 死信队列 | 无法正常消费的消息存放处 | 出了问题先别丢,留到 DLQ 排查 | | 延迟消息 | 指定时间后才可被消费的消息 | 订单超时取消、定时任务的利器 |
行动清单
- [ ] 检查消费者端是否实现了幂等处理
- [ ] 为核心业务链路配置死信队列和告警
- [ ] 评估引入消息队列的真实收益 vs 引入的复杂度
第12章:小度音箱的性能优化(案例)
核心观点
IoT 设备的性能优化和服务器端完全不同——资源受限、网络不稳定、用户体验要求实时。这要求在极有限的条件下做出最优选择。
这个案例展示了在嵌入式/IoT 场景下的性能优化思路:
- 资源受限:内存和 CPU 非常有限,不能像服务器那样"用空间换时间"
- 网络不稳定:语音交互对延迟极度敏感(超过 500ms 用户就会觉得"笨")
- 端云协同:轻量级任务在端侧完成,重计算任务上云
行动清单
- [ ] 如果你的产品涉及端侧,评估端云任务划分是否合理
- [ ] 关注端到端延迟,而不仅仅是服务端延迟
第13章:网上商城的性能优化(案例)
核心观点
电商系统是性能优化的"集大成者"——它几乎用到了前面所有章节讲到的技术。
这个案例串联了全书的知识点:
- 首页:CDN + 静态化 + 个性化推荐
- 商品详情:多级缓存 + 异步加载
- 购物车:本地缓存 + 服务端一致性校验
- 下单:分布式事务 + 库存扣减 + 消息通知
- 支付:强一致性 + 幂等 + 对账
行动清单
- [ ] 对照这个案例,检查你的系统在类似场景下是否有遗漏
- [ ] 画出自己系统的关键路径性能瓶颈图
第14章:营销红包的性能优化(案例)
核心观点
红包场景是"瞬间高并发 + 金额精确性"的极端考验。技术上需要把"抢"变成"排",把"并发"变成"串行"。
红包优化的核心思路:
- 库存预分配:红包金额提前拆分好,存入缓存,避免实时计算
- 原子扣减:用 Redis 的 DECR 原子操作保证库存扣减的准确性
- 异步落库:抢红包成功后异步写入数据库,降低数据库压力
- 防刷机制:频率限制、设备指纹、风控规则
行动清单
- [ ] 如果有类似的"抢购"场景,评估是否需要库存预分配方案
- [ ] 确保高并发场景下的金额计算使用原子操作
第15章:支付系统/核心交易系统的性能优化(案例)
核心观点
支付系统的性能优化是在"快"和"对"之间走钢丝。任何优化都不能以牺牲资金安全为代价。
支付系统的特殊性:
- 强一致性:钱不能多也不能少,TCC、Saga 等分布式事务方案是标配
- 幂等性:网络超时后的重试不能导致重复扣款
- 对账:异步对账是发现和修复数据不一致的最后一道防线
- 审计追踪:每一笔交易都要有完整的操作日志
行动清单
- [ ] 检查支付相关接口的幂等性实现
- [ ] 建立自动化对账机制,不要等到人工对账才发现问题
第16章:全链路性能压测
核心观点
全链路压测是验证分布式系统性能的唯一可靠手段。单服务的压测结果不能简单相加得到系统整体性能。
全链路压测的关键挑战:
- 流量录制与回放:从生产环境录制真实流量,在压测环境回放
- 数据隔离:压测流量不能污染生产数据(影子库/影子表)
- 容量评估:根据压测结果推算系统容量上限,指导扩容决策
- 瓶颈定位:通过全链路 Trace 找到性能瓶颈节点
行动清单
- [ ] 建立全链路压测平台,至少覆盖核心业务链路
- [ ] 实现流量的录制和回放能力
- [ ] 在压测前做好数据隔离方案,避免"压测炸了生产"
第17章:云原生技术为性能带来的机遇与变革
核心观点
云原生技术(容器、Kubernetes、Serverless)改变了性能优化的方式——从"优化单体"变成"优化调度和弹性"。
- 容器化:更轻量的资源隔离,更快的启动速度,更灵活的调度
- 自动伸缩(HPA):根据负载自动调整实例数量,用弹性换效率
- Serverless:按调用计费,冷启动是主要性能挑战
- Service Mesh:服务间通信的管理层,Sidecar 模式引入了额外的网络开销
行动清单
- [ ] 评估 Kubernetes HPA 配置是否合理,避免频繁扩缩容
- [ ] 如果使用 Serverless,监控冷启动频率和对延迟的影响
- [ ] Service Mesh 的 Sidecar 代理开销是否在可接受范围内
三、关键概念速查
| 概念 | 定义 | 一句话理解 | |---|---|---| | 点-线-面-体 | 四维性能优化模型 | 从一行代码到整个系统的逐层优化方法论 | | Little's Law | L = λW(系统中平均请求数 = 到达率 × 平均等待时间) | 排队论的基石 | | Amdahl 定律 | 加速比 ≤ 1/((1-p)+p/s),p 为可并行比例 | 串行部分决定了并行化的上限 | | 尾延迟 | P99/P999 延迟指标 | 平均值骗人,长尾才是真体验 | | 缓存穿透 | 查询不存在的数据,绕过缓存直接打到 DB | 用布隆过滤器挡住 | | 缓存击穿 | 热点 key 过期瞬间大量请求涌向 DB | 用互斥锁或永不过期+异步更新 | | 缓存雪崩 | 大量 key 同时过期 | 过期时间加随机抖动 | | 零拷贝 | 数据在内核空间直接传递 | Kafka/Netty 的性能秘籍 | | RDMA | 绕过内核协议栈的网络通信 | 极致低延迟,但贵 | | 全链路压测 | 端到端的系统性压力测试 | 单服务压测远远不够 | | 分布式事务 | 跨服务的事务一致性保证 | TCC/Saga/本地消息表 | | 幂等性 | 同一操作执行多次结果相同 | 分布式系统的安全网 |
四、核心框架/模型
"点-线-面-体"四维优化模型
┌─────────────────────────────────────────────────┐
│ 体(系统级) │
│ ┌───────────────────────────────────────────┐ │
│ │ 面(模块级) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 线(路径级) │ │ │
│ │ │ ┌─────────────────────────────┐ │ │ │
│ │ │ │ 点(代码级) │ │ │ │
│ │ │ └─────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
性能优化决策流程
发现性能问题
│
▼
建立性能基线(度量)
│
▼
定位瓶颈在哪一层?
├── 点:代码级优化(算法、数据结构)
├── 线:路径级优化(调用链路、批量处理)
├── 面:模块级优化(架构调整、缓存策略)
└── 体:系统级优化(负载均衡、容量规划)
│
▼
实施优化
│
▼
验证效果(对比基线)
│
├── 达标 → 完成
└── 未达标 → 回到定位步骤
缓存策略选型模型
一致性要求高?
├── 是 → Write-Through(同步写缓存+DB)
└── 否 →
写入频繁?
├── 是 → Write-Behind(异步写DB)
└── 否 → Cache-Aside(最通用)
五、金句摘录
没有绝对的好设计,只有适合的设计。
性能优化的第一步不是找方案,而是建基线。
缓存是性能优化的利器,也是一致性问题的温床。
对于分布式系统而言,提高 10% 的性能就意味着节约 10% 的机器和能源。如果系统大到一定的规模(数千台服务器),值得用程序员的时间去换取机器的时间和数量。
平均值会骗人,长尾才是用户真正感受到的。
消息队列不是银弹。引入之前先问自己:真的需要吗?
支付系统的性能优化是在"快"和"对"之间走钢丝。
单服务的压测结果不能简单相加得到系统整体性能。
六、行动清单
每天
- [ ] 关注核心服务的 P99 延迟和错误率监控
- [ ] 检查是否有新增的慢查询
每周
- [ ] 审查一次慢查询日志 Top 10
- [ ] 检查缓存命中率是否在正常范围
- [ ] Review 本周上线的代码是否有明显的性能隐患
每月
- [ ] 执行一次全链路压测,更新性能基线
- [ ] 审视系统架构在"点-线-面-体"四个维度的优化空间
- [ ] 评估是否有新的技术(如 RDMA、eBPF)可以引入
每季度
- [ ] 做一次全面的性能复盘,对比历史基线看趋势
- [ ] 重新评估技术选型(序列化协议、RPC 框架、缓存方案)是否还适合当前业务规模
七、一句话总结
分布式系统性能优化不是某个环节的"灵丹妙药",而是一个从代码到架构、从度量到验证的系统性工程——先建基线再优化,先定位再下手,永远记住"没有绝对的好设计,只有适合的设计"。
八、读者热议
以下整理自微信读书、得到 APP、豆瓣等平台的书评,反映不同读者的真实看法。
兰小伟(微信读书,1星,9赞)
估计作者就只写了一个大纲,然后交给AI,最后再稍微改改。全书注水量至少有90%。搞笑的是,这种一坨💩,书尾那些CTO/博导还要夸它吃起来香,挺佩服他们💩上雕花的功夫。
reed(微信读书,3星)
重点看了其RDMA介绍部分,内容相对概略,从概念维度进行了介绍,同时翻看了其他章节,涉及的内容比较庞杂。
喵喵的客观评价 这本书的问题确实存在——五位合著的书往往容易"面面俱到但浅尝辄止",25 万字的篇幅要覆盖从网络协议到云原生的整个技术栈,每个话题自然难以深入。作为"概览型"读物,它能帮你建立一个全栈性能优化的知识地图,但如果你想深入某个具体领域(比如数据库调优、JVM 调优),还是需要找更专门的书。RDMA 部分如读者所说确实偏概念化,缺乏实战细节。不过,"点-线-面-体"这个四维框架本身是有价值的思考工具,值得借鉴。
笔记生成:2026-04-27 by 喵喵 🐈
相关笔记
同作者仅有此篇