性能优化一直是大多数软件工程师头上的"紧箍咒", 甚至工作多年的资深工程师也无法准确分析线上的很多性能问题。
我认为性能问题如此难的原因主要为它是一个系统工程,牵一发而动全身,涉及到的知识面较广,包括程序、算法分析、编程语言,再到系统、存储、网络等各种底层的基础设施。每个组件都可能会出现问题,而且很有可能多个组件同同时出问题。
毫无疑问,性能优化是软件系统中最有挑战的工作之一,但是换个角度来看,如果我们掌握了性能优化的各个关键点,那一定大大会提升你的综合能力。
如何才能掌握这个技能呢?我认为是钻研+实战,带着问题学习,而不是去啃厚厚的原理书籍。在这个学习的过程中,要学会抓住重点,只需要了解少数系统组件的基本原理和协作方式,掌握基本的性能指标和工具,学会实际工作中性能优化的技巧,你就可以准确的分析和优化大多数的性能问题了。在此为前提再反过来阅读经典的操作系统或者其他图书才会事半功倍。
我们只需要理解应用程序和系统少数的几个基本原理,在进行大量的实战练习,建立起整体性能的全局观,大多数性能问题的优化就会水到渠成。
学习性能优化的第一步,要了解"性能指标"的概念,看到这个概念,我们想到的肯定是 "高并发" 和 "响应"快, 实际上它们也对应性能优化的两个核心指标,"吞吐"和"延时",这个两个指标是从应用负载的视角来考虑性能的,如果从系统资源的角度来看,比如资源使用率、饱和度等等。
性能分析,其实就是找出应用或者系统的瓶颈,并设法去避免或者缓解它们,从而更加高效的利用系统资源处理更多的事务。这包含了一系列的步骤,比如:
选择指标评估应用程序和系统的性能;
为应用程序和系统设置性能目标;
进行性能基准测试;
性能分析定位瓶颈;
优化系统和应用程序;
性能监控和告警;
上述为性能领域大师布伦丹 格雷格描绘的性能工具图谱,这张图描述了在 Linux
不同子系统出现性能问题时,应该用什么样的工具来观测和分析。但是性能工具不是学习的全部,工具只是解决问题的手段,关键在于你的用法。