质量属性—性能战术
性能战术的目标就是对在一定的时间限制内到达系统的事件生成一个响应。事件到达后系统或者对该事件进行处理,或者由于某些原因处理被阻塞。下面是产生响应时间的两个基本因素:资源消耗和闭锁时间
资源消耗:包括CPU、数据存储、网络通信带宽和内存,但它也可以包括由设计中的特定系统所定义的实体。例如必须对缓冲器进行管理,并且对关键部分的访问必须是按顺序进行的。事件可以是各种类型的,每种类型的事件都经过了一个处理序列。
闭锁时间:可能会由于资源争用、资源不可用或者计算依赖于另外一个还不能得到的计算结果而导致计算不能使用某个资源,从而阻止了计算的进行。
● 资源争用。这些事件可能是单个流,也可能是多个流。争用同一个资源的多个流或相同流中争用同一个资源的不同事件会增加等待时间。
● 资源的可用性。即使没有争用,如果资源不可用,计算也无法进行下去。资源离线、组件故障、或其他原因都会导致资源不可用。在任何情况下,设计师都必须确定资源不可用可能会导致急剧增加等待时间的位置。
● 对其他计算的依赖性。计算可能必须等待,因为它必须与一个计算的结果同步,或者是因为它在等待它所启动的一个计算的结果。例如,它可能会从两个不同的源读取信息,如果这两个源是按顺序读取的话,等待时间将会比并行读取高。
1> 资源需求
事件流是资源需求的源。需求的两个特征是:资源流中的事件之间的时间(在事件流中多长时间进行一次请求);每个请求所消耗的资源是多少。
减少等待时间的一个战术就是减少处理一个事件流所需要的资源。方法如下:
● 提高计算效率。处理事件或消息中的一个步骤就是应用某个算法。改进在关键的地方所使用的算法将减少等待时间。有时可以用一种资源换取另一种资源。例如,可以把仲裁者数据保存在存储库中,也可以重新生成,这取决于时间和空间资源的可用性。该战术通常用在处理器上,但用在其他资源上也是有效的,如磁盘。
● 减少计算开销。如果没有资源请求,就可以减少处理需求。
减少等待时间的另外一个战术就是减少所处理事件的数量。可以用一下方式进行:
● 管理事件率。如果可以降低监视环境变量处的取样频率,就可以减少需求。如果系统进行了超量设计的话,这样做是不可行的,其他时候使用不必要的高采样率来建立多个流之间的和谐周期。也就说,某个流或事件被过采样,以使他们可以被同步化。
● 控制采样频率。如果没有对外部生成的事件的到达进行控制,则可以用一个较低的频率对排队的请求进行采样,这样可能会导致请求的丢失。
用于减少或管理需求的其他战术包括控制资源的使用。
● 限制执行时间。限制用多少执行时间对事件做出响应。有时这样做有意义,有时没有意义。对于迭代、依赖于数据的算法,限制迭代的数量就是限制执行时间的一个方法。
● 限制队列的大小。这控制了排成队列到达事件的最大数量,因此控制了用来处理到达事件的资源。
限制时间:
long startTime=System.currentTimeMillis(); 2 try{ 3 if((long)session.getAttribute("endTime")-(long)session.getAttribute("startTime")> 0){ 4 if((long)session.getAttribute("endTime")-(long)session.getAttribute("startTime")<5000){ 5 out.print("<script>alert('两次查询间隔不得小于5秒'); window.location='blogSearch.jsp' </script>"); 6 } 7 session.setAttribute("startTime", startTime); 8 } 9 } 10 catch(Exception e){ 11 session.setAttribute("startTime", startTime); 12 }
2> 资源管理
尽管不能控制对资源的需求,但对这些资源的管理会影响响应时间。下面是一些资源管理的战术。
● 引入并发。如果可以并行处理,就可以减少闭锁时间。可以通过在不同的线程上处理不同的事件流或者创建额外的线程来处理不同的活动集来引入并发。引入并发后,适当地把线程分配给资源(负载均衡)非常重要,以尽可能利用并发。
● 维持数据或计算的多个副本。客户机—服务器模式中的客户机是计算的副本。使用副本的目的是减少在中央服务器上进行所有的计算时出现的争用。高速缓存的数据通常是现有数据的一个副本,因此使用副本一致和同步就变成了系统必须承担的责任。
● 增加可用资源。速度更快的处理器、额外的处理器、额外的内存以及速度更快的网络都可以减少等待时间。在选择资源时,通常会考虑成本,但增加资源绝对也是一个减少等待时间的战术。
及时关闭流:
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3> 资源仲裁
当存在资源争用时,必须对资源进行调度。我们需要对处理器、缓冲器和网络进行调度安排。设计师的目标是理解每个资源使用的特性,并选择之一致的调度策略。
从概念上讲调度策略都有两部分:优先级分配和分派。所有的调度策略都分配优先级。一些常见的调度策略为:
● 先进先出。FIFO队列同等看待对资源的所有请求,并依次对其进行处理。在FIFO队列中,一个请求可能被另一个需要很长时间来生成响应的请求阻止。只有所有请求优先级都是相同的,这就不是一个问题;但如果一些请求的优先级高于其他请求的优先级,就存在这个问题。
● 固定优先级调度。固定优先级调度为每个请求资源的源分配一个特定的优先级,并按该优先级顺序分配资源。该策略能够保证为优先级较高的请求提供更好的服务,但是,对一些优先级较低的请求来说,肯能要等待很长的时间才能得到服务,因为它前面有很多优先级较高的请求。3个常见的优先级策略为:
⑴语义重要性。每个流都根据生成它的任务的某个与领域特性被静态地分配一个优先级。这种调度在大型机系统中,其中领域特性是任务启动的时间。
⑵时限时间单调。时限时间单调是一种静态优先级分配,它将较高的优先级分配给具有较短时限时间的流。在调度的不同优先级流具有实时时限时间时,使用该调度策略。
⑶速率单调。速率单调是周期流的一种静态优先级分配,它将较高的优先级分配给具有较短周期的流。该调度策略是时限时间单调的一种特殊情况,但它更为我们所熟知,操作系统对此提供支持的可能性较大。