频道栏目
读书频道 > 数据库 > Oracle > Oracle性能预测
3.4.1 Erlang C预测公式
2013-09-04 14:38:10     我来说两句
收藏   我要投稿

本文所属图书 > Oracle性能预测

本书共10章。第1章介绍了性能预测的基本概念和范畴,分析了预测提供的信息及其价值;第2章介绍了基本的性能预测概念,深入研究了如何组合及建模性能预测;第3章介绍了提高预测精度的一些有效手段,通过选择合适的...  立即去当当网订购

虽然我们的基本预测公式在预测利用率时是理想的,但它们往往低估响应时间。更确切地说,它们低估排队时间。这意味着,它将导致我们相信Oracle系统可以处理比实际更多的工作。这是糟糕的。通过使用Erlang C函数,我们可以改进对响应时间的预测。图3-2显示了一个使用这两种方法的例子。请注意,直到以Erlang C为基础的响应时间进入曲线的肘部后,基本预测的响应时间还没有进入曲线的肘部,

 

在预测界,Erlang C函数实际上颇负盛名,所以你可能只会想对这个数学背后的男人有更多一点的了解。Agner Krarup Erlang(1878—1929)是研究电话网络问题的第一人,他的成就使他赢得了国际上的认可。直到20世纪60年代,他的工作原理才应用于计算系统。他的公式直到今天仍是复杂的电话网络和计算机系统预测中使用的基础数学。他出生在丹麦日德兰半岛的 L?nborg。他有一个弟弟和两个妹妹。他非常聪明,天性热爱科学研究。然而,他被认为是一位梦幻般的老师,即使是他的朋友也称他为“神秘的人”。他喜欢旅游、数学和自然科学,而且他是一位著名的慈善家。他终生未婚,把所有的时间和精力都投入到了他的工作和研究中。他是我希望去结识的那类人。

当用Erlang C函数时,我们不适合用基本预测的响应时间的计算公式。而用一个新的排队时间的公式,它在CPU和IO两种子系统中都可以应用。但是,有一个有点棘手的问题。事实上,Erlang的C函数只适用于单个队列的子系统。这对CPU子系统很适合,因为我们用单一队列对它建模。而你应该还记得,IO子系统是以每个设备有其自己的队列的形式建模的。因此,我们有一个小问题。

我们的解决办法是把IO子系统划分成多个单队列的服务器系统。现在,我们可以应用Erlang C公式。由于每个单队列、单台服务器的IO子系统在数学上是相同的,只需调查一个系统就足以了解整个IO子系统。我们假设IO子系统是在所有的IO设备之间完美平衡的。考虑到当今的IO子系统的先进性,这不是一个不合理的假设。

下面介绍我们是如何为CPU和IO子系统做这项工作的。我们需要知道在整个CPU或IO子系统(Qn)的队列数量。我们只用一个队列(Qn = 1)来对一个CPU子系统建模。我们以每个设备有自己所服务的队列形式来对IO子系统建模。因此,IO的队列数量将等于IO设备的数量(Qn = IO设备的数量)。

在此场景下,一个设备可以是一个物理硬盘驱动器,一个硬盘驱动器上的某个分区,一个包含多个硬盘驱动器的RAID阵列,一个卷,等等。该清单是无止境的。关键是不管你把一个设备定义成什么,在整个预测过程中,该定义是恒定的。

使用sar -d或iostat命令来决定什么是一个设备,它提供了一个设备的定义,这个定义使每个人都可以看到并使得IO相关的统计数据的收集更直接。有了一个容易理解的设备定义,允许我们问这类问题,例如,“如果我们添加了10个设备,性能将会发生什么变化?”如果一个设备的定义不明确或不一致,那么一般设备相关的预测问题就没有任何意义或其潜在的预测模型必须更为复杂。例如,该预测模型将需要理解单个的物理设备、一个五设备阵列以及固态设备之间的差异。虽然这是可行的,但沿着这条道路可能会产生一个非常复杂的模型,这个模型使实际的预测变得更不精确。再次强调,记得要尽可能保持简单。

变量M在系统中代表的是服务器的数量,变量m则被定义为系统中每个队列的服务器的数量。在系统中,CPU子系统只有一个队列,但这个队列与所有的CPU相关。因此,当对CPU子系统建模时,m是CPU的数量。对于IO子系统,每个设备都有自己的队列,因此每个队列的服务器数量始终是一个。

我们还需要知道每个队列的到达率(q)。我加一个q下标只是用来表示每个队列的到达率,而不是整个系统(?sys)的到达率。

对于CPU子系统,只有一个队列,所以显然整个系统的到达率(?sys)等于在一个队列(q)中的到达率。但是,对于IO子系统,每个队列的到达率(q)是整个系统的到达率(sys)除以IO设备的数量,也就是除以系统中队列的数量(Qn)。下面是CPU和IO子系统中每个队列到达率(q)的计算公式:

 

假设每秒(?sys)有90个事务进入IO子系统,并且有10个IO设备(Qn)。因此,当系统到达率(sys)是90 trx/s时,每个队列的到达率(q)将是9(90/10)。服务时间(St)将保持不变,每个队列服务器的数量(m)为1。

