你好,我是庄振运。
在前面两讲中,我们看到了性能优化和容量效率提升的重要性,如果程序员在这方面的技能和知识有欠缺,只知道写代码,那么写出来的代码很可能效率低、性能差。在代码性能差的情况下,如果你再被老板或者同事威逼利诱去做性能优化,那么就成了赶鸭子上架的苦差事了,你只能感叹:“问君能有几多愁,恰似写完代码去调优”。
玩笑开完,我们还是从正能量的角度去看一看吧。
这就要从一个典故说起了,美国福特汽车公司当年要排除一台大型发动机的故障,请了很多专家,但都束手无策。最后请来了著名的电机专家斯坦门茨(Charles Proteus Steinmetz)。斯坦门茨仔细检查了机器后,用粉笔在机器外壳的某处画了一道线,然后说:“把做记号处的电机线匝减少16圈。”难题居然就迎刃而解了。
斯坦门茨索要了1万美元作为报酬,很多人觉得实在是太多了。因为当时福特公司最著名的薪酬口号就是“日薪5美元”,也就是说一个工人每年能赚1千美元已经是很高薪了。但是斯坦门茨回答道:“用粉笔画一条线,顶多值1美元;但是知道在哪里画线值9999美元。”当公司总裁福特先生得知后,十分欣赏斯坦门茨,并很痛快地给了1万美元的酬金。
我们做性能工作也是如此,虽然性能优化的方法和最终解决方案或许看起来很简单直白,但是要知道在哪里做优化和做什么样的优化,却需要很多的测试和分析的工作经验。
每个程序员和运维人员都应该尽量多地了解性能优化和容量效率提升的知识,学习这方面的技能,因为在自己的职业的不同阶段都可以从这些技能获得收益。
那么,性能优化和容量效率提升需要什么样的知识和技能呢? 这一讲我就和你聊一聊。
性能和容量管理工作需要的知识面比较广, 而且最好具有其他相关方面的能力,比如要有一定的和人打交道的软技能,从而和其他员工以及其他团队进行有效地沟通和合作。
大体上讲,性能相关的工作有三个方面的特点,我分别说明一下。
第一个特点是知识面要广,并且软硬结合。
计算机方面的知识可以大体上分为两大类:软件相关和硬件相关。很多程序员对软件相关的知识了解多些,但对硬件方面了解不多。但是,因为很多性能问题会牵扯到硬件,所以基本要求就是“能软能硬”,两方面的知识都要足够。
第二个特点是“理论联系实际”。
一方面需要理论根底深厚,因为有时候性能问题是某些不明显的原因导致的,所以需要对各种协议,对软件和操作系统,对硬件和网络都要非常熟悉。同时,性能分析的过程需要做些实验来使真正的问题暴露出来,也就是需要进行验证,所以对动手能力的要求也比较高。
第三个特点是不但要会性能测试,还要会性能分析和性能优化。
我画了张图,希望能帮助你理清思路。通俗点说吧,这些方面对我们的要求就是:写得了代码,查得出异常;理得清问题,做得了测量;找得到病根,开得出药方。
我们现在先从知识方面讲起,看看性能和容量工作需要什么样的知识(参考上面的图)。
首先是软件方面,其实内容很多。图里面仅仅表示了几个方面,你可以参照我们上学时开的各种计算机方面的课程,尤其是操作系统、数据结构和算法、编译原理以及各类协议。这方面也包括很多数学和统计方面的知识。
硬件方面包括服务器本身、存储系统、各类网络、数据中心等等。这方面的重点是服务器本身的部件,比如CPU、内存等等。
至于实践经验,主要是关于性能方面的。比如很多系统的命令来观察系统资源的使用率,各种调试和测试工具,以及如何进行性能分析和性能优化的实践。
软技能方面,我会在这个专栏的最后两讲详细进行介绍,这里大概讲一下。做性能优化和容量管理工作经常需要和其他的团队和人员打交道。这些团队包括开发团队、数据中心团队、运维团队等等,需要和他们紧密而愉快地合作。同时,性能分析和优化经常需要把数据和分析展示给别人和领导看,这就需要你拥有一定的演讲能力。
性能问题通常是复杂的,性能工程师的工作就很像“医生”的工作,需要多方面的知识才能确诊(这个观点我在开篇词里有介绍,这里还是有必要再详细说说)。
虽然性能问题有时候明显的是表现在某个组件的问题,比如网络拥塞,但很多情况下并不容易确定是哪里出了问题。所以,就需要做很多种不同的测试和数据分析。
另外,很多程序和服务内部有很多模块,外部也牵扯到其他子系统。即使每个子系统分开来测试时都性能不错,但是在某些特殊情况下,会发生级联和连锁故障。所以,除了需要了解每个子系统内部的原理,还必须弄清楚不同模块和子系统之间的协作交互关系。
具体来讲,软件硬件各个子系统都可能因为各种情况下的交互而产生性能问题。尤其是垂直的软件硬件栈(比如程序、操作系统、硬件等),这样的跨层交互,更会产生各种复杂的性能特性,这方面的内容后面会详细展开。
我经常把性能工程师比作医生。
医生遇到有健康问题的病人,会做“望闻问切”,利用B超、X光等做各种分析。根据各种数据和病人的表象,医生会做出诊断,确定是什么病。然后会开药方或者给予相应的治疗。病人吃药和接受治疗后,会再次进行复检,来确定病情是已痊愈?是稍有缓解?还是加重了?
性能工程师对待计算机和互联网的性能问题也是如此,会首先观察各种参数,甚至进行主动的场景测试。根据性能测试的结果,可以做出分析,并最终确定性能问题的根因。这之后可以进行相应的性能优化来消除对应的性能问题。采取优化后,还需要进行重新测试来确定问题真正得到解决,亦或是另有他因,从而需要重新分析。
我用下图来类比这两种场景。
第一个场景是医生诊断病情和治疗病人。第二个场景是性能工程师分析问题并且优化性能。我们可以直观地看出两种场景中的每一步的相似之处。
我是怎样组织这个专栏的呢?首先重申,写这个专栏的初心是向你介绍性能和容量管理工程这一工作,并分享我近二十年来的学习和工作经验。
需要说明的是,这一领域和工作牵涉的内容其实非常广泛,包括所有的计算机互联网方面的知识。所以在我们这个专栏有限的时间内,面面俱到是不太现实的。出于这样的考虑,在这个专栏里我的侧重点及讲述方式和其它相关专栏和课程不太一样。
我在专栏文章中尽量做到深浅结合,既要让你能了解这一工作的重要性和大体情况,也要有足够的干货,希望能让你有恍然大悟的感觉。
计算机科学在国外大学里面一般不在工程学院下面开设,而是归类于艺术,“Art”,设置在艺术和科学学院下面。不管这种分类的渊源如何,我确实觉得计算机科学和性能调优真的是一门艺术,它需要知识,需要经验,也需要天分。既然是艺术,就和其它艺术形式,比如文学有其相通之处。
我个人喜好诗词古文,对生活中和学习中的很多感悟,我经常会跳出一层去体会。很多时候我发现不同领域的东西,它们的感觉和道理是完全相似或相通的。修辞学上有一种手法叫“通感”,就是不同的感觉方式的类似体验(比如听觉和视觉的相通等),也是这个道理。
所以,我在分享知识和经验的时候,有时会忍不住加上几句唐诗宋词古文,目的有好几个,第一是不希望一直干巴巴地讲课,希望加点调味料,提高你的兴趣;第二是理工科的技术和文科的文艺的确经常有异曲同工之妙,希望帮助你体会;第三呢,顺便帮你复习一下诗词,增加学习乐趣。
先一起来看看我们要学习的内容大纲。
考虑到很多朋友对这方面的工作不是特别了解,所以我开始在开篇这一部分用两讲来做一个宏观介绍,让你了解性能问题为什么对每一个IT人员都重要,尤其是对程序员。我分成“代码性能”和“系统性能及公司成本”来分别说明。
性能工程离不开理论基础。我接下来会用几讲来介绍最基础但也是最重要的数理基础和几大定律。这些数理基础包括一些基本的统计知识,以及对数据的分析和展示的方法。我还会把一些重要的性能相关的数字总结出来,让你参考和记忆。对待这些数字,你应该像对待九九乘法表一样,每个都铭记在心,因为工作中时时要用到。
性能工程离不开测试。性能测试是一切性能工作的基础和开端。
很多公司的性能工程师其实多数时间是花在性能测试上,包括进行测试的设计和分析测试结果。虽然测试工作看起来简单直白,可是真正做好性能测试并不容易,这里有相当多需要注意的地方。我会梳理其中一些经验和指导原则讲解给你。
当然,测试的工具也很重要,一个好的测试工具绝对让你事半功倍,所以我也会介绍常用的好工具。
我们需要对性能测试得到的数据进行仔细的分析和研究,只有这样才能发现真正的问题和找到性能问题的根本原因。而性能分析就是关键的一步。我会首先介绍进行性能数据分析的原则,然后抓住几个重点领域,包括CPU、内存、存储和网络,来分别介绍常见的性能问题,让你以后碰到这方面的问题时心里有数。
性能分析的目的是找到性能问题的根因,然后进行性能优化来解决问题。性能优化做得好,必须有相关方面的知识和实践经验。我会给你介绍性能优化的六大原则和十大常用策略,并分几个领域用生产中的案例做具体的展示。
我还特意准备了几讲稍微进阶的内容和实践案例。这些内容是我过去在几个大公司的亲身实践,每一讲都是针对某个具体场景的生产实战经验。
对公司,尤其是大公司来说,容量的规划管理和效率提升是很重要的,因为这直接关系着公司的运营成本。我注意到这方面的参考资料比较少,所以特意来和你介绍这一领域的知识。我会分成几部分来分享,包括服务器的部署、数据中心、容量规划、容量的效率提升以及服务需求的控制等等。
一个公司要成功运营,成本和对应的容量是总有限的,所以需要量入为出,对服务的需求进行适当的管理,尽量精打细算。管理的实践需要考虑很多因素,一方面尽量节省容量,另一方面也不能妨碍公司业务的扩展。如何把握这个度,我会讲讲经验。
最后两讲是介绍性能和容量工程师这个职业,包括这一工作的特点和职业前景。
随着大数据和互联网的飞速发展,我坚信这方面的工作越来越重要。尤其是大公司,都会专门招聘这方面的人才组成特殊的性能优化和容量管理团队。所以,针对有志于从事这一行业的朋友,我会分享这方面的面试经验。
得益于这种工作的特点,性能优化和容量效率需要了解的知识和技能比较广泛。人们常说:“读书破万卷,下笔如有神。”读书写文章是这个道理,做性能优化工作也是如此。只有不断学习计算机各方面的相关知识,博览群书,才能在解决性能问题时得心应手。
我们在前三讲里面一起探讨了为什么我们需要关心代码性能,系统性能和容量效率;并且了解了这方面的工作需要什么样的知识和技能。从下一讲开始,我们就一起学习这些知识和技能。
欢迎你在留言区分享自己的思考,与我和其他同学一起讨论,也欢迎你把文章分享给自己的朋友。
评论