赵海平,2007年加入只有不到50个软件工程师的Facebook,致力于软件性能和架构分析,在此期间创建了HipHop项目,重新编写和实现PHP语言,使其速度提高5到6倍,为公司节约数十亿美元。HipHop项目之后,致力于“用异步处理来优化分布式系统”的设计理念中,并为此做了多项分布式数据库的优化研究,在PHP语言中加入了yield和generator的新功能,来帮助日趋复杂的Facebook 网页设计。
2015年3月,他回到中国,加入阿里巴巴技术保障部,任职研究员,将重点攻克阿里巴巴在软件性能以及Java使用过程中遇到的技术问题。
InfoQ已经邀请他在4月23日~25日举行的QCon北京2015大会上做主题演讲,分享《异步处理在分布式系统中的优化作用》。是什么吸引他加入了一家中国的互联网公司呢?InfoQ对他进行了专访。
InfoQ:首先欢迎您回到中国。可以介绍一下您加入阿里巴巴的初衷吗,阿里巴巴最吸引您的地方在哪里?
赵海平:去年机缘巧合,我和阿里巴巴的同事有了交流的机会。当时我们聊了很多技术细节,发现阿里巴巴的规模非常之大,很多技术上的难题是美国公司都没有的。比如说双十一这个问题,没有哪家美国公司单天有这么大的交易量,这是很特殊的一个问题。这个技术问题对我特别有吸引力。
当规模大到一定程度,简单的问题也会变得复杂。有的时候软件就是这个样子,在一台或者几台机器上执行是一个情况,当机器多到一定程度时,对软件的要求就特别高了。在多台机器上,怎么才能保持很快的速度,并且节省机器,又不出问题,这是一个很难的技术问题。
单天的资源需求是平时的好多倍,怎么计划机器,让峰值最高的那天不出现问题,平时又要做到很好的利用,这是很不容易的。我特别希望自己能够有这么一个经历,去阿里巴巴解决这个问题,这是在其他公司找不到的技术问题,而且跟我很对口,我一直在做的都是怎么提高大规模系统的性能、稳定性,所以这正是我的兴趣所在。
InfoQ:您在阿里巴巴的新角色就是解决这些基础设施的性能问题?
赵海平:基本上是几个方面,性能、稳定性、容量、架构,还有运维,恰恰就是我现在这个团队——技术保障部——的工作。性能提升上去,容量就增加了,随着我们监控系统的改进,系统的稳定性也会提高,运维也会更方便。如果发现架构上的问题,我们也会做些调整。
InfoQ:谈到性能问题,定位是很关键的一点。像这种规模的分布式系统,如何实现全系统的监控,准确定位问题就非常重要,您会在这方面发力吗?
赵海平:Profiling特别重要。如果能有一个特别强大的Profiling系统,就知道整个系统在哪个地方,哪台机器上,花了多少CPU、内存、磁盘IO或者网络带宽等资源,才能知道优化什么地方效益最大。
所以我的第一步工作就是帮助完善阿里巴巴的监控和Profiling系统,希望能够很清楚地把软件的整个性能展现给大家,做到实时监控,同时让研发人员看到自己的代码在线上的运行情况,了解这些代码花掉了多少资源,这样有问题的话他们可以自己解决。
InfoQ:大家对您的最初印象多是来自HipHop for PHP这个项目。像淘宝之前就从PHP切换到了Java,而Facebook选择了自己改进PHP。可以谈一下这个项目吗,当时的出发点是什么样的?
赵海平:HipHop也是一步步慢慢建立起来的。最初是我遇到了一个PHP的函数,在C++里也想用。当时想,重写一下就可以。不过那个PHP函数不断在变,我就想写一个简单的工具,把这个函数转换成C++,这样就可以跟上PHP代码的变化。那时正好机器开始吃紧,大家意识到PHP的速度问题,CPU消耗很大。大家就开始讨论如何提高PHP的性能。当时想法很多,有人想改变PHP本身,有人想干脆用Python或Java重写网站。
当时也重写过,有三四个人在做这件事情,但这些人改的速度远远赶不上另外二三十人写新PHP业务代码的速度。所以我们就想到写一个工具,来转换这些新写的代码,既不干扰既有的开发节奏,又能大幅优化性能,跟上变化。
当时我也读了下Zend Engine的代码,研究PHP为什么会慢。发现PHP速度之所以慢,是因为有很多的函数调用是动态的,而像C和C++里,很多函数是静态调用,不需要在执行的过程中去查询函数指针在什么地方,所以速度才快。
所以我们做了很大的调整,一定要改变这种方式,争取让所有的函数调用都能尽快实现,在编译的时候静态处理,执行的过程中就不需要再查询,指针已经在那儿了,这是最主要的加速思路。
那时候就萌芽了一个想法,如果能够把PHP直接转换成C++,也许这个性能问题就解决了。然后就花了很多时间去做原型。我们做了很多工作,把底层的PHP实现都改变了,有一个自己的Runtime Library,再就是一个PHP的扩展库,这个实际上是很大的一块代码。在这个上面,我们又写了一个把PHP转换成C++的一个编译器。先将PHP编译成C++,然后靠底下的这个库实现功能。这是最早期的工作。
不过这在当时只是一个副业,因为不知道这个东西到底有没有意义,是不是能提高性能。大概能拿出30%~40%的时间做这个。做完之后发现效果很好,就加入了其他同事一起做。后来速度不断提高,第一年提高了2倍,第二年又提高了2倍,后来提高到5~6倍的样子。
现在回头看,如果当时雇很多人把网站改成Java的,也是可以做到的,但Facebook的发展可能要停半年到一年时间,甚至更久,就有可能对Facebook的发展带来不可预期的影响。这件事情主要还是业务推动的。
InfoQ:后来HipHop发展成HHVM,从原来的静态编译变成了动态的JIT机制,您也参与了这方面的工作吗?
赵海平:引入HipHop之后,我们也有自己本身的一些问题,比如产品环境和开发环境就是不一样的,这样多多少少会存在一些问题,也就容易出现bug。再就是Facebook的代码量非常庞大,编译时间非常长,另外生成的二进制文件也非常大(超过1G),发布也很困难。
这时就出现了HHVM。HHVM不再是把PHP转换成C++,而是采用了一种新方法,把PHP转换成一个中间码,这个中间码在执行过程中再转换成机器码,不过调用的还是我们原来为HipHop写的底层库,它取代的主要是把PHP编译为C++的过程。
我并没有参与HHVM的编写,当时我已经离开这个小组了,另外一件事情吸引了我,这就是异步处理在分布式系统中的优化作用。
之所以离开这个小组,原因大概有几个方面:一个是,个人认为HHVM不再能把性能提高更多了,后来也确实如此,两三年之后HHVM出来,速度并没有更大的提高,最高只比原来静态编译机制快10%~15%,而且是因为静态编译这一块不再开发了。再就是新的课题特别有意思,具体我会在QCon北京上分享。
这就是为什么去GitHub上看,HHVM里面会有我的代码,主要是底层的代码还是基于HipHop的。HHVM的头两个字母就是来自HipHop,引擎还是原来的,不过上面做了很多工作,把PHP转换成中间代码,这个有点像Java的JVM。这样的好处就是研发过程和产品过程其实是一样的,而且不会有原来说的那种超大二进制文件的问题。中间代码很小,PHP可以直接发布到线上系统上。
InfoQ:国外一些著名的互联网公司,在性能调整和优化的过程中,慢慢都发展出了自己的编程语言,像Facebook设计了Hack语言,Google有Go和Dart等语言,Apple有Swift等。这方面您有什么感想吗,Facebook的Hack语言您是不是参与设计了?
赵海平:Google的Go语言挺有意思的,写得非常好。Hack语言我没有太多的参与。
PHP是弱类型的,这是性能提高的一个瓶颈,而强类型的话就可以做很多优化。最初我们是想增强PHP的类型系统。强化数据类型,这是引入Hack的一个主要因素。
InfoQ:PHP7最近也有很多改变,性能提高也比较大。
赵海平:这也是我临来之前刚刚听到的。PHP核心开发组的力量是很强的。我也跟他们的人员交流过,他们对整个PHP的优化有自己的思路和想法,也做了很多工作。这是件好事。其实重要的并不是说哪个团队或小组把PHP优化到什么样的地步,有几个小组都在做这个事情,彼此竞争,会促进整个PHP生态系统的发展。这种竞争也恰恰说明了PHP的重要,所以会有很多人关注它的性能优化。
InfoQ:您对公司发明创造自己的编程语言怎么看?
赵海平:编程语言这个问题,我说两点。第一,不能把语言当成一个特别神圣、至高无上的东西。语言也是整个软件系统的一部分,只是它分割的很好,独立出来了,可以执行更多的功能,我们可以用它实现我们的功能,可是在整体架构上看,语言也只不过是软件系统的一部分,而这一部分我们完全可以做一些调整,使其更适合我们的系统。而设计语言时一般考虑的是比较通用的目标,我们拿来用,只是因为它的绝大部分特性都是我们想用的。比如我们用C和C++写程序的时候,每次都要思考内存的模式是什么,是不是用share pointer,是不是用自己写的Object,内存的allocation/deallocation怎么做,一个语言帮我们把这些事情都做好了,这就是它的好处。它提供了一个很大的库,提供了一个软件执行的环境和范围,而这正是我们选择语言的初衷。
第二,作为一个公司来讲,不能说为了研发一个语言而去研发一个语言。这是没有意义的。一定要根据自己想要做的事情,在现有的软件架构当中,我们发现当前所用的语言提供的环境和范围不太适合,或者说这个语言的很多假设和假想,和我们所期待的东西并不一样,只有在这个时候,我们怎么也找不到一个合适语言的时候,我们才会创造一个新的语言,让这个语言更适合公司的事情。如果可以通用化,提炼出来,那就是语言,否则设计成软件库就可以了。
这是水到渠成的,不要强求。像Google开发Go语言,我认为它有自己的考量,可能在开发很多分布式系统的时候,现在的语言写法上不太直观,或者速度不够快,所以才创造了这么一个东西。Go应该能解决公司内部的很多问题,否则是很难存活的。
InfoQ:您可以结合自己这些年的经验,给中国开发者的成长一些建议吗?
赵海平:在美国的时候,我跟Facebook的中国员工聊的很多。我给他们最多的建议就几条。
第一,一定要提高交流能力。咱们中国人,尤其是中国搞计算机的人,很多人有个不该有的特点,就是喜欢把自己锁在黑屋子里埋头干活,跟机器交流特别擅长,跟人的交流一窍不通。这样不行,我相信在中国也是这样的,你不但要把自己的工作,技术活要做得特别好,而且要擅长表达自己的想法,擅长在工作当中讲述做的是什么,怎么样能够说服别人,怎么样能够跟别人在不伤和气的情况下,把问题解决好,这是很强的一个能力,而这个能力不是在学校里能学会的,是我们走向社会之后慢慢学到的东西,这个我恰恰认为中国的员工,尤其是在美国那样的环境,因为不是母语,可能处理得就不是特别好,有时说出来的话比较生硬,给对方的感觉不是特别好。
第二,中国人比较谦虚、内敛,讲究内涵,自己心里有的东西不表达出来。但是在工作中,可以适度强势一点,勇敢表达自己的想法。当然这个建议是基于美国多元文化的背景,在国内大家的文化背景一致,也许可以探讨最合适的沟通方式。
第三,掌握好英语,开拓眼界。我觉得在计算机这个技术里边能够非常了解英语,把英语的这个隔阂给去掉还是非常重要的。
我回来的时间还不长,等和大家接触多了,可能会有新的想法,目前就这几点吧。
InfoQ:好,感谢您接受我们的采访。期待您在QCon上的分享。