在Erlang C(Ec)函数的基础上,有一个新的排队时间的函数(Qt):

 

注意当利用率(U)达到100%时,分母变为0,排队时间(Qt)就会变成无穷大(这意味着公式和电子表格将出错)。

我们将使用的利用率(U)和队列长度(Q)的公式是相同的。唯一的区别是使用的每个队列的到达率(?q)。记住,m为每个队列的服务器数量,而不是整个系统的服务器数量。


 

就其数学形式,这个公式并不会给我们带来多少好处。我们仍然需要那些可以自己编纂和使用的Erlang C数学。你有几种选择。首先,从OraPub网址www.orapub.com/tools可以免费下载到Erlang排队论公式的电子表格。你还可以在互联网上搜索“Erlang C”。最后,下列的Perl脚本(ErlangC.pl,也可在www.orapub.com/tools 获得),它实现了把Erlang C函数应用到新的预测公式中。你可以直接运行代码。只要改变初始变量,你就准备就绪了!如果你想要的只是原始的Erlang C函数,那么只要将它从下面的代码中剥离出来即可。
     #!/usr/bin/perl
     # ErlangC.pl     更精确的预测数学使用Erlang C
     # 2006年8月3日由Craig Shallahamer创建
    
     my $queues =  1  ; # 整个系统中的队列
        # 对于CPU子系统,是1
        # 对于IO子系统,是设备数量
     my $servers =  24 ; # 每个队列的服务器数量
        # 对于CPU子系统,是CPU数量
        # 对于IO子系统,是1
     my $service_time =  4.0; # 单位例如:ms/trx
     my $system_arrival_rate =  5.0; # 单位例如:trx/ms
    
     my $queue_arrival_rate = $system_arrival_rate / $queues ;
     my $queue_traffic = $service_time $queue_arrival_rate ;
    
     my $rho = $queue_traffic / $servers ;
     my $ErlangB = $queue_traffic / ( 1 + $queue_traffic ) ;
    
     # Jagerman的算法
     my $m=0;
     my $eb=0;
     for ($m=2;$m<=$servers;$m++) {
           $eb = $ErlangB;
           $ErlangB = $eb $queue_traffic / ( $m + $eb $queue_traffic ) ;
     }
    
     my $ErlangC = $ErlangB / ( 1 - $rho + $rho $ErlangB ) ;
    
     my $utilization = ( $service_time $queue_arrival_rate ) / $servers ;
    
     my $queue_time = ( $ErlangC $service_time ) /
                      ( $servers ( 1 - $utilization ) ) ;
    
     my $response_time = $service_time + $queue_time ;
    
     my $queue_length  = $queue_arrival_rate $queue_time ;
    
     print "\n";
     print "Forecasting Oracle Performance by C. Shallahamer \n\n";
     print "More Precise Queueing Mathematics with Erlang C \n\n";
     print "System arrival rate = $system_arrival_rate \n";
     print "Queues in system = $queues \n";
     print "Queue arrival rate = $queue_arrival_rate \n";
     print "Servers per queue = $servers \n";
     print "Queue traffic = $queue_traffic \n";
     print "Erlang C      = $ErlangC \n";
     print "Utilization           = $utilization \n";
     print "Service time          = $service_time \n";
     print "Queue time            = $queue_time \n";
     print "Response time        = $response_time \n";
     print "Queue length         = $queue_length \n";
     print "\n";

你可能会惊讶地发现,有时这个代码片断会显示执行出错或报告奇怪的数字,如负的排队时间。实际上它是应该这样的!当进入系统的工作负载大于系统所能处理的工作负载时,也就是说,当平均利用率变得大于100%和队列长度趋于无穷大的时候,队列系统将变得不稳定。然后,此系统将被赋予高科技的名称“一个不稳定的系统”。所以预测的时候,如果你看到,除以零之类错误时,不要急于得出该模型有错误的结论。这可能仅仅代表系统不稳定,实际上模型并没有深陷错误之中。有趣的是,当系统变得不稳定时,一些模拟产品将仅仅产生一个运行时的错误显示。

需要特别注意的是,当使用Erlang C公式时,它很容易使到达率混乱。如果你还记得先计算整个系统到达率(?sys),然后再计算每个队列(?q)的到达率,那么你不会犯错误。不过更好的做法是使用一个程序来帮助你!

仔细看表3-1。它显示了如何使用Erlang C来增强预测的精度。表的例子与练习不相关,但例子之间相互关联。在此表中,CPU子系统包含64个CPU,IO子系统包含950个IO设备。

 

介绍了Erlang C数学,现在举一些Erlang C数学的例子。下面的三个例子是Erlang C数学、基本预测数学和更精确的(以Erlang C为基础的)响应时间公式的对比。例3-4和例3-6讨论CPU子系统,而例3-5则讨论IO子系统。

 例3-4  使用Erlang C数学为CPU子系统预测

假设一个事务以每0.20s一次的速率到达系统,而系统共有24个CPU,它们可以在4秒内处理一个事务。分别使用基本预测公式和Erlang C公式来进行预测,CPU子系统的利用率、响应时间和队列长度将会是多少?

