以下为演讲全文:我们管的是我们的科研生产双重的集群,300台服务器,里面有各种不同的机器,两用的服务器,也有开放计算项目,还有各种软件,包括各种开源软件,我们搭建了一个平台,这个平台上有100多个真实用户,每天都在跑各种任务,绝大多数任务都跟大数据和人工智能相关,白天这个机器有两个管理员,晚上就是我,为什么晚上是我?因为学校不付教授加班工资,所以别人下班了就由我管。
我们跑的应用是什么?这是我们自己做的一些科研项目,比如这里是一些视频,旁边的字是自动生成的,叫做视频自动加字幕。还有一个是医疗方面的,自动判读胸部CT,到底哪里有结节都可以读出来,都是智能的应用。这些应用和传统企业IT不一样,需求每天变,要的都是不一样的架构和计算能力,所以我们需要不断调整系统。我今天讲的核心问题是,我们有最智能的应用,但是这些智能的应用是跑在最“傻”的数据中心基础架构上。什么领域用大数据用的最差的?就是我们自己的领域,就是云计算管理的领域。为什么这么说?现在我们还在做云计算自动化,它是什么?就是基于规则的专家系统,这个专家系统80年代就说过,到现在再说,我就不用在这里讲了。但是市面上号称很先进的例如ANSIBLE,就是一些规则。还有Openstack云计算系统,很流行,包含了一千万行代码。这些代码都是什么?它们告诉你如果发生了什么事,我需要干什么。这个叫做基于规则的系统,不是智能。为什么?我们需要太多的规则了。我们究竟需要多少规则呢?这张图是我最喜欢的,我拿它解释什么叫做复杂,看这里有多少组件?再看这个小圈里是什么?进去看这里面是这样的,里面还有多少组件,这么复杂的系统,你就靠一些规则,你就慢慢写吧,所以难怪写那么多代码跑起来还是有很多BUG。所以,我今天要讲的主题就是说怎么利用大数据和人工智能让云计算变得更智能,能够让大数据和人工智能帮上我们系统管理员自己,而不是我们只是帮助大数据和人工智能。
我是一个做技术的人,下边开始讲很技术的内容。从大的方向上看,我认为把一个全是用规则执行的基础架构,变成一个智能的架构,我们需要以下这几个步骤和方法:第一我们要看到系统里发生了什么,如果看不见就没办法让它智能。第二看到了这些信息之后,要把它们整理出来,整理成人和机器能懂的信息。再往下如果要能利用这些信息,硬件架构必须是可以用软件定义和控制的。然后你这种控制还需要还要提升可靠性和准确性,才能让大家放心。再往后我们还做不到,但是我们正在朝着这个方向努力,就是怎么样让机器自主学习不同的事情应该怎么做。当然,这个事到这里就组够了,再往前了机器就会觉得,我都学会了要人干什么,然后终结者就出现了。。。
其实这里面每走一步都面临很大的挑战,这也是为什么IT系统的智能化前进的比较慢,我们需要看到的是大量非结构化的资源,我们有多个层次的抽象。最关键系统没有模型,为什么飞机可以飞,一开始它就有个空气动力学的模型。但是系统没有模型没有架构,是大家打补丁打出来的。而且很多系统是非常灵活的,有很多随机行为,这种情况下怎么让它变得更智能?所以今天举几个例子,就是我们做的一些科研和已经部署的项目,希望给大家一些思路,怎么样让系统变得更加智能。首先是采集和处理数据中心的大数据,我们要采集的全面、灵活、可靠、方便,且可以看到系统里很多的内部信息,我非常赞赏(上边)这句话30年之后,谷歌的工程师仍然说“仔细思考和打印语句让我们走到了现在”。打印出来的日志很有意思,它不是结构化的,像自然语言,看着就是一大堆字。这些字怎么看?不知道,大家要想办法把它变得结构化一点,所以有很多结构化收集数据的尝试,但是这些尝试因为有太多局限性,所以不会特别成功,所以文本日志还是很重要的。一个重要的观点是,我们认为这种日志,也就是计算机跟你说话,都不是自然语言。计算机为什么说这些话?是因为有人写了程序让它说的。
所以我们可以做这样一个事情,就是通过分析程序的源代码,来结构化日志的文本。例如提取出日志中的结构化变量来。分析出了日志中的结构信息就好办了,可以用各种机器学习方法来处理这些文本。处理大量的文本不是问题,我们是做大数据的,每天处理几十亿行的文本日志毫无压力,通过处理这些海量数据,能分析出机器里到底哪里出了问题.但是采集这么多数据是很贵的,其实你用不到这么多数据,你只要数据里边能反映问题的那一点点。怎么才能降低采集日志文件的成本?首先我们看看这件事为什么很贵?因为你得先把程序的东西变成一个文本,你再把这个文本用文本或者其他的方式展示给人看。如果用机器处理,你需要把信息变成文本再变回结构化数据,再审读这些文件。为了节约存储,你还要压缩,这些处理都是成本,所以大家不愿意采集非常详细的日志,但是不采集详细的日志系统出了事就麻烦了。其实节约日志采集成本也很简单,日志这些都不是为了给人看的,日志是为了能让机器处理它,让机器自己变得更智能。基于这个考虑,我们虽然打的还是一个非结构化的日志,但是我们可以把这些日志存成非常小的二进制的表示,等展示的时候,再重新把它转化为人类可读的文本。如果是机器处理我们就不转化了。通过这个改进,通过这个改造,可以把打印一行日志的开销,从3微秒降低到200纳秒。为什么这个事情重要?,因为一个程序一秒钟要打印数千行日志,这些资源节省积累起来是相当可观的。这个改进还不够。你根本不应该采取很多没意义的数据。当然,你不采你怎么知道它没有意义。基于机器学习算法,我可以提前告诉系统哪些日志是没有用的,可以尽早扔掉,用来节省更多的计算、存储和网络资源。
我们学到了什么?首先,系统监控一定要做,如果觉得它太贵,我们可以详细优化每一个细节,是不是做了压缩,是不是做了所有可能的事情,来减少数据采集的开销。第二系统监控数据,系统跟你说的话不是自然语言,这些语言不是给你分析的,而是给机器分析的,因此机器应该分析得比人准。一个系统,我们采集了数据,这个数据怎么展示,怎么变成你要的知识?这个可爱的动物叫小白。我们通常管一些非技术用户叫小白用户,他如果碰到了问题,就会叫,例如会说“我网络不通了”,为啥不通了?他描述不出来。再来说什么叫专业,你找到专业网络工程师,他能想出来无数个问题让你去查,当然怎么查有时候你还是不知道。为什么它至脑子里跟我们想的不一样,能想到这些问题?这是因为他记住的是这些复杂的事情。这些东西他能教给我么?因为我不是天天干这件事的,我不可能记住这些。所以系统运维的知识很难传授。
当然,系统知识很难传授对于IT咨询行业很好,能一直保持生意,但是对其他来说是很搞笑的事。对于这种状况,我们能做什么?我们可以通过最最基本的规则和信息,就是大家都知道这个系统里有的信息,例如系统里有数据库信息,有一些可以列出来的状态,还有些包括日志之类的事件信息,通过这些信息,我们可以发现系统里存在哪些实体组件,以及最重要的是,这些组件之间的关系是什么?谁使用了谁,谁发生在谁之前,通过这些我们可以知道系统组件在时间和空间上的关系。再进一步看这些关系,都是系统里最重要的东西。比如我硬盘坏了,哪一台系统机会挂掉,这件事要用传统方法解决,至少需要20条左右的命令,而且运行在不同的机器。这些命令都是知识,一般人不知道的。而采用我们的方法,我们能够把这些零散的信息整理成一个知识网络,这种知识不需要额外的信息,只需要用一些基本的操作(比如图的遍历),就能查询了。当然这种数据很大,我们120多台机器,运行了三天多种状态达到460万个,每个状态和每个状态都有关系,这些关系你怎么刨出来。我们是做大数据处理系统的,这些数据对我们来说很小,所以我们能够主动检测出系统有什么问题。这样我们用机器的计算,代替了人类的智能。
刚刚说了“看”的问题,假定我可以看到系统有什么问题,有什么优化的,下面我们看看,我们怎么能影响这个系统,让它运行得更好?一个必经之路是,增强系统对于软件定义的支持会让大家觉得软件是软的东西,但是硬件的东西不变,所以我们定义不了它。这不对,这种状况在改变,越来越多的硬件在支持软件定义。下边我们讲一个网络的例子。数据中心一个最大的问题是长尾延迟,数据中心网络大多数时候都很快。然而一个好的IT系统关心的是,有没有千份之一的请求是非常慢的。为什么关心这个?因为如果你一秒钟有一百万个用户访问,千份之一就意味着每一秒钟有一个用户觉得难以忍受。这个是不行的。然而为什么会有这种延迟?因为网络游拥塞,不是持续拥塞,是偶然碰一下就拥塞了。怎么解决拥塞呢?绕着走是一个途径,然而,有时候你绕不过去的,就像北京的交通,你往哪儿绕呢?如果城市的路网是这样的,就非常容易做了。在不拥塞的情况下,大家都高兴。现在,这条路太拥塞了,如果路网是可以变的,叫做逢山开路、遇水搭桥,我们有很多路,如果哪里拥塞就把这些活动的路搭到哪里去,这样就不会拥塞了。当然在物理世界里这是不可能的,但是在IT上是可以的,通过这种可变光网络技术,哪一条链路拥塞就把额外的带宽加到这个链路上去。
这里是我们设计的物理层可控的数据中心网络架构。通过对不同波长的光的控制,我们可以动态改变每条物理链路上的带宽。我们搭建了这个12机架,180节点的实验平台。现在我们在物理网络上有一个非常灵活的可以软件定义的方式,但是这种东西怎么用好?第一,我们需要实时监控,如何看到现在流量到底是什么样的?如何预测下一步的流量是什么样的?第二,你既可以选择绕路,也可以选择搭一条路,如果一边绕一边搭路,怎么保证最后得到的结果是完美的结果,是一个非常有意思的问题,在这方面我们做了很多的工作。我们能达到的效果是,很多情况下可以把长尾延迟降低近80%。这个软件定义是可以影响硬件的,未来的硬件将是可定制化的,有了这种软件定义的灵活性,我们就又离智能运维的系统更近了一步。
当然,很多基础架构还没有灵活的软件定义,那么在一个傻的设施上,我们还能不能做一些精确的控制,或者至少加入一些影响,让它变得更智能呢?我举一个例子,比网络更加基础的基础设施就是供电。数据中心供电容量非常贵,你说要建一个10兆瓦的数据中心就要找10兆瓦的电容量来。百度有那么多计算需求,本来想放更多机器进到数据中心,但是它的数据中心平均功率利用率也就是72%就满了,不敢再放了,浪费了很多钱。为什么?因为供电在时间和空间上都是不均匀,会防止某一个时间段或者某一个闸下面造成跳闸,IT人员做事很保守,就不敢放了。当然你仔细想,会发现,其实我别处还有电可用,我可以用别处的电。比如下面这一组机器,我感觉它们电容量快满了,我就说不要再往里面放任务,而上边的机器还有电容量,就可以再多放任务进去。智能供电的挑战,一个是调度器的接口限制太大,例如我连我放的任务是什么都不知道。我不知道调度器还要用这个机器干什么,还要要用多少电。另外一个困难是,在生产系统上没有办法做系统模型。这种情况下,我们还能不能做任何的智能控制?我认为也是能的,只要把问题想清楚,可以用非常近似的模型,并且通过持续的反馈控制来补偿误差。
我们可以达到的结果是,它在用电量比较低的时候没有控制,用电量比较高的时候会开始准确的控制,如果有控制的话,你看这条绿线是不会跳闸的。蓝线是没有控制的,它时不时会超过了橙色的阈值线,那时候就会跳闸。是否有用?我们可以在同一个数据中心里,多放17%服务器增加15%吞吐量,不影响供电安全,不影响业务性能。大大节约了成本。学到了什么?我们可以容忍有限的接口,不准确的控制要比什么都没有好。虽然接口上是不准确的,我们可以通过反馈控制来提升控制结果的的可靠性和精度。上面是我们在数据中心里做一些探索。采集和处理数据中心的大数据,从大数据中发掘关于系统的知识,增强基础设施的灵活性,增加操作的可靠性和精度。这些都是让数据中心更加智能的基础。回到我们之前的问题,我们到底离真正的智能系统还有多远?我认为有了这些基础,下一步是通过加强学习和深度学习等方法,让系统学习如何自动处理各种事件。这也是我们正在探索的方向。鉴于目前系统方面和人工智能方面都已经有了长足的发展,我们相信在不久的将来,我们会看到真正的智能数据中心基础架构。