如何学习Linux性能优化

这里是学习倪朋飞老师的Linux性能优化的开篇,性能分析和优化始终是大多数软件工程师的一个痛点,确实如此。

正如老师所说,“只要我们理解了应用程序和系统的少数几个基本原理,再进行大量的练习,就能建立整体性能的全观”, 那么大多数的性能问题的优化就会水到渠成;

也许,我们不需要了解你的服务依赖的每个组件的所有实现细节,只需要了解它们最基本的工作原理和协作方式,我们也能找到性能问题的所在;

性能指标

学习性能优化的第一步,就是了解“性能指标” 这个概念;

当看到性能指标时,脑海中会闪过“高并发”和”响应快“这两个词;而它们也正对应着性能优化的两个核心指标-“吞吐”和”延时“。这两个指标是从应用负载的视角来考察性能,直接影响了产品终端的用户体验。

和它们对应的,是从系统资源的视角出发的指标,比如资源使用率饱和度等。

image-20230604233305374

我们知道,随着应用负载的增加,系统资源的使用也会增高,甚至达到极限;

性能问题的本质,就是系统资源已经达到瓶颈,但请求处理却还不够快,无法支撑更多的请求;

性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。

这包含了一系列的步骤,如下面的6个步骤:

  1. 选择指标评估应用程序和系统的性能;
  2. 为应用程序和系统设置性能目标;
  3. 进行性能基准测试;
  4. 性能分析定位瓶颈;
  5. 优化系统和应用程序;
  6. 性能监控和告警;

了解上述性能相关的基本指标和核心步骤后,要谈谈Linux性能优化的几个重要问题;

想要学习好性能分析和优化,建立整体系统性能的全局观是最核心的话题;因而,

  • 理解最基本的几个系统知识原理;
  • 掌握必要的性能工具;
  • 通过实际的场景演练,贯穿不同的组件;

这3点,也就是我们学习中的重中之重;

Linux性能工具图谱

说到性能工具,就不得不提到性能领域的大师布伦-格雷格(Brendan Gregg),他不仅是动态追踪工具Dtrace的作者,还开发了许许多多的性能工具;下面是他所描绘的Linux性能工具图谱:

  • linux performance observability tools

linux_observability_tools

  • linux static performance tools

  • linux performance benchmark tools

  • linux performance tuning tools

  • linux performance observability: sar

linux_observability_sar

  • linux performance observability: perf-tools

  • linux bcc/BPF Tracing tools

  • bpftrace/eBPF Tools

  • BPF Performance Tools: Linux System and Application Observability

老师提供的图:

image-20230605001308370

上面的图是Linux性能分析最重要的参考资料之一,它告诉我们,在Linux不同的子系统出现性能问题后,应该用什么样的工具来观察和分析;

比如,当遇到I/O性能问题时候,可以参考图片最下方的I/O子系统,使用iostat、iotop、blktrace等工具分析磁盘I/O的瓶颈;

另外还有一点,就是性能工具的选用。合理的性能工具的选用,会大大简化整个性能优化的过程,在什么场景选用什么样的工具,以及怎么学会选择合适工具;

但是千万不要把性能工当成学习的全部, 工具只是解决问题的手段,关键在于我们的用法;只有真正理解了他们背后的原理,并且结合具体场景,融会贯通系统的不同组件,我们才能真正掌握它们;

下面是给出的思维导图:

文件系统

image-20230605002348434

Linux内核

image-20230605002435483

CPU

image-20230605002536360

内存

image-20230605002654201

应用程序

image-20230605002816488

架构设计

image-20230605202932804

网络

image-20230605003017112

性能监控

image-20230605203002597

性能测试

image-20230605203014405

磁盘I/O

image-20230605203113218

学习技巧

下面是几个学习技巧;

技巧一:虽然系统的原理很重要,但在刚开始一定不要试图抓住所有的实现细节;

深陷到系统实现的内部,可能会让我们丢掉学习的重点,而且繁杂的实现逻辑,可能会打退你学习的积极性,因此一定要适度;

我们可以先学会常见的技巧以及老师列举的系统工作原理,但是不要去深究内核是如何做到的,而是要把你的重点放到如何观察和运用这些原理上,例如:

  • 有哪些指标可以衡量性能?
  • 使用什么样的性能工具来观察指标?
  • 导致这些指标变化的因素等;

技巧二:边学边实践,通过大量的案例演习掌握Linux性能的分析和优化;

只有通过在机器上练习,把讲义讲的知识和案例自己过一遍,才能转化成自己的东西;课程中都是精心设计的案例,实操这些会让我们有更好的学习理解和操作体验;

因此我们应该去实际运行、分析这些案例,或者用学到的知识去分析你自己的系统。这样会有更直观的感受,获得更好的学习效果;

技巧三:勤思考,多反思,善总结,多问为什么;

想真正学懂一门知识,最好的方法就是问问题。当你能提出好问题时候,就说明你已经深入理解了它;