开篇词 | 万变不离其宗,性能优化也有章可循

你好,我是陶辉。欢迎你和我一起学习“系统性能优化”。

从2004年毕业到现在,无论我在华为、思科、腾讯、阿里巴巴等等哪家公司,我的工作总是与“性能”相伴,从底层、应用层到前端,我一直都很关心系统如何能够服务更多的用户,提供更快的体验。换句话说啊,性能优化最根本的目的,还是要跟上业务的发展脚步。

在我看来,程序员所做的工作,就是把现实世界中的问题,用数据、模型来抽象,再用计算机的计算能力把问题解决掉,虽然IT设备的运行速度日新月异,但业务要处理的数据在现实世界中近乎是无限的,而我们的计算能力相对则极为有限。所以,我们需要提升计算的效率,需要更苛刻地使用计算机和网络设备,做性价比更高的事儿。

而从十几年的性能优化工作中我发现,性能不只对产品的攻城掠地至关重要,它也是程序员价值的重要体现,特别是它在工作面试、技术等级晋升上也扮演着核心角色。

比如,在大多数拥有技术职级晋升体系的公司里,为了保障公平性,一般都是由跨部门的专家组成评委会的,而其他部门的高级专家在不熟悉候选人业务的情况下,只能去考察底层的硬核知识,而性能问题又是最有区分度的问题。如果你始终埋头在业务中,不关心更通用的性能优化方法论,将在技术等级晋升上非常吃亏。

再比如,你在面试互联网大厂时,面试官总会问许多超出工作范围的性能问题,为什么会这样呢?当然你可以感慨甚至抱怨,这不就是“面试造火箭,入职拧螺丝”嘛,但你也可以从面试官的角度来看这个问题,你会发现性能就是最好的面试题,它从算法到架构,既能考察候选人的潜力,也能考察候选人的工程能力。如果候选人具备系统的性能优化方法论,那么无论在架构设计还是应用模块开发上,他的代码可扩展性都会更好,消耗的计算力、带宽、磁盘等IT资源也更少!

这么看来,不论是为了满足业务发展的需求,还是在面试、晋升场景中有更好的表现,如果你希望成为高薪高效的10X程序员,那么,系统地学习性能优化就是一门必修课。

那具体应该从哪里入手呢?当然是看需求。当下的后端几乎都是分布式系统,那么对应的,我们面对的课题也就是如何全面提升复杂集群的性能。然而,如果你在Google上搜索如何优化分布式系统的性能,你只能找到孤零零的几篇文章,而谈到分布式系统的多数书籍也都在讨论容错、事务、流控等概念的实现,很少有文章介绍如何优化整个系统的性能。这恰恰就是我想做这门课的初衷。

我希望把自己这些年来在分布式性能领域所遇到的问题和解决方案,归纳总结、抽离萃取,梳理出一条系统化的性能学习路径交付给你,告诉你我眼中的性能问题本质是怎样的。在我看来啊,性能优化的本质就是最大化整个系统的综合效率,为了达到这个目标,我们需要从空间、时间维度上,不断地优化基础资源间的协作方式。

文稿中我给你总结了一份系统性能优化核心关注点的知识脑图,你可以同步看一下:

通过这份脑图,你会发现,我是从4个方面来梳理的,这其实就是我们在提升一个新系统的性能时,可以入手的4个层次。

首先,你可以从提升单机进程的性能入手,包括高效地使用主机的CPU、内存、磁盘等硬件,通过并发编程提升吞吐量,根据业务特性选择合适的算法。

其次,分布式系统是由各个组件通过网络连接在一起,所以优化传输层网络可以让所有组件同时受益。具体优化时,你可以从降低请求的时延,提升总体吞吐量两个方向入手。

再次呢,你要对业务消息采用更高效的编码方式,这既包括协议头、包体的优化,也包括TLS安全层的性能提升。具体优化时,既要深入静态编码,也要从动态的增量编码上优化。同时,调整消息的交互方式也能提升性能。

最后,我们再从集群整体上进行架构层面的优化。基于ACP、AKF、NWR等分布式理论,我们的优化方向仍然是降低时延和提升吞吐量,但实现方式则要运用分而治之的思想,调度集群中的所有结点协作配合,完成性能优化目标。

我这么介绍完吧,我猜你心里可能会有一些问题,好像这些内容都挺熟悉呀?是的,咱们这门课的知识点并不是非常新的前沿知识,而是我们每天coding时都在面对的日常问题。这里的关键是我们得系统地掌握这些知识点,在心中构建出性能优化树状知识图谱,然后我们才能更有底气地优化整个系统的性能。

