无论你是运维还是开发,可能都经历过这样的场景:
流量高峰期,服务器 CPU 使用率过高报警,你登录 Linux 上去 top 完之后,却不知道怎么进一步定位,到底是系统 CPU 资源太少,还是程序并发部分写得有问题? 系统并没有跑什么吃内存的程序,但在敲完 free 命令之后,却发现已经没什么内存了,到底是哪里占用了内存?为什么? 一大早就收到 Zabbix 告警,你发现某台存放监控数据的数据库主机 CPU 的 I/O Wait 较高,该怎么办?
面对这样的场景,你愿意束手无策等待帮助,还是游刃有余庖丁解牛?
性能优化是软件系统中最有挑战的工作之一,就算看了很多资料和书籍,一旦涉及到解决具体问题,还是会一脸懵逼。
大多数时候,我们只能看到“症状”,却不知道从哪儿下手排查和解决。
极客们常说,只有知道一件事物的原理,它才是有用的东西。
Linux 性能优化是个系统工程,除了要学习那些基础知识点之外,还有 2 点比较重要:
这样,你才能把观察到的性能问题跟系统原理关联起来,特别是把应用程序、库函数、系统调用、内核和硬件等不同的层级贯穿起来。
说到性能工具,就不得不提性能领域的大师布伦丹·格雷格(Brendan Gregg)。他不仅是动态追踪工具 DTrace 的作者,还开发了许许多多的性能工具。
我相信你一定见过他所描绘的 Linux 性能工具图谱:
△ 图片来自 brendangregg.com
这个图是 Linux 性能分析最重要的参考资料之一,它告诉你在 Linux 不同子系统出现性能问题后,应该用什么样的工具来观测和分析。
比如,当遇到 I/O 性能问题时,可以参考图片最下方的 I/O 子系统,使用 iostat、iotop、blktrace 等工具分析磁盘 I/O 的瓶颈。
为了让你对性能有个全面的认识,可以看看下面这张思维导图,里面涵盖了大部分性能分析和优化都会包含的知识。
△ Linux 性能优化思维导图
另外,我还要特别强调一点,就是性能工具的选用。
有句话是这么说的,一个正确的选择胜过千百次的努力。虽然夸张了些,但是选用合适的性能工具,确实可以大大简化整个性能优化过程。
但切记,千万不要把性能工具当成学习的全部。工具只是解决问题的手段,关键在于你的用法。
只有真正理解了它们背后的原理,并且结合具体场景,融会贯通系统的不同组件,你才能真正掌握它们。
对于我们大多数人来说,最好的学习方式一定是带着问题学习,而不是先去啃那几本厚厚的原理书籍,这样容易把自己的信心压垮。
我认为,学习要会抓重点,只要你了解少数几个系统组件的基本原理和协作方式,掌握基本的性能指标和工具,学习实际工作中性能优化的常用技巧,你就已经可以准确分析和优化大多数的性能问题了。
在这个认知和基础上,再反过来去阅读那些经典的操作系统或者其它图书,才能事半功倍。
去年年末那会儿,我看极客时间出了个《Linux 性能优化实战》专栏,作者是倪朋飞,上面那张详细的知识图谱就是他画的。
抱着试试看的态度我订阅了,然而平时工作太忙,最近才陆陆续续追完,感觉收获很大,帮我解决了工作中的一些实际问题。
这两年知识付费泛滥,这个专栏是其中的一股清流了,可以负责地说,这是我在知识付费中收获最大的一门课,这里 Mike 推荐给你。
课程大概有 60 讲,讲了 Linux 性能的基本指标、工具,以及相应的观测、分析和调优方法,用实际案例贯穿了从应用程序到操作系统的各个组件。
我看上线也不过 几个月,已经有近 2W 人订阅了,截了一些评价,可以参考看看:
作者是微软的 Azure 资深工程师,主要负责开源容器编排系统 Kubernetes 在 Azure 的落地实践。
哥们有着近 10 年的云计算工作经验,所以对 Linux 性能优化这套东西有一些自己的思考和沉淀。
除了内容硬核以外,还有 2 点不得不提:
1、讲解得很成体系,每一章节都有基础篇、案例篇和套路篇,选的案例比较有针对性,基本都是工作中用得上的,「套路篇」就更别说了,有好几篇我看了不止一遍。
2、倪朋飞不仅会回答大家提出的问题,还会针对那些有代表性进行公开答疑,确实挺走心。
说真的,光看评论区也能收获不少,自己的认知还是有局限性,有些问题现在没碰到,不等于以后不会出现。
结合目录我总结了一下,要把这个硬核的专栏「啃下来」,你能获得下面这些知识:
说了半天,看看目录吧: