当前互联网发展已经渡过了早期的快速扩张期,商业模式创新的空间变小,现存成熟商业模式的市场份额也逐渐被各领域头部公司瓜分。在这样的环境下,互联网公司以模式创新、资本规模、技术优势作为核心竞争力的逻辑链条被打破。同时,最近三年中美贸易战、芯片战、疫情等因素削弱了市场整体活跃程度,即使是头部互联网公司的盈利模式也不断面临挑战。
因此,近三年各公司在技术的主张思路也做出了很大的调整,技术主线由“扩市场”逐渐向“优化成本”转变。广告业务时互联网领域成本需求较高的业务之一,理所当然首当其冲受到较大的影响。广告业务的主要成本由人力成本和机器成本两部分组成,本文仅重点讨论这机器成本优化的一些思考。
机器成本 = 业务实际使用量 / 资源利用率 * 机器资源单价
机器成本由三部分组成,即业务实际使用量、机器资源的利用率和机器资源单价。业务实际使用量指的是在处理业务逻辑时所消耗的必要资源,如存放一份数据需要10GB的内存、机器学习inferance需要占用1000个CPU时钟周期等。资源利用率是指实际使用的资源与真实持有的资源之间的比例,如一台拥有256GB内存的机器中实际使用了128GB内存,那么利用率即为50%,这也表示另外50%内存被浪费了,至少是闲置了。机器资源单价指的是单位计算/存储单元的价格,如PMEM的存储单价低于DRAM,HD的存储单价低于SSD。
通过上述分析可以基本的出优化机器成本的三种途径:一是降低业务实际使用量,二是提高资源利用率,三是降低机器资源单价。
在实际工作中,“降低业务实际使用量”和“提高资源利用率”往往没有经过严格的划分,导致优化目标的混乱。比如通过删除无效逻辑进行性能优化,本质上不是“提高资源利用率”,而是“降低业务实际使用量”;再比如通过并行降低响应时间,从而在给定的超时约束下提高了吞吐量,本质上不是“降低业务实际使用量”,而是“提高资源利用率”;平时谈到的容器混部,是“提高资源利用率”;最近比较流行的“计算与存储分离架构”,是“降低业务实际使用量”。
这里希望读者深入理解这两个概念的区别,并在思考、讨论时严格区分,这样才能得出正确的分析结论。
广告系统的核目标是通过平台提供的算力为平台创造收入,而收入能力与所投入的算力之间存在正相关的关系,因此理论上,只要“收入-机器成本ROI”大于1,就应该无限投入新的机器资源,以此来博取利润增长。但是伴随着机器资源的增加、业务线的增加,附加的运维成本、管理成本会急剧上升,造成隐形成本。同时,人为因素也会导致一些潜在问题。机器资源配给政策的过分充裕会让技术人员失去成本意识,导致人为资源滥用;组织分工引入的竞争可能会导致重复建设。这些现象都会最终造成业务实际使用量虚增。
总结上文,优化业务实际使用量的几个主要考量方面是收入-机器成本ROI、运维管理成本和人为因素。下面介绍下针对这三方面考量因素的一些思考。
在理想的理论模型下,我们可以计算出平均每一个时钟周期、每一Byte内存为业务带来了多少收入;同时,公司内部都有自身的资源成本核算体系,如核算结果为CPU成本1元/(核*天)。有了这些数据,就可以计算一个项目的ROI是否大于1,从而“优胜劣汰”,让系统的ROI良性发展。
但是这个策略在实际执行时并不容易。首先,业务上的收入往往是长期获得的,但是机器资源的投入却是瞬时的,决策发生在“投入机器资源”的时刻,此时很难合理预估出业务上的收入。其次,业务收入上涨或下降的因素有很多,很难从整体的数据中抽离出由具体项目发布导致上涨或下降的部分,项目负责同学往往会夸大自身的收入影响。最后,ROI是变化的,发布时大于1不代表永远大于1,如何实现“劣汰”值得讨论。
这里建议几种可行的方案:
运维管理成本体现在两个方面:一方面是在发布、扩缩容环节,需要用自动化的手段去调度机器,其中隐含了“调度集群”的机器成本;另外一方面是当业务线繁多时,出于风险隔离、责任隔离、发布周期博弈等考虑因素,会导致信息或计算的冗余,如同一份数据在两个业务集群中反复存放两次、同一个计算逻辑在一个流程中被计算两次等。
为了解决上述问题,提出几个建议:
人的因素始终是事情能否按照合理方向演进的关键因素,也是“管理”存在的必要性。若想“降低机器使用量”,就要激发人的积极性,去自主优化成本;或者至少,在制度上不要阻碍人们自发的优化成本。
关于如何激发产品/策略、工程团队自发优化成本的建议已经在3.1.1节中讨论过了,本节重点讨论平级竞争给成本带来的影响。“多业务线”、“多策略团队”划分模式的主要优点是可以促进各团队深度挖掘各自场景中的个性化特点,保证各领域的收入最大化。但是这个优点存在的合理性仍然需要回答两个关键问题:
优化资源利用率特指现有机器资源中被有效利用资源的比例。提高资源利用率主要有几种思路:第一,利用规模效应化零为整,压榨出机器资源中空闲的“水分”。第二,优化基础设施消耗资源的占比,所谓基础设施指的是网络IO、操作系统内核计算等。第三,也是常被人们忽略的一点,就是在既有约束条件限制下,尽可能提高单机的最大吞吐量。下文分别介绍下这三种思路的具体应用。
现在应用比较广泛的“混部”技术就是这一思路的最直观应用。“混部”的本质就是在时间、空间两个维度上整合资源开销互补的容器,使之能最高效率的在物理机上运行。“时间混部”体现在当A容器很繁忙时,B容器总是很空闲,且反之亦然,可以通过“CPU超卖”让A和B跑在同一台物理机上,让物理机的CPU利用率始终保持在较高水位,同时各容器可用性不受影响。“在线与离线资源混部”就遵循了这一思路,这是普遍认为离线计算的运行时间可以人为控制,可以人为创造时间混部的前提条件。“空间混部”体现在让两个内存开销为128GB,CPU开销为16核的容器部署在一台256GB内存、32核CPU的物理机上,提高内存/CPU的的利用率。当前比较流行的智能混部概念,就是从空间混部概念中延伸而来。
深入思考这一理论后可以发现现在主流技术产品发展趋势大都基于规模效应所带来的红利。“公有云”的利润空间存在于规模效应带来的低成本和与各小公司独立维护“私有云”带来的高成本之间。当“公有云”发展到一定规模,对技术市场具有一定影响力后,“云原生”就应运而生,希望未来应用都面向云来设计。我个人认为这些技术路线的锚点就在于通过规模效应拉开与中小公司的成本,从而各云厂商才有盈利空间。
“计算与存储分离”本质上是“降低资源使用量”,让一份数据只存放一次(不考虑读写分离以及灾备副本),无需受到计算节点扩缩容的干扰。这种方案的底层逻辑是打破内存资源和CPU资源上的部署耦合,使得CPU和内存可以各自独立“化零为整”提高利用率。
即使是在同一个业务容器内,也并非所有的计算成本都是业务计算在使用,类似于网络IO、路由器转发、内核拷贝等计算均是基础设施的行为。如果能降低基础设施消耗资源,就可以提高业务资源占用-总资源的利用率。
最近比较流行的零拷贝技术、DMA、RDMA,都是这一思路的具体应用。在基础组件优化中,将同步等待IO模型改为异步通知IO模型,或者引入协程,用轻量级的“线程切换”替代“进程切换”,本质上也是降低基础设施消耗资源。
提高单机的最大吞吐量是人们常忽略的一种优化资源利用率思路。在在线业务场景中,计算服务是否可用的衡量标准往往是超时率而不是CPU利用率。在超时率小于一定值的约束下,CPU可能还没有达到很高的负载机器就已经被标记为不可用了。引发这种问题的深层次原因是针对超时率的软件设计不合理,导致CPU资源没有被充分利用。常见的优化思路是通过加大并行处理度,降低响应时间,从而提高超时率约束下的CPU最大利用率,进而提高单机的最大吞吐量。
影响超时率约束下单机吞吐量的非线性因素还有很多,如Java的GC、线程切换、Cache Miss等等。本质上都是软件上的设计不合理导致CPU没有被充分利用。
随着硬件技术发展,在硬件资源上我们有了更多的选择,如SSD、PMEM等等。在满足业务需要的前提下,合理选择不同成本的硬件,可以进一步优化成本。同时,这对技术人员提出了更高的要求,如何充分利用各种硬件特性、降低使用成本将是下一个阶段的重点话题。
本文围绕第二章开头提到的核心公式,分析了机器成本优化的思路,并举出了具体事例,给出了一些的建议。文中所列出的思考可能不是最全面的,但是在成本问题上也许能提供一些可参考的分析方法,抛砖引玉,望大家能做出更全面的分析。