You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
9.5 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 01 | 如何学习Linux性能优化
你好,我是倪朋飞。
你是否也曾跟我一样看了很多书、学了很多Linux性能工具但在面对Linux性能问题时还是束手无策实际上性能分析和优化始终是大多数软件工程师的一个痛点。但是面对难题我们真的就无解了吗
固然,性能问题的复杂性增加了学习难度,但这并不能成为我们进阶路上的“拦路虎”。在我看来,大多数人对性能问题“投降”,原因可能只有两个。
一个是你没找到有效的方法学原理,一听到“系统”、“底层”这些词就发怵,觉得东西太难,自己一定学不会,自然也就无法深入学下去,从而不能建立起性能的全局观。
再一个就是,你看到性能问题的根源太复杂,既不懂怎么去分析,也不能抽丝剥茧找到瓶颈。
你可能会想,反正程序出了问题,上网查就是了,用别人的方法,囫囵吞枣地多试几次,有可能就解决了。于是,你懒得深究这些方法为啥有效,更不知道为什么,很多方法在别人的环境有效,到你这儿就不行了。
所以,相同的错误重复在犯,相同的状况也是重复出现。
其实,性能问题并没有你想像得那么难,**只要你理解了应用程序和系统的少数几个基本原理,再进行大量的实战练习,建立起整体性能的全局观**,大多数性能问题的优化就会水到渠成。
我见过很多工程师,在分析应用程序所使用的第三方组件的性能时,并不熟悉这些组件所用的编程语言,却依然可以分析出线上问题的根源,并能通过一些方法进行优化,比如修改应用程序对它们的调用逻辑,或者调整组件的配置选项等。
还是那句话,**你不需要了解每个组件的所有实现细节**,只要能理解它们最基本的工作原理和协作方式,你也可以做到。
## 性能指标是什么?
学习性能优化的第一步,一定是了解“性能指标”这个概念。
当看到性能指标时,你会首先想到什么呢?我相信“**高并发**”和“**响应快**”一定是最先出现在你脑海里的两个词,而它们也正对应着性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是**从应用负载的视角**来考察性能,直接影响了产品终端的用户体验。跟它们对应的,是**从系统资源的视角**出发的指标,比如资源使用率、饱和度等。
![](https://static001.geekbang.org/resource/image/92/1d/920601da775da08844d231bc2b4c301d.png)
我们知道,随着应用负载的增加,系统资源的使用也会升高,甚至达到极限。而**性能问题的本质**,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求。
性能分析,其实就是**找出应用或系统的瓶颈,并设法去避免或者缓解它们**,从而更高效地利用系统资源处理更多的请求。这包含了一系列的步骤,比如下面这六个步骤。
* 选择指标评估应用程序和系统的性能;
* 为应用程序和系统设置性能目标;
* 进行性能基准测试;
* 性能分析定位瓶颈;
* 优化系统和应用程序;
* 性能监控和告警。
了解了这些性能相关的基本指标和核心步骤后该怎么学呢接下来我来说说要学好Linux 性能优化的几个重要问题。
## 学这个专栏需要什么基础
首先你要明白我们这个专栏的核心是性能的分析和优化而不是最基本的Linux操作系统的使用方法。
因而我希望你最好用过Ubuntu或其他Linux操作系统然后要具备一些**编程基础**,比如:
* 了解Linux常用命令的使用方法
* 知道怎么安装和管理软件包;
* 知道怎么通过编程语言开发应用程序等。
这样,在我讲性能时,你就更容易理解性能背后的原理,特别是在结合专栏里的案例实践后,对性能分析能有更直观的体会。
这个专栏不会像教科书那样,详细教你操作系统、算法原理、网络协议乃至各种编程语言的全部细节,但一些重要的系统原理还是必不可少的。我还会用实际案例一步步教你,贯穿从应用程序到操作系统的各个组件。
## 学习的重点是什么?
想要学习好性能分析和优化,**建立整体系统性能的全局观**是最核心的话题。因而,
* 理解最基本的几个系统知识原理;
* 掌握必要的性能工具;
* 通过实际的场景演练,贯穿不同的组件。
这三点,就是我们学习的重中之重。我会在专栏的每篇文章中,针对不同场景,把这三个方面给你讲清楚,你也一定要花时间和心思来消化它们。
其实说到性能工具就不得不提性能领域的大师布伦丹·格雷格Brendan Gregg。他不仅是动态追踪工具DTrace的作者还开发了许许多多的性能工具。我相信你一定见过他所描绘的Linux性能工具图谱
![](https://static001.geekbang.org/resource/image/9e/7a/9ee6c1c5d88b0468af1a3280865a6b7a.png)
(图片来自[brendangregg.com](http://www.brendangregg.com/Perf/linux_perf_tools_full.png)
这个图是Linux性能分析最重要的参考资料之一它告诉你在Linux不同子系统出现性能问题后应该用什么样的工具来观测和分析。
比如当遇到I/O性能问题时可以参考图片最下方的I/O子系统使用iostat、iotop、blktrace等工具分析磁盘I/O的瓶颈。你可以把这个图保存下来在需要的时候参考查询。
另外,我还要特别强调一点,就是**性能工具的选用**。有句话是这么说的,一个正确的选择胜过千百次的努力。虽然夸张了些,但是选用合适的性能工具,确实可以大大简化整个性能优化过程。在什么场景选用什么样的工具、以及怎么学会选择合适工具,都是我想教给你的东西。
但是切记,**千万不要把性能工具当成学习的全部**。工具只是解决问题的手段,关键在于你的用法。只有真正理解了它们背后的原理,并且结合具体场景,融会贯通系统的不同组件,你才能真正掌握它们。
最后,为了让你对性能有个全面的认识,我画了一张思维导图,里面涵盖了大部分性能分析和优化都会包含的知识,专栏中也基本都会讲到。你可以保存或者打印下来,每学会一部分就标记出来,记录并把握自己的学习进度。
![](https://static001.geekbang.org/resource/image/0f/ba/0faf56cd9521e665f739b03dd04470ba.png)
## 怎么学更高效?
前面我给你讲了Linux性能优化的学习重点接下来我再跟你分享一下我的几个学习技巧。掌握这些技巧可以让你学得更轻松。
**技巧一:虽然系统的原理很重要,但在刚开始一定不要试图抓住所有的实现细节。**
深陷到系统实现的内部,可能会让你丢掉学习的重点,而且繁杂的实现逻辑,很可能会打退你学习的积极性。所以,我个人观点是一定要适度。
你可以先学会我给你讲的这些系统工作原理但不要去深究Linux内核是如何做到的而是要把你的重点放到如何观察和运用这些原理上比如
* 有哪些指标可以衡量性能?
* 使用什么样的性能工具来观察指标?
* 导致这些指标变化的因素等。
**技巧二边学边实践通过大量的案例演习掌握Linux性能的分析和优化。**
只有通过在机器上练习,把我讲的知识和案例自己过一遍,这些东西才能转化成你的。我精心设计这些案例,正是为了让你有更好的学习理解和操作体验。
所以我强烈推荐你去实际运行、分析这些案例,或者用学到的知识去分析你自己的系统,这样你会有更直观的感受,获得更好的学习效果。
**技巧三:勤思考,多反思,善总结,多问为什么。**
想真正学懂一门知识,最好的方法就是问问题。当你能提出好的问题时,就说明你已经深入了解了它。
你可以随时在留言区给我留言,写下自己的疑问、思考和总结,和我还有其他的学习者一起讨论切磋。你也可以写下自己经历过的性能问题,记录你的分析步骤和优化思路,我们一起互动探讨。
## 学习之前,你的准备
作为一个包含大量案例实践的课程我会在每篇文章中使用一到两台Ubuntu 18.04虚拟机,作为案例运行和分析的环境。如果你只是单纯听音频的讲解,却从不动手实践,学习的效果一定会大打折扣。
所以你是不是可以准备好一台Linux机器用于课程案例的实践呢任意的虚拟机或物理机都可以并不局限于Ubuntu系统。
## 思考
今天的内容是我们后续学习的热身准备。从下篇文章开始我们就要正式进入Linux性能分析和优化了。所以我想请你来聊一聊你之前在解决Linux性能问题时有遇到过什么样的困难或者疑惑吗或者是之前自己学习Linux性能优化时有哪些问题吗参考我今天所讲的内容你又打算怎么来学这个专栏
欢迎在留言区和我分享。
![](https://static001.geekbang.org/resource/image/56/52/565d66d658ad23b2f4997551db153852.jpg)