工程师主要面对的是技术挑战,更关注技术层面的目标。研发团队的管理者则会把实现项目成果和业务需求作为核心目标。实际项目中,研发团队所需资源(比如物理机器、内存、硬盘、网络带宽等)的成本,很容易被忽略,或者在很晚才考虑。
在一般情况下,如果要满足更多的技术指标如并发量和复杂度等,或者满足峰值业务的压力,最直接有效的方法就是投入更多的资源。然而,从全局来看,如果资源成本缺乏优化,最终会出现如下图所示的“边际效用递减”现象——技术能力的提升和资源的增幅并不匹配,甚至资源的膨胀速度会超过技术能力的提升,从而使技术项目本身的ROI大打折扣。
从笔者十余年的工作经验来看,资源成本优化宜早不宜迟。很多管理者在业务发展的较前期阶段,可能并没有意识到资源成本膨胀所带来的压力。等到业务到了一定规模,拿到机器账单的时候,惊呼“机器怎么这么费钱”,再想立即降低成本,可能已经错过了最佳时机,因为技术本身是一个相对长期的改造过程。
所以,正在阅读此文的读者,假如你已经感觉到了成本膨胀的压力,或者正在做成本控制相关的工作,恭喜,这是幸福的烦恼,贵公司的业务体量应该已经达到一定规模,同时也说明你的管理意识可能已经超前于业务发展了(握手)。
本文我们将分享美团到餐研发团队的资源成本优化实践。
像美团这种体量的公司,资源的提供方包括多个团队,除了到店餐饮研发团队自用的资源外,还有多个兄弟团队也提供了资源支持或者联合共建,比如SRE、大数据团队、风控团队、广告团队等等。在每个月拿到成本账单之后,我们都需要抽丝剥茧,对每一项进行拆解,才能制定对应的解决策略,具体流程如下图所示。
“凡事预则立,不预则废”。在做一件事之前,要充分评估整个工作完整生命周期的要素,并进行整体工作框架的设计,一个科学的方法论是十分有必要的。成本优化遵循的是一个行业内成熟的P(Plan)D(Do)C(Check)A(Act)方法论,在每个阶段都又有对应的二次迭代和微循环。具体方法论如下:
在这个阶段的核心目标是: 用2-3个指标来衡量自己的工作 。很多工作之所以最后失败,很多时候是相关人员根本没有办法用具体可衡量的指标来衡量自己的工作,这样对于工作结果,只能有一个“定性”的认识(比如很好,很不错,不好,较差),而无法做到“定量”。
对于研发人员来讲,不能定量的结果是不够科学的,具体如何确定指标,或者确定哪些指标作为工作目标,其实也是一门学问(有机会另外发文章讨论)。这个阶段的几个建议步骤为:
本阶段最大的经验是“知易行难”,虽然拍脑袋想出来一两个方向和目标很容易,但是最后用数据论证现状时,如何判断自己这个指标是“优秀”、“良好”还是“不及格”?对标的团队是谁?为什么对标的对象是TA?都是需要从人员规模、业务阶段、业务量、行业特点等方面考虑仔细,也需要想清楚,其工作量甚至不比实际干活阶段小。
在执行阶段的流程是:分解原子项目->确定方案->落实到人->优化原子指标。在这里包括两个核心要素:1)把核心指标相关的工作向下一层分解;2)在下一层,找到具体的人来执行,这个人要具备将自己负责的指标继续分解到更细的能力,类似于我们说的树状结构。这样层层地分解下去,每一层的叶子节点都可以找到对应的负责人。这种“总分”结构,在一本经典教程《金字塔原理》中也有详细的阐述。
再根据开篇描述的方法,确定每个原子的评价指标,无法量化的项目都是“耍流氓”。这样就形成了一个更完整的金字塔结构,如下图所示:
在具体实践中,我们可以把以上的过程,再次用一个金字塔结构来表述,如下图所示:
建立了以上的结构,就可以根据各个专业的不同,对各自的指标进行优化了,如果最细一级的指标被成功优化之后,最上层的指标一定会有下降。因为上述指标都有其各自深层次的业务、技术,甚至是财务上的逻辑,故在此把一些需要关注的概念再赘述一下.
很多公司每个技术团队的机器成本,在财务上叫做“网站运维成本”(网站?听起来还像PC时代的概念对不对),从顶层可以分为两类构成因素,就是“自己产生的成本”(自己用的)和“被分摊的成本”(别人替你用的)两大类。跟自己有关的继续向下钻取,可以分为交易相关的资源成本(跟业务流程相关的)以及跟分析有关的大数据成本(分析、算法、决策相关)。
大部分业务系统的团队,使用的资源成本都包含在这个部分,比如商户研发团队、订单系统研发团队、前端研发团队、供应链研发团队、营销系统研发团队、CRM研发团队等。这些资源典型的物理载体就是物理机、虚拟机、容器资源以及对应的机器连接的存储(DB、缓存、K-V数据库等)资源,还会包含由于交换、存储以上资源之间的数据产生的带宽、云资源、CDN等。
这部分资源,我们从控制成本的角度,最浅的层次,建议关注服务组(OWT)所消耗主机的资源利用率,如果资源利用率较低的主机数量较多,建议及时下线。同时,从技术方案本身来说,任何一个服务承载的业务能力和消耗资源之间,会有相对的一个“比例”或者权重。某些高利用率的服务从架构上是否可以重构、解耦或者改造,也非常有利于节省资源。这块内容到餐技术部在过去一年的工作中,对于核心、非核心的服务都进行了梳理,对于其中可以优化的服务也进行了部分重构。相比年初,很好的降低了资源的成本,业务主机成本的两个主要指标的变化情况如下(备注,后续由于新增其他业务导致成本略有上升):
数据行业在互联网的应用目前已经较为成熟,行业主流的数据处理架构都是Yarn 2.0或者类似框架,核心的资源消耗主要基于Container(Vcore+Mem)的计算资源+基于HDFS的存储资源消耗这两部分:
第一部分,是存储资源的消耗,行业通用的模型是基于物理HDFS或自研的类似存储引擎,这部分主要是指离线ETL用来按分区(一般是按时间戳)进行存储的资源,由于数据仓库的核心理念之一是保存“所有”的数据,并在此基础上按照维度建模理论对数据进行预汇总、加和。但是,由于对于模型建设本身的理解深度不同,故在基础数据之上的数据冗余,在很多数据研发人员看来是理所应当的,进而导致存储资源的快速膨胀,这是每个数据团队在管理过程中面临的难题。
在此,到餐研发团队主要采取了两种手段:
到餐数据团队对于数据仓库进行了二次迭代,每次都基于新的业务模式,重新构建中间层以及之上的集市、宽表层,有效节省了空间。还有一种技术手段是压缩,比如流量的数据往往是存储大户,但是流量数据相对的格式比较固定,所以很多流量数据可以进行压缩或者改变其存储格式(如map型),根据实测可以节省20%以上的流量数据空间。
另外需要补充的,还有一部分OLAP存储资源,也会消耗大量资源,比如Kylin、Elasticsearch、Druid、MySQL等,这些数据库主要用来将基于HDFS上的文件,同步到前端可以直接访问的介质上,供系统访问。这部分资源有些也是基于HDFS的(如Kylin、HBase),有些需要单独的存储介质,也需要关注其膨胀速度以及存储周期。
第二部分,是计算资源的消耗,主要满足基于复杂规则的分析或者机器学习算法中的计算,也就是实时ETL计算和离线ETL计算的场景(代表性的引擎如Storm、Flink的计算还有MapReduce的计算)。这部分计算消耗的资源类似于业务系统,可以参照业务系统的“资源利用率”确定几个指标,进行机器优化或者算法逻辑优化。
在某些公司里,某个技术团队开发的内容,有可能为了服务其他团队业务,比如前文中提到的风控、反爬、广告等,会为各种业务提供基础的技术能力。这时候就涉及到一个重要的概念“分摊”。分摊有两种规则,一种是按“实际用量进行”,另外一种是按照“使用比例”进行,这两种模式之上,可能还有混合计费模式,即“按照实际发生的比例进行整体费用的分摊”,做成本控制时,就要清楚地知道这部分成本是按哪种逻辑来进行计算的。
在风控及反爬的实践中,美团的风控及反爬按照整体风控技术团队的总体成本,按比例分摊给业务团队。所以作为业务团队,如果试图降低这部分成本,也要关注两个组成项:一是自己使用的风控及反爬的原子业务数量的绝对值,对每天风控及反爬的总体请求次数是否合理需要进行判断,以保证自己的业务请求量不增加;二是自己业务使用的比例。需要跟相关技术团队一起进行分析,以防止某些场景下,自身业务使用的绝对值下降了,但是因为其他业务绝对值下降的更快,导致自己比例反而上升,进而导致成本上升。
为了保证各个业务团队之间的离线数据交换,美团集团层面建设了安全数据仓库,用来满足跨团队之间的数据交换。这部分的费用也按照实际发生的资源占比进行统计,所以同理,为了降低成本,需要关注两个组成项目:一是自己使用的数量,从架构设计上能否将相关数据模型的效率提升、降低空间是关键因素;二是自己的使用资源在整体资源的占比,这时候也需要跟相关团队一起努力降低总成本。很多公司的技术团队,也有类似的数据共享仓库或者共建仓库的概念。
很多互联网公司都有做广告业务的技术团队,广告的形式主要有按点击收费CPC,按时长收费CPT等等,这部分分摊的逻辑同上述两者,也是按最终的总费用中的占比进行分摊。但是这块有一个需要关注的点是,由于广告的业务逻辑并不在到餐自己的业务方,也就是说归到餐研发团队可以控制的部分较小,故在这个过程中需要建立有效的评价体系,来衡量广告分摊的费用,在此采用的指标是“千次曝光成本”和“千元广告收入成本”,这里仅供大家参考。
除了以上梳理的项目之外,每月还会有一些新增的成本项目加入进来,团队要保持足够的关注。在实践中会发现某项成本在个别月份突然升高,这时候就要找到是新增加了项目,还是某个指标在业务或者算法上有所调整。
在这个阶段,建议关注以下结果:
在到餐研发团队的实践中,业务系统的指标定义上也有类似的经验可以分享。开始进行优化工作的时候,定义了非常多的的项目和指标,比如业务主机分为云存储、带宽、CDN、Tair、Redis等等,关注到每一项对于RD投入的时间和精力都是巨大的损耗,后来经过反复跟相关兄弟团队确认,向上抽象了一层“服务组的资源利用率”,这时候就不需要关注太多细碎的项目,而只关注与这些服务有关机器的使用情况,因为机器会自然的消耗CPU、内存、带宽、CDN等,这样可以有效节省运营的时间成本,把精力集中在优化机器和优化服务架构设计层面。
成本优化这件事,有可能被阶段性忽略,但是重要性一直存在。到餐研发团队通过将近一年时间的运营,帮助公司节省了几千万的成本。这个过程有时候枯燥,有时候让人兴奋,有时候又让人懊恼和沮丧,某些时候其实是在拷问自己一个问题:“保证业务不停的前提下,敢砍掉多余的机器吗?”在管理越来越精细化的今天,相信更多的有识之士也有一些需求或者进行了一些实践。期待跟行业同侪一起,在保证技术能力和满足业务的前提下,更加合理使用资源,节约公司成本,不断提升研发团队的效率,希望本文能给大家带来一些启发。
在本文及成本优化过程中,得到了美团技术团队李伟、登君、李闻、语宸、洪丹、普存、树熠、士涵等人的支持和帮助,在此表示感谢!