【终南山.内核问道】Linux故障分析方法(上)

报告内容:Linux故障分析方法

报告人:谢宝友(中兴电信级嵌入式操作系统总工、中国工业大奖获得者)

 

    谢宝友:每次面对这么多专家学者的时候,我都有点紧张。刚才陈教授说过了,我没有上过大学,对大学生、研究生、教授都是以一种非常崇拜的心情面对的。今天我主要讲几个部分,当然我也希望有更多的时间可以和大家互动。

第一部分,我到底是谁?

因为我们平时做工程的人不善于去推销自己、宣传自己,很多人也不知道我,我就自己吹嘘一下自己吧。

第二部分,非技术问题

虽然我的题目是Linux故障的解决办法,但除了技术性的问题以外,非技术性的问题,站在一线工程师的角度来说,有时候比技术更重要。在一个大的企业里面,比如这个企业有上万人,我们怎么和同事领导进行有效的沟通,这个事情非常重要。

信心,在金融危机的时候,我们有一位领导说信心比黄金重要。面对故障的时候,信心也是非常重要的。昨天陈老师发了一篇文章,在座的同学们就业压力也是比较大的,我觉得这些东西大家不要去慌,要对自己有充分的信心,你认为自己是一个什么样的人,你就会成为什么样的人。

你要解决Linux内核的bug,没有任何捷径可讲,需要我们踏踏实实、认认真真的去学习。这些都是非技术性的问题。

今天我的题目是Linux故障分析方法,我也会讲一些比较典型的查故障的方法,我印象非常深刻或者得意的Linux故障分析。在分析故障的时候,我们怎么样利用内核里面已有的调测功能。还有性能问题,这里面有很多值得讲的东西,这个PPT里面可能一句话都值得同学们下去花一个月的时间深入的去研究。还有一种问题是海森堡bug分析,这个我会简单提一提。

最后我讲一讲故障分析实例,这都是当时在我工作当中,吹嘘一点就是,曾经在工作当中给领导非常深刻的印象。有些故障拖了一两个月,很多领导的眼睛关注着你处理故障的进度。别人两个月没有查出来的故障,或者这个故障复现就要两个月,我们怎么在一周之内查出来,而且这个故障不是我熟悉的模块,我能够一周之内把它查出来,我觉得这几个实例可以去认真看一下。虽然总结出来很简单,但是当时是非常典型的故障,我凭这几个故障基本获得了中兴2010年中兴通讯金银奖的奖项,其实这个奖项还是不错的,两千个人里面能有一个人得这个奖。

    我做了20年一线工程师,其中做了10年Linux内核。为什么做Linux内核呢?这里面有一个故事。我记得小时候没有资格去报考幼儿园,大人不让我去报名,我说如果不让报名我把房子的地基给撬了,这是逼着大人同意我去的,大人说你这么有本事你自己去报名吧。于是我拿着个板凳去了幼儿园,第一天坐在那儿没有人理,第二天我又拿着凳子去坐了半天,老师说你昨天作这里坐半天,今天又在这里坐半天,你有什么要求?我说让我上幼儿园。老师说你凭什么来读幼儿园呢?你能跟上吗?因为大家都读了半年了,我是中途插班,不符合条件。老师后来考了我一下,觉得我这个小伙子还行,还可以跟上,就把我录取了。这是我的一个人生体会,你做任何一个事情都要学会坚持,现在很多大学生在中学、小学的时候大家努力的在学,但一上了大学之后,好像我已经功成名就了,可以天天去玩了,可以打游戏了,可以谈恋爱了。我觉得我们中国的中学和小学教育是非常好的,我们的大学生本来应该非常努力、非常刻苦的,在大学不应该虚度我们这四年的时光。

    我当时做Linux内核也是这样,我们领导觉得虽然你有一点热情,怎么能放心的让你工作呢?让我做了一个月的内核测试,我给领导说我就是要做内核才来中兴通讯的,我宁愿辞职也不愿意做测试。因为内核是属于公司里面比较核心的部门,领导说我已经把你特招进来了,你现在又不干了,这不太好。那就算了,我就赌一把你去做内核吧。

    说到这里我再讲一个体会,《深入理解Linux内核》这本书我看完以后,解决了工作五年同事两个月没有解决的问题,我花了两天时间,就是因为正好看了《深入理解Linux内核》这本书,这本书对于我们做Linux内核的人一定要看,一年时间内看它三遍,对着代码看,这是最重要的学习方法。书到用时方恨少,不要认为你看的书没有用,你看的书一定会在某一个时间得到好处。我翻译过一本书《深入理解并行编程》,因为我没有上过大学,我英语不好,但是我为了翻译这本书,专门补习了英语。我认为这是一本非常难的很有份量的一本书,你真正要自己开发一个操作系统,这本书如果没有看过基本上是开发不出来的。

    我是中国开源软件推进联盟专家委员,并在CLK2015演讲了《Linux内存屏障》。我到中兴通讯两年的时间,凭着几个重要的故障成了中兴通讯2010年的金银奖得主。我觉得最值得炫耀的一点是什么呢?就是善于分析陌生模块的疑难问题。有个典型例子,2010年的时候,前一天晚上,我问领导说看看网络方面的书有没有中文的,还没来得及看网络方面的内核书籍,领导第二天就派我出差去查网络协议栈故障。这个故障,拖了一两个月,我抱着试一试的态度开始查这个故障,利益于内核方面的基础,仍然在较短的时间内查出来这个开源内核故障。我讲的意思是如果在座的同学你愿意学内核,我把我的学习路径告诉大家,你应该有一种学习的能力,拿着一个不熟悉的模块能够很快的把问题找出来,一定要有这个信心。

