This commit is contained in:
louzefeng
2024-07-09 18:38:56 +00:00
parent 8bafaef34d
commit bf99793fd0
6071 changed files with 1017944 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,72 @@
<audio id="audio" title="开篇词 | 别再让Linux性能问题成为你的绊脚石" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/06/18/06cedcb5e74c88cec921ac260069e918.mp3"></audio>
你好我是倪朋飞微软Azure的资深工程师同时也是Kubernetes项目维护者主要负责开源容器编排系统Kubernetes在Azure的落地实践。
一直以来,我都在云计算领域工作。对于服务器性能的关注,可以追溯到我刚参加工作那会儿。为什么那么早就开始探索性能问题呢?其实是源于一次我永远都忘不了的“事故”。
那会儿我在盛大云工作忙活了大半夜把产品发布上线后刚刚躺下打算休息却突然收到大量的告警。匆忙爬起来登录到服务器之后我发现有一些系统进程的CPU使用率高达 100%。
当时我完全是两眼一抹黑,可以说是只能看到症状,却完全不知道该从哪儿下手去排查和解决它。直到最后,我也没能想到好办法,这次发布也成了我心中之痛。
从那之后我开始到处查看各种相关书籍从操作系统原理、到Linux内核再到硬件驱动程序等等。可是学了那么多知识之后我还是不能很快解决类似的性能问题。
于是我又通过网络搜索或者请教公司的技术大拿学习了大量性能优化的思路和方法这期间尝试了大量的Linux性能工具。在不断的实践和总结后我终于知道怎么**把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序、库函数、系统调用、再到内核和硬件等不同的层级贯穿起来。**
这段学习可以算得上是我的“黑暗”经历了。我想,不仅是我一个人,很多人应该都有过这样的挫折。比如说:
<li>
流量高峰期服务器CPU使用率过高报警你登录Linux上去top完之后却不知道怎么进一步定位到底是系统CPU资源太少还是程序并发部分写的有问题
</li>
<li>
系统并没有跑什么吃内存的程序但是敲完free命令之后却发现系统已经没有什么内存了那到底是哪里占用了内存为什么
</li>
<li>
一大早就收到Zabbix告警你发现某台存放监控数据的数据库主机的iowait较高这个时候该怎么办
</li>
这些问题或者场景,你肯定或多或少都遇到过。
实际上,**性能优化一直都是大多数软件工程师头上的“紧箍咒”**,甚至许多工作多年的资深工程师,也无法准确地分析出线上的很多性能问题。
性能问题为什么这么难呢?我觉得主要是因为性能优化是个系统工程,总是牵一发而动全身。它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时出问题。
毫无疑问,性能优化是软件系统中最有挑战的工作之一,但是换个角度看,**它也是最考验体现你综合能力的工作之一**。如果说你能把性能优化的各个关键点吃透,那我可以肯定地说,你已经是一个非常优秀的软件工程师了。
那怎样才能掌握这个技能呢?你可以像我前面说的那样,花大量的时间和精力去钻研,从内功到实战一一苦练。当然,那样可行,但也会走很多弯路,而且可能你啃了很多大块头的书,终于拿下了最难的底层体系,却因为缺乏实战经验,在实际开发工作中仍然没有头绪。
其实,对于我们大多数人来说,**最好的学习方式一定是带着问题学习**,而不是先去啃那几本厚厚的原理书籍,这样很容易把自己的信心压垮。
我认为,**学习要会抓重点**。其实只要你了解少数几个系统组件的基本原理和协作方式,掌握基本的性能指标和工具,学会实际工作中性能优化的常用技巧,你就已经可以准确分析和优化大多数的性能问题了。在这个认知的基础上,再反过来去阅读那些经典的操作系统或者其它图书,你才能事半功倍。
所以,在这个专栏里,我会以**案例驱动**的思路给你讲解Linux性能的基本指标、工具以及相应的观测、分析和调优方法。
具体来看我会分为5个模块。前4个模块我会从资源使用的视角出发带你分析各种Linux资源可能会碰到的性能问题包括 **CPU 性能**、**磁盘 I/O 性能**、**内存性能**以及**网络性能**。每个模块还由浅入深划分为四个不同的篇章。
<li>
**基础篇**介绍Linux必备的基本原理以及对应的性能指标和性能工具。比如怎么理解平均负载怎么理解上下文切换Linux内存的工作原理等等。
</li>
<li>
**案例篇**,这里我会通过模拟案例,帮你分析高手在遇到资源瓶颈时,是如何观测、定位、分析并优化这些性能问题的。
</li>
<li>
**套路篇**,在理解了基础,亲身体验了模拟案例之后,我会帮你梳理出排查问题的整体思路,也就是检查性能问题的一般步骤,这样,以后你遇到问题,就可以按照这样的路子来。
</li>
<li>
**答疑篇**,我相信在学习完每一个模块之后,你都会有很多的问题,在答疑篇里,我会拿出提问频次较高的问题给你系统解答。
</li>
第 5 个综合实战模块,我将为你还原真实的工作场景,手把手带你在“**高级战场**”中演练,这样你能把前面学到的所有知识融会贯通,并且看完专栏,马上就能用在工作中。
整个专栏,我会把内容尽量写得通俗易懂,并帮你划出重点、理出知识脉络,再通过案例分析和套路总结,让你学得更透、用得更熟。
明天就要正式开课了,开始之前,我要把何炅说过的那句我特别认同的鸡汤送给你,“**想要得到你就要学会付出,要付出还要坚持;如果你真的觉得很难,那你就放弃,如果你放弃了就不要抱怨。人生就是这样,世界是平衡的,每个人都是通过自己的努力,去决定自己生活的样子。**”
不为别的,就希望你能和我坚持下去,一直到最后一篇文章。这中间,有想不明白的地方,你要先自己多琢磨几次;还是不懂的,你可以在留言区找我问;有需要总结提炼的知识点,你也要自己多下笔。你还可以写下自己的经历,记录你的分析步骤和思路,我都会及时回复你。
最后你可以在留言区给自己立个Flag**哪怕只是在留言区打卡你的学习天数,我相信都是会有效果的**。3个月后我们一起再来验收。
总之让我们一起携手为你交付“Linux性能优化”这个大技能
[<img src="https://static001.geekbang.org/resource/image/19/bc/19bc90ffcf4b1fba4938727e5bc0ecbc.jpg" alt="unpreview">](time://mall?url=https%3A%2F%2Fshop18793264.youzan.com%2Fv2%2Fgoods%2F1y7qqgp3ghd2g%3Fdc_ps%3D2347114008676525065.200001)
Linux知识地图2.0典藏版现货发售2000份把5米长的图谱装进背包1分钟定位80%的高频问题。