因为到达率是以每笔事务几秒钟的形式给出的,所以我们需要对它进行如下这样反转:

 

已知这里有一个队列(Qn),每个队列(m)有24台服务器:

 

可以很容易地计算出利用率(U),但是,我们需要使用Erlang C来计算队列的长度(Q)和排队时间(Qt):

 

当使用ErlangC.pl脚本时,将系统到达率设置为5(?sys),服务时间设置为4(St),在系统中的队列数量为1(Qn),每个队列的服务器数量是24(m)时,将得出下面的结果:
     $ perl ErlangC.pl
    
     Forecasting Oracle Performance by C. Shallahamer
    
     More Precise Queueing Mathematics with Erlang C
    
     System arrival rate = 5
     Queues in system    = 1
     Queue arrival rate = 5
     Servers per queue  = 24
     Queue traffic       = 20
     Erlang C             = 0.298072299793829
     Utilization         = 0.833333333333333
     Service time        = 4
     Queue time          = 0.298072299793829
     Response time      = 4.29807229979383
     Queue length       = 1.49036149896914

现在,我们知道了Erlang C的结果,我们可以计算出排队时间(Qt)、响应时间(Rt)以及队列长度(Q):


 

0.25 s/trx的差距可能看起来不大,但那是约6%的差异。这至关重要!在本章3.4.2节中,将讨论这两个公式之间的差异。

 例3-5  使用Erlang C数学为一个IO子系统预测

假设我们的IO子系统包括450个RAID阵列,每个阵列可以在19.4毫秒内提供一个事务的服务。已确定每秒约4500个事务到达IO子系统。分别使用基本预测公式和Erlang C公式来进行预测,IO子系统的利用率、响应时间和队列长度将会是多少?

不要被所提到的“RAID阵列”所迷惑。一个阵列、一个文件管理器或一个物理磁盘都可以被建模成为一个排队论的服务器。诀窍是每一个“设备”必须具有相同的特征。例如,为包含闪存、EMC的阵列和标准SCSI设备的IO子系统建模,这将是更为复杂的过程。
对于任何预测的问题,都要保证单位的一致性。通常以秒和毫秒两种单位给定时间。让我们以毫秒为标准:


 

使用ErlangC.pl脚本时,系统到达率是4.5 (?sys) ,系统中队列的数量(Qn)是450,并且每个队列服务器的数量是1 (m)。下面是运行的结果:
     $ perl ErlangC.pl
    
     Forecasting Oracle Performance by C. Shallahamer
    
     More Precise Queueing Mathematics with Erlang C
    
     System arrival rate = 4.5
     Queues in system    = 450
     Queue arrival rate = 0.01
     Servers per queue  = 1
     Queue traffic       = 0.194
     Erlang C             = 0.194
     Utilization         = 0.194
     Service time        = 19.4
     Queue time          = 4.66947890818858
     Response time      = 24.0694789081886
     Queue length       = 0.0466947890818858

现在,我们已经知道了Erlang C的结果,我们可以计算出排队时间(Qt)、响应时间(Rt)以及队列长度(Q):

 

请注意,虽然IO设备平均利用率只有19%,但在事务被处理前,平均要等待4.669毫秒,这里存在轻微的排队现象。因为每个服务器都有自己的队列,所以即使是在利用率较低的情况下,它也可能造成事务堆积。但这并不会发生在单个队列的CPU子系统中,除非在CPU子系统中的利用率要高很多,否则不设置排队。

Erlang C基本的排队时间为4.669 ms/trx,,从而导致响应时间为24.069 ms/trx。如下所示,基本预测公式中响应时间的结果也是24.069 ms/trx。

 

有趣!所以有时候基本预测公式与Erlang C基础公式相匹配。我将在下一个例子后,更详细地讨论它们。

 例3-6  使用Erlang C数学为另一个CPU子系统预测

假设有一个CPU子系统包含32个CPU,它处理一个事务需要0.012毫秒。工作负载(即,系统到达率)已被确定为2200 trx/ms。分别使用基本预测公式和Erlang C公式进行预测,CPU子系统的利用率、响应时间和队列长度将会是多少?


 

当使用ErlangC.pl脚本时,设置系统到达率是2200 (?sys),服务时间是0.012(St),系统中队列的数量(Qn)为1,并且在每个队列的服务器数量是32(m)时,可以得出下面的结果:
     $ perl ErlangC.pl
    
     Forecasting Oracle Performance by C. Shallahamer
    
     More Precise Queueing Mathematics with Erlang C
    
     System arrival rate = 2200
     Queues in system      = 1
     Queue arrival rate   = 2200
     Servers per queue    = 32
     Queue traffic         = 26.4
     Erlang C               = 0.215343208481877
     Utilization           = 0.825
     Service time          = 0.012
     Queue time            = 0.000461449732461164
     Response time        = 0.0124614497324612
     Queue length         = 1.01518941141456

现在,我们知道了Erlang C的结果,我们可以计算出排队时间(Qt)、响应时间(Rt)和队列长度(Q)。


 

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.4 响应时间数学
下一篇:3.4.2 对比预测公式
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站