从08年到2015年我深度参与了中兴电信级实时操作系统,最初领导安排我去做测试,从内核的小兵一步步的开始做,到2015年我成为了这个项目的技术总工,也是运气比较好,这个项目公司比较重视,最后和辽宁舰一起,得到了2016年第四届工业大奖,我觉得这是非常自豪的事情。

但这个还不是最牛的事,我觉得最牛的是,做中国人自己的IT核武器。操作系统是我们IT行业的核武器。上一辈的科学家,大家都在说中国人不可能造核武器,但那个时候好像是毛主席坚持的,一定要把核武器搞出来。其实只要你有信心了,我们真正的核武器是能做出来的,我们中国人自己的IT核武器也是可以造出来的。如果在座的同学,你真正能够把《深入理解Linux内核》和《深入理解并行编程》这本书能看懂的话,你就有了做IT核武器的基础了。

    当然要达到这样的技术高度需要付出很多的努力,要真正踏踏实实的学习,别浪费这四年的时间。我这里有88万字、2200页的打印书,这是我一个字一个字的敲到word里面打印出来的,花了我六年的时间,前三年我基本上是每天晚上花三到四个小时。

大家知道中兴每天晚上是八点下班,我在公司附近租了房子就是为了节省时间。我八点半到租住的房子里面打字到11点钟。你首先要愿意花时间在这个事情上面,你是真正的喜欢这个事情,你还一定要有恒心,坚持一天两天没有问题,真正坚持三年是很难的。因为三年以后我在部门里面承担了一些比较重要的任务,我没有办法抽出太多的时间来学习,后来三年我就花一两个小时,但只要有时间,我就把自己的时间腾出来。我老婆在旁边看《大长今》,我就在看我的书,我觉得这是学习能力。别人在那里放着电视机,你能够安静的静下心来看你的书不受干扰,这一点是非常重要的学习能力。

    这几本书,包括《深入理解Linux内核》我带过来了,并且印出来了,有兴趣的同学你可以来看一看。你在看的时候一定要对着代码来看,要拿着一个单板在那里做实验。我这些代码函数都是一行一行的注释(http://xiebaoyou.download.csdn.net/这里可以下载Linux 2.6.12源码注释,目前下载量过万,评论数1000),你如果没有逐行的注释,你学的时候就会觉得这本书特别难。读书要不受外界干扰,一定要对着单板动手,我第一个月看了一章之后就解决了一个很深的故障,其他搞技术的兄弟们就比较服气了。看书肯定是有用的,所以我反复强调这一点。刚才我们讲这么多,我们总结就是一句话,你们在学校里面千万不要虚度这四年的时间。

第二部分,技术以外的东西有哪些是比较重要的呢?

中兴通讯研发人员有几万人,部门结构特别复杂,我们也不可能自己去写一个Linux的操作系统,一般都是将Linux用起来就行。做内核的人就是给各个产品线上做Linux技术支持,做技术支持时非常重要的一点就是要搞清楚组织对象、人员关系和职责,搞清楚以后才会知道你协调资源的时候找谁,谁说了算。你看《红楼梦》一书《葫芦僧判断葫芦案》一节,有个门子,一上来就说我到某个地方去,一定要把地方上所有家族和当官的关系搞清楚。你们到公司里面去上班的时候,这一点也是非常重要的,特别是大公司,你一定要知道服务对象的组织关系和人员职责。

第二个比较重要的是问清楚事情的来龙去脉。一般找我们支持的都是比较难的问题。这个问题中间有不同的利益相关人,他们做了什么事情,他们为什么以前没有解决掉,这都是有原因的,这一点是很重要。

第三个是把握住事情的关键时间点。做产品都有发布时间,我们去支持不可能派一个人就支持这么一个事情,肯定是多个事情并发的,你要知道事情的重要性、关键时间点,然后你自己安排它的轻重缓急。

第四个是为客户留下充裕的缓冲时间。技术的东西都是有风险的,产品线、项目组可能会有其他的安排,你要给它留下充裕的缓冲时间,虽然说这个故障解决了,但你花的时间太长了,错过了那个关键时间点,这个时候你只有苦劳没有功劳。

这几点归根结底的目的,就是根据这几点我们列出自己的轻重缓急。明天做什么事,后天做什么事,一定要理清楚。

非技术问题,有效沟通的重要性。有很多问题不是我们操作系统的问题,但产品线非常需要我们帮他们出主意,我们应该抱有什么样的心态呢?你说这个不是我们内核的问题,而是你驱动的问题。10个故障有7个故障是自己写驱动的人改出来的,有20%的故障是用了第三方硬件模块给我们提供的模块问题,真正内核的故障,根据我这么多年的统计,一年大概能够遇上两个开源标准内核的故障,两年平均能够遇到一个工具链的故障。标准内核的故障很少,但能不能因为它少就不理这个客户呢?不能。你先不要分清责任,不要推三阻四,不要有这种心态,有了问题大家迎难而上一起去查。这是大家到公司里面上班必须有这么一种心态,不然你在一个公司里面很难立足。

既然客户找到我们,他一般也知道不是内核的问题,但是他需要我们,我们应该为此感到高兴。我们支持客户的目的就是让客户感动、做出成绩。客户什么时候才能感动呢?一定是把事情搞定了,得到上一级的肯定和客户的肯定才会感动。关键点就是我们有一种心态,要和支持的对象,和他们一起把这个事情搞定,让他成功我们才有功劳,如果他没有成功,我们虽然把问题解决了,我们只有苦劳。你在工作当中就不能做出成绩。

刚才讲了,我们开始做事之前有什么心态,但真正做事情的时候应该怎么办呢?首先要找准事情的负责人,你要推动一件事情,公司里面要找到领导的支持,怎么样让领导来支持你这个事,你应该给领导信心。一个公司里面,人太多了,领导也不可能记住你的名字,你怎么让他协调资源来支持你,就要给领导信心,适当的时候可以吹一点牛皮。比如我有一次去支持的时候,有个部长说我们的人那么多,都没有解决掉问题,你能行吗?如果你做不出来成绩我们怎么交代。我这时候给他们吹了点牛皮,我说是院长亲自点名过来解决其他问题的,这是给他一个心理暗示,既然领导亲自点名来让做其他事情,肯定也有信心搞定你的问题,因为我有底气才能吹这个牛。这时候部长说院长点你名了,我把事情交给你做,你弄砸了自己给领导交代,他责任小了,就把资源配给你了,这是工作当中的小技巧。有了这些心态和准备以后,你就要协调各方资源才能办好事。这是协调项目组的资源,有时候还要协调后方的资源,这个更好协调一点。

你在支持客户的时候,千万不要被客户牵着鼻子走,要牵着客户的鼻子走。为什么呢?因为有一些项目组的人也是藏龙卧虎的,他们都觉得自己非常牛,为什么你去了他们就要听你的,他们肯定有自己的想法。既然这个事情已经找到我们了,每个人擅长的都不一样。客户那边的牛人只是在他的业务领域比较牛,你自己要有这个自信。这个事情应该我来做,应该引导他们来解决这个问题,要有这样一种心态。如果没有这种心态,你技术再牛,你在公司里面做不出来大的成绩。

还要有信心。为什么信心很重要?我们在查内核故障的时候,看到很多兄弟也非常刻苦,对模块也很清楚,但一遇到问题的时候就心慌了,比如我只熟悉网络协议栈,但不熟悉调度,他只在熟悉的领域到处想办法。他没有通盘考虑这个问题,实际上他对内核和模块没有信心。你要做到有信心,遇到复杂的问题临危不惧,一定要自己心里有底。我花了那么长时间,两年三年我一天到晚在看书,别人应该没有我这么努力,所以我应该比他懂得多一点,你应该有点信心。这种心态对你面对复杂问题非常有帮助的。

首先对我自己有信心,对内核的稳定性有信心。内核经过那么多人的使用,不可能别人说内核调度有问题了,真的就内核调度就有问题了,一定要有这个信心。如果那个真的有问题了,开源社区就是我们的强大后盾,这时,我们要把git工具用的非常熟悉。我这里有一个文档,讲怎么样把git用好,如果你查标准Linux故障不会用git,你就已经失败一半了。

我们的信心来自于我们的团队,除了我之外还有那么多人,这样你就放松了。虽然你自己很刻苦的在学,在团队里面一定要有难兄难弟,有一些资源你前方要不到,你自己团队内部也不可能每个事情都去找领导,领导就觉得你这个事情做出来是其他人做的,当你不好协调的时候,你可以平时帮你的兄弟们做两件事,将他们培养成烂兄烂弟。比如我只熟悉内核,而你支持的时候也需要别人整一下其他模块,这时候就私下的把几个难兄难弟,让他们悄悄支持我一下就搞定了,没有必要找自己的领导去协调。

如果真的遇到难缠的问题实在搞不定也就算了,你要相信,其他人来搞也搞不定,这样你心里面就有底了,来面对这些问题。

 

posted @ 2017-09-29 23:30  jasonactions  阅读(294)  评论(0编辑  收藏  举报