应用调试是一项令人沮丧的业务。在试验中执行得很好的应用到了生产中就失效了。一个使用频率并不高的修正程序偶尔会被突然访问,从而增加批处理工作的时间。然后就要花几个小时盯着CPU曲线图上的值毫无原因的跳上跳下。所有这些都引出了一个问题,机器为什么会如此随机地以同样的顺序和相同的方式做同样的操作呢?
大型机应用程序的执行可能会因以下原因有所不同:处理器的时钟频率,执行指令的类别和进行无序指令处理的潜能。
处理器时钟频率
人们常常误以为处理器速度主要的衡量标准是时钟。假如处理器始终变快了,那么其频率也会更高。在你考虑处理器时钟的实际作用之前这并没有错。
处理器时钟控制着处理器的运作,并与其保持同步。这让我想起自己在体育课上飞奔的时刻。我们都排在操场的一端,教练一吹哨就开始跑,直到他再次吹哨,那时我们会停下来等他发出下一个信号。处理器内部的运作也是如此。时钟信号一发出,数据开始流动,字节就开始被测试,相应的信号也被发出。在一个循环周期结束后,一切都会结束,等待下一个周期的到来。
指令
明确了这点之后,很容易就可以意识到我们在性能评估中看到的随机性确实与CPU素有关,但这不是由执行指令的数量,而是由完成一个操作所花的时钟周期来衡量的,而这个数量可能因为很多原因而发生变化。
例如,一些指令花费的周期要长一些。一个地址写入(LA)指令是很直接的,它只需要将两个寄存器抵消,并将结果放在另一个寄存器中。此外,移动字长(MVCL)指令自身是一个微型程序,下面对此进行了解释:
- 确定程序已经进入到源地址和目的地址。
- 如果源目的地号码是零,移动填充字符至目的地地址。否则移动下一个源字节到目的区域。
- 递减目的长度寄存器。如果它是零,完成指令。
- 如果源长度寄存器非零,则对其进行递减。
- 递增源和目的地址寄存器。
- 回到第一步。
MVCL指令不仅更复杂,而且其执行时间也是与它移动的数据总量成比例的。相应地,系统管理程序(SMF)的CPU时间也处理于它处理的数据总量。
通道
Z架构的机器还有有额外的问题,处理器使用管道试图并行处理尽可能多的工作。这意味着单个指令或多重指令种的部分可能在同一时间被处理或发生故障。在处理依靠另一个指令的结果才能执行的指令之前,处理器会一直正常工作。
比如说,某个程序有一个LA指令,紧随其后的是一个移动特征(MVC),采用第一个指令中的数值作为其运行基础之一。很显然在LA指令完成之前处理器无法执行MVC,这使一切进入暂停状态。但是,即便在处理器中有一个小的暂停,时钟依然在计时,因此等待周期被计算到另一个CPU周期中。
因此,我们了解了指令顺序对CPU时间的影响。一些聪明的编译器和汇编程序员知道这一点。除了指令顺序,还有处理器缓存。Z10机器有1、1.5、2级缓存,对处理器来说,访问它们的时间在依次增加。它还有以CPU的速度运行的主存,其速度几乎与一个I/O的速度接近。显然,把一个程序中最重要的字节放在1级缓存中是最理想的。但是,对于一台繁忙的机器,所给空间有限,又花费很多时间来进行环境的转换(大型机不会这样),这是不可能的。有些时候,CPU通道必须等待以获取来自缓存和内存的数据,每一个暂停都将被计入时钟周期。因此,访问局部数据也会对CPU时间有影响,因为同样的指令由于其数据所在的位置不同可能会使用不同的处理器。
最后,调度程序可以在任何时间中断一个程序。当中断发生时,系统要花费很多周期来处理中断并将指令流导向适当的处理器。其中一些可能要取决于被中断程序的中断类型和该程序需要完成的内容。
结论
一台计算机的决策性运行看上去相当随机是有很多原因的,我可以将个人经验告诉你,但可能会令你发狂。调谐是不可能的,这只能消除噪音。
对任何有兴趣知道更多关于Z处理器架构的人,我向你们大力推荐Robert Rogers的共享报告。《当你是一个CPU时,你做什么?怎么做?》其中Robert尽可能清晰地解释了Z通道架构及其对性能的影响。要想找到这篇报告,请访问。