术语:event 事件
response 响应
latency 延迟
block 阻塞
buffer 缓存
![]()
5.4 性能优化策略 从系统角度来看,可以认为性能优化是为了让系统对事件的响应遵守时间约束。事件触发的形式可以是独立单一事件,或是多个事件组成的事件流。消息被接收到,时间间隔流逝,系统环境中某个状态发生改变都是事件,但不限于此。系统必须处理事件,并作出响应。性能优化策略就是要控制响应所生成的时间。所谓延迟,就是从事件接收到响应生成所消耗的时间。
![]() 事件到达之后,系统可能会开始处理事件,或是因为什么原因处理过程被阻塞。因此响应时间有两个基本的组成因素:资源消耗和被阻塞时间.
- 资源消耗: CPU,数据存储,网络通讯带宽,以及内存都是资源, 特定系统设计中所定义的实体也是资源。如,需要被管理的buffer和必须顺序访问crtical section。事件有多种类型(如前面列举的),每一个种都要通过一个系列流程进行处理。如,一个组件通过网络发送一个消息给另外一个组件。这个消息先会被放入buffer;然后被解码某种格式(marshalling 是Object Management Group用来表示这种转化的名词); 之后以一些算法进行处理计算;再被编码输出;被放入输出buffer;接着被发送给其他组件,其他系统或其他用户。这些处理流程中的每一步所需要时间都是整体事件处理延迟的一部分。
- 被阻塞时间 一个计算可能因为资源竞争而被阻塞,可能是因为资源不可用,或是当前计算依赖于其他计算的结果,但是被依赖的计算尚未完成的。
- 资源竞争
图5.6是事件到达系统的示意图。这些事件可能是以一个事件流形式到达,也可能是多个事件流。 多个事件流竞争同一资源,或是同一个事件流中的不同事件竞争同一资源都会增加延迟。 一般来说,资源的竞争越激烈,延迟就越高。 不过,最终延迟取决于如何仲裁竞争和每个独立请求被仲裁机制被处理的方式。
- 资源的可用性 即使不存在竞争,在资源不可用的情况下,也不可能完成计算。 导致资源不可用的原因可能是资源下线,组件失败等。 在任何情况下, 系统中存在一些部分,这些部分会因为资源不可用大大增加整体延迟,架构设计者必须找出这些地方。
- 对其他计算的依赖 如果一个计算需要与其他计算的结果同步, 或者计算的初始值是其他计算的结果。那么此计算响应过程就必须等待,例:从两个不同的源读取信息的计算,如果串行读操作时读取,延迟就会比并行读取高。
通过以上讨论,可以把性能优化策略分为三类:资源需求,资源管理和资源仲裁。
资源需求
事件流是资源需求的源头。资源需求有两个属性:资源流中事件的间隔时间(请求的频率);每个请求所消耗的多少资源。
降低延迟的策略之一就是减少事件流处理需要消耗的资源。有下面两个方法可以做到:
- 提高计算效率
处理事件和消息时会应用一些算法,改进热点区域的算法效率可以减低延迟。 一些情况,不同资源可以互相替换,进行取舍。 如:中间数据可以被保存起来或重新生成。这个就是在时间资源和空间资源上进行交换。 这个策略一般适用于处理器资源消耗。某些情况也对存储资源如磁盘有效。
- 降低计算消耗(overhead)
如果没有资源请求就没有资源消耗。 在17章中,有一个例子,用Java类而不是RMI,因为前一种方法减少了通讯需求。中间层的使用会增加资源消耗(中间层对可修改性非常重要),减少一些中间层可以改善延迟。这是一个经典的可修改性和性能之间的交换。
通过减少要处理的事件的数量来降低延迟也有两种途径:
- 管理事件频率 如果减低采样频率,需求也会减少。 有些情况,过度工程会导致性能减低。
- 控制采样频率 如果无法控制外部事件频率,可以将排队的请求,以较低的频率进行采样处理,这样会导致请求丢失。
控制资源的使用也可以控制资源需求:
- 限定执行时间 某些情况下可以使用限制响应生成时间的方式。如某些迭代算法,可以限制迭代次数。
- 限定队列容量 对请求队列的最大数量进行限制,必然可以限制用于处理请求的资源。
资源管理
即使在资源需求无法控制的情况下,对资源的管理会影响响应时间。下面是一些资源管理策略:
- 引入并发
某些情况下,使用并发可以减少请求的被阻塞时间。引入并发有两种方式,一种是针对不同来事件来源使用线程处理,或是针对不同的请求类型用线程处理。一旦引入并发,要最大化并发优势,取决于对每个线程分配合适的资源。
- 维护数据或计算的多分拷贝
在client-server模式中,clients就是计算的重复。重复就是为了减少竞争,这里client减少了对中心服务器计算资源的竞争。 Cache是数据复制的一个例子,Cache可以存在于不同速度的存储机制之间,多个分离的存储机制之间。这都能减少竞争。因为数据存在多分拷贝,那么保持拷贝之间的一致性和同步就是系统要承担的责任。
- 增加可用资源
更快的处理器,更多的处理器,更多内存,更快网络都有减低延迟的潜力。成本是重要的重要因素,增加资源肯定是一个减低延迟的策略。在12章将会分析成本与性能交换。
资源仲裁 只要有资源竞争,就必须有资源调度。 处理器,缓存,网络都在被调度。架构设计师的目标就是要了解每种资源的特点选择适当的调度策略。
一个调度策略概念上讲分成两个部分:优先级指定和分派。所有的调度策略都要指定优先级。优先级指定最简单的情况,就是FIFO先进先出。有写事件需要根据请求的最后期限和语义上的重要性来决定优先级。调度依赖的比较指标包含:优化资源使用,请求重要性,最小资源使用,最小延迟,最大吞吐量,防止饥饿保障公平等等。设计人员要知道指标之间存在冲突。要知道选择的策略会对这些指标产生何种影响。
一个高优先级事件流只有在资源可用时,才能被分派。那是可能需要抢占当前用户的资源。可能的抢占选项:在任何时间可抢;在特定的抢占点可抢;或不可抢
常见的调度策略有:
- 先进先出FIFO 先进先出队列对所有请求一视同仁,按顺序处理。所以会出现:因为前面的请求执行的时间太长而卡住后面的请求。如果所有请求都是平等的,那没有问题。当请求拥有优先级是,就不合适。
- 固定优先级调度 静态优先级调度为每个资源请求源分配一个优先级,以此优先级顺序分配资源。这个策略保障高优先级的请求能获得更好的服务,
因此,对于低优先级的请求来讲,可能会有非常随意的长时间等待,如果它前面有一串高优先级的请求。三种常见的优先级策略是:
- 语义重要性 根据领域特点给每个流分配不同的优先级。在大型主机系统之这种类型的调度,在任务开始时即指定它的领域优先级。
- 最后期限monotonic 最后期限monotonic为最后期限较短的事件流分配高优先级。 当事件流拥有实时最终期限,这些的事件流要采用不同的优先级,就可使用此策略调度。
- rate monotonic 一些事件流是周期性的,如果为较短周期的事件流分配高的优先级就是Rate monotonic。
这个deadline monotonic的一种特殊形式,但是更容易被操作系统支持。
- 动态优先级调度
- 循环赛 在每次分配有资源时,对请求进行排序,决定资源分配给某个请求。一种特殊形式的循环赛调度策略是,固定周期对请求进行排序。
- earliest deadline first 此种模式根据请求的最早deadline分配优先级。
- 通过离线的方式已经计算好抢占点和资源分配顺序的调度策略。
![]() 注:想对调度理论深入了解可阅读《Scheduling Theory and Its Applications》 |