性能之道:分布式系统全栈性能优化
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 软件性能的宏观多维模型

从宏观上讲,软件性能指的是软件在运行时完成某一功能的响应特性,以及在增加软件功能时保持这些响应特性的能力。

从控制论的角度看,软件一般包括4个要素:系统边界、内部结构、外部效应(输出)和连接输入。

• 系统边界:管理系统可以启用有用的入口(可扩展性)并拒绝有害的入口(安全性)。

• 内部结构:控制和维护系统以适应外部变化(灵活性)和内部变化(可靠性)。

• 外部效应:管理环境的直接变更,以最大化提高外部效果(功能性)降低内部工作量(可用性)。

• 连接输入:管理对环境的感知,以支持数据交换(联通性)和限制数据交换(隐私性)。

每个人都有自己的皮肤边界,内部有大脑、器官和循环系统等,还有骨骼和肌肉等的行动输出以及感觉输入。与之类似,计算机有物理外壳、主板结构、屏幕这样的输出效应器,以及键盘、鼠标这样的“接收器”;而软件则有内存边界、内部程序的结构以及专门的输入/输出模块或子系统。

每个元素在软件性能中都扮演着各自的角色,它们必须与环境成功地进行交互。如果成功交互,则可以最大化系统的受益机会,并使系统受损风险最小化,将4个一般要素与2个一般环境交互类型(机会行动和风险行动)相结合,就可以得出软件性能的8个一般性能目标,如图2-1所示。

图2-1 软件性能的宏观多维模型

软件性能的宏观多维模型也可以用图2-1所示的网络来表示,其中,一个点到中心的距离表示该维度的性能指标的高低程度。这个网络中呈现的区域由一个形状和目标之间的张力组成。形状描述了系统的性能,它会随着环境的变化而变化,例如,威胁环境可能需要更多的安全性。连接线表示目标之间的相互作用,也就是张力。可以将连接线想象成具有不同张力的橡皮筋,它们连接着性能的各个维度,因此,增加一个维度的性能指标可能会突然改变另一个维度的性能指标。

2.1.1 系统边界

一个系统的边界决定了什么可以进入和离开,可以被设计用来抵御外部威胁(安全性)和接收外部数据的机会(可扩展性)。

可扩展性表示一个系统利用外部元素的能力(例如,软件可以拥有扩展插件)。程序可以使用第三方插件,这相当于一只开放的人工手使用工具。然而,要实现扩展性,必须有一个已知的链接形式,这就如同一辆汽车要通过拖车来延伸自己,它的拖钩必须与拖车的拖链相匹配。开放标准就具有这种优点,它代表了开放源码的价值。可扩展性是影响软件性能的关键因素。

安全性是软件性能的关键部分,是软件防止未经授权而进入、滥用或接管的能力。软件拥有登录账号和密码,就是一种常见的确保安全性的方法。安全硬件是密封且防篡改的,进入-拒绝原则适用于硬件和软件两种环境。病毒和黑客的威胁使边界防火墙和登录检查系统显得至关重要。安全缺陷是系统故障,也是性能故障。

2.1.2 内部结构

软件的内部结构可以用于管理内部变化(可靠性)或外部变化(灵活性)。

灵活性是指软件在新环境中工作的能力。就像履带协助车辆在复杂地形中工作一样,移动设备可以在复杂的网络区域接收信号。CSMA/CD协议的性能优于更可靠但不灵活的轮询协议。灵活的关系型数据库取代了更有效但不灵活的数据模型。大多数现代软件都有一个参数设置模块(如Windows控制面板)来为硬件、软件或用户环境提供配置服务。灵活性是软件性能的另一个关键。

高可靠性意味着一个软件在内部发生变化(如部分故障)的情况下仍然能够正常运行。可靠的系统几乎总是可用的,无论多大的压力或负载,都能够生存,即便由于受到影响不能提供全量服务,也可以优雅地退化降级,而不是灾难性地崩溃。在软件中,与可靠性相关的指标主要有两个:平均故障间隔时间,表征的是随着时间的推移系统无故障运行的概率;快速恢复,常通过代码修复或状态回滚实现。可靠性是至关重要的软件性能。

2.1.3 外部效应

系统效应器可以改变外部环境(外部效应),设计系统效应器的目标是让效应(功能性)最大,让产生这种效应的成本(可用性)最小。

功能性是指系统直接作用于其环境以产生预期变化的能力。关注功能性需求可以生成功能性很强的软件。因为人们都有为获得新能力而升级软件的需求,因此功能性在软件性能中非常重要,甚至是系统存在的根本。

可用性是指软件以最小化成本提供对应功能的能力。在工作中使用更少的代码实现相同的功能往往意味着可用性更高,因为常规来说,精简指令集的可用性都会优于复杂指令集。轻量级软件在后台运行会更为良好,本质原因也是这个,因为它使用的CPU或内存资源更少。

2.1.4 连接输入

连接输入部分既可以支持信息交换(联通性),又可以限制信息交换(隐私性)。

联通性表征系统与其他系统通信的能力。有时我们会将行为与效应器联系起来,即让行为发生在以感觉为引导的反馈回路中。有时我们会将信息和受体联系起来,因为只有经过受体处理的信息才有意义,即使是交流行为,也需要效应器的参与。信息交流的最终结果来自受体以及随后产生的加工行为。对于现代软件来说,联通性几乎是必需的。

隐私性表征软件控制自身信息发布的能力。隐私性有时用保密性来代替,保密性是工程师从软件的角度给出的名称,而隐私性则是从用户的角度给出的名称。在技术环境中,隐私性是软件性能的关键组成部分。

2.1.5 本节小结

软件性能的多维模型在概念上是模块化的,彼此并不重叠。理论上,任何维度上的性能都可以与其他维度相结合。在设计实践中,软件必须满足所有需求,其中各维度之间可能没有必然的关系。

虽然性能可以被认为是绝对的,但软件性能的多维模型将性能视为相对于环境的性能,因此性能没有一个“完美”的形式。在图2-1所示的8个指标中,4个是成功指标——功能性、灵活性、可扩展性和联通性,4个是避免失败的指标——安全性、可靠性、隐私性和可用性。

我们要知道,环境可能会发生变化,无论是机会还是风险,都会为环境带来影响。机会行动可以给对应的软件带来好处,风险行动可能损害软件,所以机会行动和风险行动都可能为环境带来影响,迅速改变收益和损失关系。

因为环境可以变化,所以环境类型多样。如果性能有一个形状和一个区域,那么就可以用不同的形状去适合不同的环境。软件性能的多维模型通过为性能的各个维度分配权重,帮助开发人员确定适合环境的性能形状。

软件性能的多维模型给了我们宏观上的理论方向。在系统层面和更小的粒度上,它还可以提供更多实际指导。