2.2 CPU特性
CPU是计算机的核心,操作系统、程序都依靠CPU执行,CPU的特性对程序和操作系统的使用影响巨大。
2.2.1 32/64位问题
尽管32位、64位已经成为过时的话题,但是很多32位的设备还在运行,特别是从我们“攒机器”的角度来看,经常要碰到旧机器,32位和64位成为不得不考虑的问题。这其中,有三种32/64位的技术分别:CPU有32位和64位之分,操作系统AIX(内核)有32位、64位之分,甚至应用程序接口(API)也有32/64位之分。
● 通过查看CPU型号,可以得到硬件32/64位信息:
#lsattr -El proc0
将显示CPU型号,其中64位的CPU包括:
(1)PowerPC_RS64。
(2)PowerPC_RS64 II。
(3)PowerPC_RS64 III。
(4)PowerPC_Power3。
(5)PowerPC_Power3 II。
(6)PowerPC_POWER4。
(7)PowerPC_POWER5。
(8)PowerPC_POWER6。
如果是以上类型CPU,则表示硬件支持64位。
● 检查程序32/64位:
#dump -ov filename | grep bit Magic = 0x1df(32-bit XCOFF)
如果是32,则这是32位程序,否则是64位的。
# bootinfo -y
64 →64位硬件,否则是32位硬件。
# bootinfo -K
32 →32位内核,否则是64位内核。
32位和64位的不同组合对我们有什么影响?最主要是兼容性问题。如表2-1所示,图2-5则显示了匹配关系。
表2-1 32位和64位内核的不同组合
注1:尽管AIX 5版本支持64位内核,但即使在64位硬件上安装,在一些比较老的操作系统版本,例如5.1版本上,默认情况下也没有开启64位内核(执行64位程序没有问题),需要手工开启64位。
图2-5 硬件、系统内核、应用程序(API)之间32/64位匹配关系
AIX 4.3或者5.1以上版本都可以提供对64位程序运行支持,但有如下要求:
1.安装bos.64bit
如果没有安装,则找不到/etc/methods/cfg64文件,在SMIT中也就不能打开、关闭64位执行环境(实际上就是在inittab文件中增加了执行这个支持64位的程序)。通过:
#lslpp -l bos.64bit
可以检查是否安装了bos.64bit程序包(通常在硬件支持64位的机器上安装操作系统会自动安装此程序包)。但安装了此程序包也不等于可以打开64位运行环境,如果你在32位硬件的机器上安装了此程序包,则你可以在这台32位的机器上直接编译出64位的执行程序,然而你不能执行它!
2.需要64位硬件
硬件列表请参考支持64位的CPU型号。
3.开启内核64位支持
#genkex | grep syscalls64
可能得到这样的提示输出:
1ac8170 2b0 /usr/lib/drivers/syscalls64.ext
注意
安装了64位驱动扩展并不等于内核是64位的。只有在AIX v5以上版本,才可能有真正64位内核。这个内核扩展驱动仅仅代表着可以在此32位内核的机器上编译出64位的执行程序。而如果64位的CPU,但使用了32位的内核,则此syscalls64.ext程序允许执行64位的应用。
将内核彻底变为64位而不仅仅支持64位程序需要使用AIX 5以上版本的系统。在AIX 5.1以后版中,从64位内核转为32位内核:
#ln -sf /usr/lib/boot/unix_64 /unix #ln -sf /usr/lib/boot/unix_64 /usr/lib/boot/unix #lslv -m hd5 注:如果hd5有镜像,则要在每个镜像磁盘上都进行bosboot操作 #bosboot -ad /dev/ipldevice(或者bosboot -ad /dev/hdisk0,以及另一个镜像盘) #shutdown -Fr
从64位内核转为32位内核:
#ln -sf /usr/lib/boot/unix_up /unix 注:多CPU的机器使用unix_mp替代unix_up,下同 #ln -sf /usr/lib/boot/unix_up /usr/lib/boot/unix #lslv -m hd5 #bosboot -ad /dev/ipldevice(或者bosboot -ad /dev/hdisk0,以及另一个镜像盘) #shutdown -Fr
注意
最新发布的POWER 6小型机以及AIX 6.1操作系统已经不再提供对32位硬件和操作系统的支持,也就是AIX 6.1不提供32位内核,而POWER 6也不能运行32位内核。但这并不影响32位程序在POWER6和AIX 6.1上执行。
除了兼容问题,32/64位还有什么影响?系统性能和一些限制参数也随32/64位情况不同,已经超出本书希望讲述的内容,请参考后续出版的图书。表2-2所列出的是32/64位内核所影响的系统参数。
表2-2 32/64位内核所影响的系统参数
注:
① 每个VG都有一个Major Number,有一些已经为操作系统和设备保留(例如rootvg的Major Number总是10),执行lvlstmajor命令可以查看可用的Major Number。Major数限制了一个操作系统中允许的最大设备数量,包括硬件设备和逻辑设备(例如一个逻辑卷或者一个VG)。
② 需要VMM映射的设备是被挂接(mount)后的JFS/CDRFS(日志/光盘)类型的文件系统、打开的JFS log(可以理解为是日志文件系统的更改记录)设备、交换区(paging spaces),其中512,16保留给交换区。这些设备通过内核PDT(Page Device Table,内存页面分配表)检索,内核中的PDT是一个固定大小的数组。
③ 想达到最大的存储空间1TB,必须用npbi=65,536(或者更高)的参数创建文件系统,而且frag设置为4096。
④ 为达到64G文件大小,文件系统必须用-a bf=true标记创建(或者在smit中选择创建“big file enabled filesystem”,而且需要更改/etc/security/limits文件中对最大文件的限制(默认为2GB)。
2.2.2 查看CPU类型和主频
非常遗憾,AIX 5.1以前的版本没有专门的命令去查看CPU的频率,但通过下面的命令可以看到一些关于CPU情况的信息:
$uname -M IBM,7028-6C4
这个结果并不是那么明确,你需要“查表”来分析所得的结果。如果安装了bos.pmapi perfagent.tools这个程序集则可以使用:
# which_fileset pmcycles /usr/bin/pmcycles -> /usr/pmapi/bin/pmcycles bos.pmapi.pmsvcs 5.2.0.0 /usr/pmapi/bin/pmcycles bos.pmapi.pmsvcs 5.2.0.0 $pmcycles → 查看CPU主频
在5.1以上版本这个问题得以解决,直接执行prtconf可以得到我们所需要的关于设备的几乎全部你需要了解的信息:
$prtconf
另外有一个免费的程序可以查看CPU的类型,这就是lsc,可以从以下站点下载(下载后需要先用uncompress解压缩,再用tar解包):
ftp://ftp.software.ibm.com/aix/tools/perftools/perfpmr/perf53/perf53.tar.Z
2.2.3 HMT,SMT,HT技术
SMT(Simultaneous Multi-Thread,并发多线程)是POWER 5以后芯片的新技术,它支持一个CPU内核同时处理两条指令,因此可以最高达到单一CPU两倍的处理速度(实际测试通常能达到1.3倍,某些应用下可以实现最高1.7倍左右的性能)。平均而言,打开SMT支持(默认)比关闭SMT能提升30%以上的CPU处理能力。SMT的能力来源于CPU中有许多寄存器,但是由于CPU通常在每一时间点只能执行一条指令(即使是流水线方式,某个时间点真正执行占据运算器的也只有一条指令,其他并行执行的指令只能处于解码、寻址等状态),因此大部分寄存器都没有工作,处于闲置。
针对这种情况,IBM特别设计了一种寄存器结构,能够对CPU的处理状态进行跟踪,当发现有闲置的寄存器,而此时另一个线程又可以使用它的时候(恰好需要另一个寄存器,例如一个在执行整数运算,另一个执行浮点运算),就在保持当前线程正常运行的前提下,让另一个线程同时执行(使用另一个寄存器),这样在同一时间,一个CPU就可以处理两个线程的指令。实际上并非如此简单,因为一个RISC CPU通常采用超流水线的方式同时执行多条指令,因此实现SMT需要进行比较复杂的判断,而且也并不能保证CPU永远可以同时执行两个线程,所以通常SMT并不能将性能翻倍,而只可以提高30%左右。
与SMT类似,HMT(Hardware Multi-Thread,硬件多线程)也是试图同时执行多条指令线程的一种技术,但与SMT的不同之处在于HMT必须等当前指令流空闲下来,才能切换到另一条指令线程执行。在CPU执行指令发生中断的时候,就是当前指令流空闲的时候,通常可能原因是指令/数据缓存未命中(由于跳转和地址越界,缓存中没有当前需要执行的指令)。由于HMT对指令是否可并行执行的要求更为苛刻,所以对性能提高并不十分显著。不同多线程技术的区别如图2-6所示。
图2-6 不同的多线程技术区别
在图2-6中,Coarse Gain Threading(粗并行线程方式)是最基本的多线程技术,几乎每种操作系统、硬件都提供对这种功能的支持。在这种方式下,当一个指令流暂时中断(例如等待IO),系统/CPU就可以切换到下一个指令流执行;Fine Gain Threading(精细并行线程方式)是HMT的实现方式,Simultaneous Multi-Threading是SMT或者HT(Hyper Thread,Intel对并发多线程的一种称呼)的实现方式。
IBM的POWER系列CPU从RS64开始支持HMT,到POWER 5开始更增添了对SMT的支持,其中HMT是无条件使用,而SMT则可以通过操作系统开关控制使用或者关闭。
#smtctl -? smtctl: Usage error : Usage: smtctl [ -m off | on [ -w boot | now]] -m用于开启或者关闭SMT,-w用于控制此开关是重启动后生效还是现在生效 # smtctl -m off -w now → 关闭SMT smtctl: SMT is now disabled. # smtctl → 查看SMT状态 This system is SSMT capable SMT is currently enabled SMT boot mod is not set Processor 0 has 2 SMT threads SMT thread 0 is bound with processor 0 SMT thread 1 is bound with processor 1 # lsdev -Cc processor → 查看物理CPU状态 proc0 Available 00-00 Processor proc2 Available 00-02 Processor # bindprocessor -q → 查看可用的逻辑CPU The available processors are: 0 1 2 3 # lsattr -El proc0 → 查看CPU参数状态 frequency 1656000000 Processor Speed False smt_enabled true Processor SMT enabled False smt_threads 2 Processor SMT threads False state enable Processor state False type PowerPC_POWER5 Processor type False AIX 5.3 SMT off with 1 CPU Shows one CPU for physical CPU # sar -P ALL 1 2 → SMT关闭状态 AIX chosin 3 5 00CC1C2C3C40 01/01/70 System configuration: lcpu=1 20:48:21 cpu %usr %sys %wio %idle 20:48:22 3 0 0 0 100 20:48:21 cpu %usr %sys %wio %idle 20:48:22 3 0 0 0 100 - 0 0 0 100 # sar -P ALL 1 2 → SMT开启状态 AIX chosin 3 5 00CC1C2C3C40 01/01/70 System configuration: lcpu=2 ent=1.00 20:36:24 cpu %usr %sys %wio %idle physc %entc 20:36:25 2 50 10 0 70 0.60 60.0 3 30 10 0 70 0.40 40.0 - 80 20 0 0 1.00 100.0