00 开篇词 别再让Linux性能问题成为你的绊脚石

你好,我是倪朋飞,一个云计算老兵,Kubernetes项目维护者,主要负责开源容器编排系统Kubernetes在Azure的落地实践。

一直以来,我都在云计算领域工作。对于服务器性能的关注,可以追溯到我刚参加工作那会儿。为什么那么早就开始探索性能问题呢?其实是源于一次我永远都忘不了的“事故”。

那会儿我在盛大云工作,忙活了大半夜把产品发布上线后,刚刚躺下打算休息,却突然收到大量的告警。匆忙爬起来登录到服务器之后,我发现有一些系统进程的CPU使用率高达 100%。

当时我完全是两眼一抹黑,可以说是只能看到症状,却完全不知道该从哪儿下手去排查和解决它。直到最后,我也没能想到好办法,这次发布也成了我心中之痛。

从那之后,我开始到处查看各种相关书籍,从操作系统原理、到Linux内核,再到硬件驱动程序等等。可是,学了那么多知识之后,我还是不能很快解决类似的性能问题。

于是,我又通过网络搜索,或者请教公司的技术大拿,学习了大量性能优化的思路和方法,这期间尝试了大量的Linux性能工具。在不断的实践和总结后,我终于知道,怎么把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序、库函数、系统调用、再到内核和硬件等不同的层级贯穿起来。

这段学习可以算得上是我的“黑暗”经历了。我想,不仅是我一个人,很多人应该都有过这样的挫折。比如说:

这些问题或者场景,你肯定或多或少都遇到过。

实际上,性能优化一直都是大多数软件工程师头上的“紧箍咒”,甚至许多工作多年的资深工程师,也无法准确地分析出线上的很多性能问题。

性能问题为什么这么难呢?我觉得主要是因为性能优化是个系统工程,总是牵一发而动全身。它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时出问题。

毫无疑问,性能优化是软件系统中最有挑战的工作之一,但是换个角度看,它也是最考验体现你综合能力的工作之一。如果说你能把性能优化的各个关键点吃透,那我可以肯定地说,你已经是一个非常优秀的软件工程师了。

那怎样才能掌握这个技能呢?你可以像我前面说的那样,花大量的时间和精力去钻研,从内功到实战一一苦练。当然,那样可行,但也会走很多弯路,而且可能你啃了很多大块头的书,终于拿下了最难的底层体系,却因为缺乏实战经验,在实际开发工作中仍然没有头绪。

其实,对于我们大多数人来说,最好的学习方式一定是带着问题学习,而不是先去啃那几本厚厚的原理书籍,这样很容易把自己的信心压垮。

我认为,学习要会抓重点。其实只要你了解少数几个系统组件的基本原理和协作方式,掌握基本的性能指标和工具,学会实际工作中性能优化的常用技巧,你就已经可以准确分析和优化大多数的性能问题了。在这个认知的基础上,再反过来去阅读那些经典的操作系统或者其它图书,你才能事半功倍。

所以,在这个专栏里,我会以案例驱动的思路,给你讲解Linux性能的基本指标、工具,以及相应的观测、分析和调优方法。

具体来看,我会分为5个模块。前4个模块我会从资源使用的视角出发,带你分析各种Linux资源可能会碰到的性能问题,包括 CPU 性能磁盘 I/O 性能内存性能以及网络性能。每个模块还由浅入深划分为四个不同的篇章。

第 5 个综合实战模块,我将为你还原真实的工作场景,手把手带你在“高级战场”中演练,这样你能把前面学到的所有知识融会贯通,并且看完专栏,马上就能用在工作中。

整个专栏,我会把内容尽量写得通俗易懂,并帮你划出重点、理出知识脉络,再通过案例分析和套路总结,让你学得更透、用得更熟。

明天就要正式开课了,开始之前,我要把何炅说过的那句我特别认同的鸡汤送给你,“想要得到你就要学会付出,要付出还要坚持;如果你真的觉得很难,那你就放弃,如果你放弃了就不要抱怨。人生就是这样,世界是平衡的,每个人都是通过自己的努力,去决定自己生活的样子。

不为别的,就希望你能和我坚持下去,一直到最后一篇文章。这中间,有想不明白的地方,你要先自己多琢磨几次;还是不懂的,你可以在留言区找我问;有需要总结提炼的知识点,你也要自己多下笔。你还可以写下自己的经历,记录你的分析步骤和思路,我都会及时回复你。

最后,你可以在留言区给自己立个Flag,哪怕只是在留言区打卡你的学习天数,我相信都是会有效果的。3个月后,我们一起再来验收。

总之,让我们一起携手,为你交付“Linux性能优化”这个大技能!

unpreview

Linux知识地图2.0典藏版,现货发售2000份,把5米长的图谱装进背包,1分钟定位80%的高频问题。