另外,你可能也会感觉到,哎,好像性能优化也没那么复杂吧,感觉知识点不多呀!如果你是这么想的,那我要先夸夸你,我们就是要有这样的信心,先不给自己设限,不能还没开始就怕了。不过有了信心和动力后呢,也还是要再听我多说几句。

性能问题其实是计算机体系的底层问题,它涉及到的知识面非常广,我们的课程不可能覆盖全部领域。我最希望给到你的,是基于自己的经历和经验,对知识做一次筛选和过滤,把我已经构建起来的性能优化体系给到你,但同时,我能保证我们在解决性能优化中一些典型问题的同时,可以关联到绝大部分领域,对于任何一个领域,如果你需要进一步深入学习,你也能够知道自己的目标和路径。

好了,课程我就介绍到这里,你准备好了吗?那在正式开始之前,我们先来定下学习目标吧。

如果你需要从架构层面优化整个系统,那么这门课可以拓展你的知识面,告诉你如何优化架构才能让整体服务获得最大性能。那你的学习目标就要聚焦在知识体系上,你需要阶段性地做总结分享。

如果你刚开始接触性能优化,这门课则可以给你打牢基础,告诉你影响性能的底层因素,在实践中优化你的程序,看到立竿见影的效果。那我对你的要求就是每节课都要认真完成课后思考题,学习过程中有任何问题都要及时提问,不积压不懂的地方。

当然了,我的“要求”主要是供你参考的,欢迎你在留言区写写自己的学习计划。最后,我还特别希望听你说说,你目前的工作状态,是否意识到了性能问题的重要性,是否已经在解决很多性能相关的棘手问题,是否自己也总结了一些性能优化思路,分享出来,我们一起交流。

讲到最后,我都有点激动了,我一直认为性能优化并非是架构师的专属技能,只要我们有清晰的路径,积硅步成千里,我们都可以用更好的体验、更低的成本来服务更多的用户,还能轻松应对大厂面试,完成公司技术体系内的晋升,拿到更高的薪资。

那还等啥,从现在开始,我们就一起解锁分布式系统的性能优化吧!

精选留言

  • 学要有所用

    2020-04-27 19:53:22

    学习这门课需要具备哪些基础?希望老师讲一下。每个人的基础都不一样,基础好的学一遍就懂,基础差的学很多遍可能依然不懂,学习者希望能吸收所学变成自己的东西,这才是最重要的。另外老师能否讲下您是如何学习性能调优这块的?希望追逐您的学习路径让自己少走些弯路,毕竟性能调优这块东西很多,完全依靠他人也是不行的,授人以鱼的同时授人以渔,两者结合才能更好,同时也能较好地与老师解耦,减少对老师的依赖。但是不会完全解耦,毕竟藕断丝连,还是会适当的依赖老师。
    作者回复

    你好和同学^_^,我先说下哪些基础最好有一些:
    1、对操作系统的原理有简单的了解,比如,文件是怎么读取的,HTTP请求是怎么发送和接收的;
    2、对网络协议要有所了解,毕竟分布式系统就是靠网络将操作系统上的进程连接在一起。这块《Web协议详解与抓包实战》可以先学下。
    2、大致知道什么是分布式系统,这块网上的文章有很多。

    再来说下我是如何学习性能调优的。
    1、我首先是被问题驱动的,特别是在腾讯时,用户流量导致系统需要不断优化、扩容。再然后就自然的进行系统化总结,发现大学里的《数据结构》课白学了。又重头开始学习《算法导论》。发现《网络原理》课白学了,又开始学习《TCP/IP协议详解》。等等,这是一个螺旋上升的过程,你可以参考下。
    2、就像我在直播中说的,找对路径很重要,比如你想从《数据结构》教科书中学算法,那就完蛋了,冒泡、选择这两种排序的优劣都无法彻底弄清楚。

    2020-04-27 21:53:27

  • 我来也

    2020-04-27 17:53:24

    哈哈,老师终于上了一个文字的专栏了。

    之前两个视频的都没看完。
    但是文字专栏,我一般都会跟完的。
    作者回复

    三门课都买了啊,你这样真的完全抬高了程序员的入行门槛啦,哈哈。
    写文字专栏跟出视频课的感觉完全不同,视频课可以通过演示讲清楚问题,而文字专栏则要反复打磨文字,而且还跟写书的方式不同,写得头发掉了很多,^_^

    BTW,直播中忘了你名字啦,后来看留言“老师说的就是我”,哈哈,实在不好意思

    2020-04-27 19:12:54

  • 神经旷野舞者

    2020-04-30 01:19:17

    老师要不要把算法学一遍再来学,总感觉算法才是性能的真正核心?
    作者回复

    算法和计算机原理都是这门课的基础知识,但我认为,这些技术都不是学完A再来学B,而对它们的掌握是螺旋式上升的。
    比如,第3讲必须基于时间复杂度才能讲清楚,但又不需要用到动态规划、图论等应用领域更狭窄、也更复杂的算法,因此,当你带着这些问题再去学算法或者操作系统、编译原理等知识,它们之间会互相融会贯通,形成网状知识。当大脑中的各类知识能互相连接在一起,原本知识就会形成1+1=10的效果。所以,我推荐你用问题驱动的方式学习。

    2020-04-30 08:31:31

  • Liang

    2020-04-27 22:37:18

    老师可以推荐些性能调优相关的书籍么?谢谢!
    作者回复

    每周抽时间沉下心来看看纸质书,非常好!推荐你看看《性能之巅》这本书

    2020-04-28 09:49:17

  • Dark

    2020-04-27 20:43:09

    老师的口音真是爱了
    作者回复

    哈哈😄,谢谢老王老李,作为北方银正在努力解决翘舌平舌和前鼻音后鼻音的发音问题中:-)

    2020-04-27 23:00:30

  • Oliver

    2020-04-28 09:03:43

    陶老师您好,3月底在某乎看到老师对“推荐学习nginx的书”的回答,目前http权威指南快看完了,受益匪浅,感谢老师分享自己的知识和经验👍👍
    作者回复

    厉害啦同学,实体书阅读不易,你能那么快看完这个大部头,也一定有很多收获,不妨考虑写个系列文章分享出来,通常这个过程会反过来提升你的学习深度^_^

    2020-04-28 10:07:22

  • 灰太狼

    2020-04-28 10:40:40

    买个ngnix的视频课程,那本深入理解ngnix书也买了好久了,一直没时间系统看,打算好好学学了
    作者回复

    建议先看视频课程,因为我写书时用的是作者思维,学习时有点困难,准备后续第3版改改呢。而制作极客时间课程时,张浩编辑重新帮我塑造了读者思维,哈,这门课容易学一些

    2020-04-28 10:55:31

  • 神经旷野舞者

    2020-04-30 01:25:41

    老师分布式有推荐的学习路径吗,一直觉得分布式很高大上很复杂,也没接触过,可能是畏难了
    作者回复

    这门课的组织形式倒是蛮适合你,第1部分先讲单主机如何提升性能,到了瓶颈后开始用网络,第2、3部分重点在讲多台主机间如何互相连接成为集群,第4部分讲集群的架构上有何设计方法和注意事项。你也可以参考这一流程来学习。

    2020-04-30 08:36:13

  • 罐头瓶子

    2020-04-27 22:42:27

    之前的两门课都完全学完了,新课毫不犹豫上手
    作者回复

    罐头瓶子很厉害!前两门视频课200多讲,都是视频课中内容极多的,能完全学完真的很有死磕自己的精神!咱们就是要抬高程序员的新入行成本^_^

    2020-04-28 09:40:59

  • 忆水寒

    2020-04-27 18:20:30

    其实性能优化是一个很大的工程,倪鹏飞老师专栏介绍了Linux下的性能优化。
    希望配合本专栏 继续构建完善自己的知识体系。
    加油!
    作者回复

    是的,性能优化体系很复杂庞大,课程内容与每位老师自身的经验关系很大,互相补充更容易融会贯通!

    2020-04-27 22:06:43

  • tony

    2020-05-04 20:35:33

    陶老师太厉害了,开篇讲解很清晰,继续学习。在linux上压测nginx时,发现nginx并发性能上不去,详细情况如下:
    1. nginx部署在8核linux虚拟机上,nginx配置8个进程。
    2. nginx提供一个http接口,该http接口reponse body返回10字节内容。
    3. jmeter安装在另外一台linux机器,与nginx同在一个局域网;压测时,nginx每秒吞吐量在9000多次;不管在再增加几台机器并增加jmeter线程数,nginx吞吐量不会增加,反而会下降。
    4. 同时nginx所在linux机器cpu 40%以下,网络流量也暂用不大。
    疑问:
    cpu没有充分利用且网络流量不高,是否虚拟机网卡驱动性能有问题?
    作者回复

    你好tony,可以尝试下排除法:
    1、本机压下看看?
    2、网络流量是否到达瓶颈?包括链路中的交换机等
    3、更换压测工具,比如性能更强的wrk试试

    2020-05-05 07:34:45

  • 早起不吃虫

    2020-04-29 20:48:49

    一开始照惯性以为是视频课,结果买了才发现是专栏,意外之喜呀,专栏感觉比视频课的形式更友好一些,方便反复跳跃式学习!继续支持陶辉老师!
    作者回复

    你好,早起不吃虫,谢谢你的信任。视频课的优势是可以一起敲代码实践^_^,专栏课的优势可以利用碎片化时间,都很有趣!

    2020-04-30 08:33:44

  • 鲜于.css

    2020-04-27 17:35:01

    作为前端的我,想学习一下,却发现目录都看不太懂= =需要补的太多了
    作者回复

    你的名字好前端!呵呵,希望你能坚持学完整个专栏!
    前端追求更好的用户体验时,其实也需要提升主机的效能,这不完全是框架的责任。
    另外,你也可以了解下全栈方向,这对自己的职业生涯很有帮助。
    这门课可能会有些深,不要着急,先过一遍理清路径和知识点,以后具体优化某个性能问题时,可以再回过头来看看。

    2020-04-27 19:10:31

  • book尾汁

    2020-04-28 02:38:20

    首先感谢老师送出的专栏,老师的nginx和抓包的我都有,还有nginx的书籍,因为自己之前在cdn做运维,无论是协议还是nginx都与平时的工作紧密相关,最近在学习linux内核相关的知识,希望能和这门课集合起来,让我对系统的认真更加深入,学习计划,做好思考题,建立自己的性能优化思路,希望自己离sre更近一步。
    作者回复

    哈哈,昨晚直播中赠送课程的张智凯同学,最近可以考虑买彩票啦,抽奖时我眼都看花了。
    以终为始非常好,SRE需要运维具备一定的开发能力和架构设计能力,希望这门课能让你更快地到达这个目标!

    2020-04-28 09:18:23

  • 小树苗

    2020-04-27 18:38:07

    当前的业务没有太大的性能问题,但是不进则退,不管是为了应对将来的性能问题还是提升自己的技能,学习性能优化都是很有必要的。
    作者回复

    是的,有焦虑才有追求,有追求才有动力,有动力才有进步!加油小树苗!!

    2020-04-27 22:22:29

  • leslie

    2020-04-27 18:07:32

    老师的新课又出了-继续学习,nginx、网络协议都有学习,虽然至今当工具在用其中部分,不过还是受益匪浅。
    倪老师的课其实我已经学了一遍且不少东西已经用在实际工作中,站在数据系统、操作系统的角度做性能优化已经做过了;不过我觉得老师更擅长的站在网络的中心去整体系统性能优化,希望能听到老师有些不一样的东西;老师站在网络角度分析内容讲的很不同。
    期待老师的分享。
    作者回复

    你好leslie,又见面啦^_^
    是的,性能这话题太大了,涉及知识面很广,每个想分享性能优化的老师,都带着强烈的个人经验来讲的。我更多是站在分布式系统的角度上去看性能优化,因为这就是我从2007年到现在一直在做的事,呵,有很强的倾向性,希望能够给你不同角度的思考。

    2020-04-27 22:20:35

  • 程序员俊达

    2022-03-15 10:24:32

    陶辉哥下一个专栏什么时候出啊?
  • CJJ

    2020-04-28 23:41:57

    以前工作中项目并发很低而且量级没上来,就没太注意性能优化这一块,现在开始涉及数据同步,我想,还是有用的,我要坚持下来!
    作者回复

    你好CJJ,有工作需求的话,学习起来就有了正反馈,相信你一定能大有收获!

    2020-04-29 09:15:47

  • z

    2020-04-28 23:32:58

    陶粉啊。支持新课,刚好在工作点、兴趣点上。
    作者回复

    z同学你好,带着兴趣去学,又能实践验证,这是速度最快的学习过程!希望这门课可以让你满载而归!

    2020-04-29 08:44:36

  • 八两

    2020-04-28 07:22:47

    赞。陶辉老师的课程必学。依然成为粉丝了。
    作者回复

    你好八两,又见面啦!希望性能优化能成为你的职业生涯杀器😉

    2020-04-28 08:46:58