在's profile不在PhotosBlogLists Tools Help

Blog


    04/11/2006

    NetBSD Bookmarks

    Download Systems


    News


    Main Websites


    Packages


    Blogs


    Forums


    Other Websites


    User's Docs


    PDF Docs


    NetBSD LiveCD, Floppy, Flash and Others


    NetBSD Books


    NetBSD Culture


    NetBSD: Articles, Advocacy, Reviews


    NetBSD - Technical Articles in Polish (warpman's selection)


    NetBSD - Technical Articles in English (warpman's selection)


    Firms Offering NetBSD Systems

    • Polish
    • Foreign
    • iXsystems - the firm acquired PC-BSD
      iXsystems is a leading provider of high-performance computing clusters, blade servers, rackmount servers, and storage solutions to the global marketplace. iXsystems supplies FreeBSD, NetBSD, OpenBSD and Linux servers to a wide cross-section of industries."

    Varia


    05/10/2006

    少林医药(局方)

    少林医药(局方)
    29/05/2006

    OnLamp.com的Clean up ports

     
    FreeBSD ports即便得到所有赞美,也存有局限性。其中之一实际上来自它的强项-upgrade系统。两者以一种郁闷的方式互相影响。
    port安装过程记录一个port所include的所有文件和所有依赖。比如,许多ports需要PNG图形库。port记录它使用的PNG版本,如1.0.11。当你安装了一部分软件,这一般和可以在ports树中找到是相同的版本。FreeBSD upgrade进程可以升级被port tree支持的软件版本。比如,PNG最近升级到1.0.12版本,库版本号没有增加,但是新库有一些小bug修复。我想升级。但是如果我那样做了,编码了确切PNG版本号的30多个ports将得到错误记录。
    ?
    我的笔记本有187个包(packages)。我一个星期升级一次。这很快就变得零乱,不久之后就难以忍受。幸好,Akinori MUSHA has stepped up to the plate(怎么翻译)并开发了一套可以整理这种零乱状态的工具:portupgrade(1)和他的朋友们(小熊温尼和他的朋友们)。
    portupgrade中包含的工具实现了port系统的新特性。首先是pkgdb
    和portdb,用来对/var/db/pkg索引和ports树创建数据库。这样能加快搜索并操作之。这些工具也可以重写/var/db/pkg里不同的文件来维护一致性。最后是各种pkg_*命令的wrappers,当添加或删除软件时可以用来重写数据库和纯文本记录。所有这些可以通过安装/usr/ports/sysutilis/portupgrade来得到。
    在开始使用portupgrade之前,备份 /var/db/pkg!我从没在这个程序上遇到过麻烦,但是任何可以直接改写系统记录的工具具有无限可能使你的生活一团糟。如果你完全破坏了package records,你需要还原它:
    #tar -czvf dbpkg.tgz /var/db/pkg
    运行pkgdb -F 来初始化安装,并进行基本的清理工作。如果你有许多ports,并已升级过几次port树。第一次时应留出一定时间。一旦有了一致性的数据库,维护将是又快又easy的;只是第一次会比较耗时。
     
      #pkgdb -F
      Checking the origin of Hermes-1.3.2
      Checking the origin of Mesa-3.4.1
      Checking the origin of Mesa-3.4.2_1
      Checking the origin of ORBit-0.5.10_5
      Checking the origin of XFree86-aoutlibs-3.3.6.9

    当遇到依赖改变的包时,pkgdb会询问是否要修改。

      Stale dependency: esound-0.2.22 -> libaudiofile-0.2.2:
      libaudiofile-0.2.1_1 ? ([y]es/[n]o/[a]ll) [yes]

    esound已经记录libaudiofile版本0.2.2作为依赖,但是安装的是版本0.2.1_1。我也许过去做过pkg_add -f,以强制安装尽管有微小版本差异。问我是否想要更新我在/var/db/pkg/esound-0.2.22/+CONTENTS的入口来指向实际安装的libaudiofile的版本。如果默认,他将修改入口记录,如果输入“a”,不仅修改libaudiofile对于esound的入口,而且还修改所有用到libaudiofile的其他包。这对于具有很多依赖的包比如PNG,显得格外方便。
    在之前的例子里,pkgdb可以对依赖性进行智能推测。另一方面,它不能推测所有事情。比如,我从xfree86.org的CVS主机上编译XFree86.imake是free86的一部分,所以在/var/db/pkg中没有相应记录。好;port编译过程check已安装的,并且没有在/var/db/pkg记录的包。当一个port安装后,记录写进/var/db/pkg中,然而前提是如go建立程序port在那里。(这是一个可论证的port的缺陷,但是还没有简易的修复办法)
    这意味着当一个ports列出imake作为依赖时,pkgdb将卡壳

      Stale dependency: Xaw3d-1.5 -> imake-4.1.0:
      New dependency? (? to help): ?

    这里我有一个选项。我可以指派一个新的依赖,或我可以告知package已经不再有什么依赖了。当Xaw3d需要imake,我知道在这个特别的系统里,它不会发现imake已经安装了。我想要删除依赖性。如果敲”?”来查看帮助会发现:

      [Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete
      New dependency? (? to help):?

       

      Control-D it is.
      Delete this? ([y]es/[n]o/[a]ll) [yes]
      Deleted.

    如果我选择“YES”,将清除该依赖。如果我选择“all”将清除所有该依赖无论何时出现。许多ports使用imake;我都想清除。稍后你将看到:

      Stale dependency: xneko-4.4 -> XFree86-libraries-4.1.0:
      Delete this? ([y]es/[n]o/[a]ll) [yes] Deleted.

    还有几次,在别处也出现了pkgdb不能推测依赖的情况

      Stale dependency: plugger-3.3_1 -> timidity++-esound-2.10.4:
      New dependency? (? to help): ?
      [Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete
      New dependency? (? to help): timidity++-2.10.4

    用tab可以完成。我知道timidity++-esound用到某版本的timedity,但是我不想挖地三尺以求整个完整的版本号。我可以输入前两个字母然后按Tab键,就得到了剩下的包的名字。
    最后,在整个过程的最后,pkgdb将提请你关于副本:

      Duplicated origin: graphics/Mesa3 - Mesa-3.4.1 Mesa-3.4.2_1
      Remove any of them? [no]

    这里我有一个问题。从一个包安装软件而需要另外一个包的情况是很疏松平常的。也许你已安装的包有一点版本出入。如果你正通过package来安装,它会自动安装依赖,即使稍有出入的版本已经安装了。这有时会在我的系统中出现。我的本本有两个不同版本的Mesa,但是一个已经覆盖了另一个。这明显的不能算最糟糕的,因为我的系统还在工作。(最后我完全删除了mesa并安装了适合的版本)。尽管如此我依然需要清理packge数据库。我手动卸载了老版本。
    现在你有了package的数据库信息,/var/db/pkg/pkgdb.db。也有了一个port数据库,/usr/ports/index.db和/usr/ports/index.dbo.各种portuprade工具使用这些数据库来完成魔术般的操作.无论何时升级ports树,都要升级ports数据库和/usr/ports/INDEX.可以通过portsdb -Uu来轻易完成.
    现在我们已经装好了工具,来看看我们可以干些什么.想看哪些是过时的,使用portversion(1).这个命令和pkg_info的工作方式相同,但是速度更快.

      # portversion
      Hermes =
      Mesa =
      ORBit <
      XFree86-aoutlibs <
      Xaw3d =
      aalib =

    <代表安装的版本比port树中的旧.可以通过运行portversion | grep '<'来查看哪些port过时了.我经常使用它来查看自己的系统.比如,我的Apache过时了.但是在我的本本上我已经不使用apache了,所以我可以删除它.标准的pkg_delete命令仍然适用,但是我用了,我的package数据库将同我的系统失去同步.使用pkg_deinstall来代替.

      # pkg_deinstall apache
      —< Deinstalling 'apache-1.3.20'
      [Updating the pkgdb in /var/db/pkg ... - 182 packages found (-1 +0) (...) done]
      #

    好处是我再也不用给出完整版本号!(对于FreeBSD的pkg_*,这困扰我良久,但是无能为力).portupgrade工具包含全局函数,可以进行模式匹配。
    我打算升级特定的ports,而且,我要升级的同时保持数据库同步,跟新入口记录到/var/db/pkg。比如portversion高速我gd过时了。升级工作很简单:

      # portupgrade gd
      ===> Cleaning for gettext-0.10.35
      ===> Cleaning for gmake-3.79.1
      ===> Cleaning for libtool-1.3.4_2
      ===> Cleaning for jpeg-6b
      ===> Cleaning for png-1.2.0
      ===> Cleaning for freetype2-2.0.5
      ===> Cleaning for gd-1.8.4_4
      If you want to compile in X support use
      ‘make -DWITH_X11′ instead
      ===> Extracting for gd-1.8.4_4
      ….

    将看到熟悉的make输出界面。如果继续观察,会发现转而去卸载已安装的包,更新数据库,然后继续。

      … —> Deinstalling ‘gd-1.8.4_3′
      pkg_delete: package ‘gd-1.8.4_3′ is required by these other packages and may not be deinstalled (but I’ll delete it anyway):
      scr2png-1.1
      [Updating the pkgdb in /var/db/pkg … - 180 packages found (-1 +0) (…) done]
      ===> Installing for gd-1.8.4_4

    一旦安装完成,会再一次更新package数据库。所有的都是同步的。
    现在让我们看一个难点的。我的docproj port过时了。docporj是不包含任何东西的,但是同每个编辑FreeBSD Document Project的工具有依赖。如果经常建立文档树,这个工具需要更新。还有,你不想递归重编译所有,只想做小的更新;docproj有着庞大的依赖。
    如果打算节约时间,可以用portupgrade -P来告诉portupgrade使用package安装。我不缺时间所以我用port。我们需要告知portupgrade来递归更新,将更新被docproj用到的包。可以使用-R标志,试试:

      # portupgrade -R docproj
      This port will try to ensure that the tools used by the FreeBSD
      Documentation Project are installed on your system so you can convert documentation from SGML to other formats.

    组件其中之一是JadeTex,它依赖于TeTex。TeTex的源代码超过30M,可能需要很长的下载时间。
    如果不打算从文档产生PostScript和PDF格式,就不需要JadeTex,你应当将JADETEX变量设为“NO”。如果希望输出PostScript和PDF,则设为“YES”。
    比如:

      make JADETEX=no
      make JADETEX=yes?

       

      *** Error code 1

      Stop.
      ** Command failed: make clean build
      ** Fix the problem and try again.
      ** The following packages were not installed or upgraded (-:skipped /
      !:failed)
      ! textproc/docproj (docproj-1.4) (unknown build error)
      #

    我考。这个port需要定制。你可以修改/usr/ports/textproc/docproj/Makefile添加 JADETEX=no。现在它将完全透明得运行。
    完成后,可以用portversion来查看发生了什么。你可能会发现其他的port依赖也已改写。比如,如果port A依赖于Port B,但是port C也依赖于Port B,运行portupgrade A将不会修改Port C的依赖。随时准备用pkgdb -F来发现和修复类似问题。
    如果你打算让系统自己来处理这些事情,使用portupgrade -rR;这将升级此依赖的和依赖于此的ports。如果想要自己的系统有最新的软件,这里提供了一种方式。portupgrade包含了使FB软件管理简单化的多种工具,但这足以使你起步。
    你可能会发现不得不从一个相同的distfile重编译一个port很多次。如果port改变了,portversion将发现并标记为过时。你想保留安装了的port的distfile,然后删除旧的distfile。portsclean -D将完成这些工作。相同的,你可能打算删除在package数据库中不被引用的共享库。我不使用上面的参数。别忘了我安装XFree86以抓包的方式而不是port。这个命令(portclean -D)将会删除我的X安装,我考!但是portsclean -L可以办到,并且可以帮助处理一些问题,比如我的不完全安装的Mesa的垃圾文件。
    最后,我必须说这个工具似乎相当鲁棒。文章的结尾,我运行这个程序来证明我的说法。我注意到了一个旧的包,简单的升级了它:

      # portupgrade -R portupgrade

    是的,没错它可以,我说过的它真是好样的。

    original:Michael W. Lucas
    tans. wonglaye

    26/05/2006

    Linux日志文件系统及性能分析(组图)

      日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统:EXT3、ReiserFS、XFS和JFS日志技术,并采用标准的测试工具PostMark和 Bonnie++对它们进行了测试,给出了详细的性能分析,对Linux服务器应用具有重要的参考价值。
      
      一、概述
      
      所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后它修改元数据。目前Linux的日志文件系统主要有:在Ext2基础上开发的Ext3,根据面向对象思想设计的ReiserFS,由SGI IRIX系统移植过来的XFS,由IBM AIX系统移植过来的JFS,其中EXT3完全兼容EXT2,其磁盘结构和EXT2完全一样,只是加入日志技术;而后三种文件系统广泛使用了B树以提高文件系统的效率。
      
      二、Ext3
      
      Ext3 文件系统是直接从Ext2文件系统发展而来,目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的 I/O 数据传送完成时(即数据提交到日志),块就写入文件系统。当发往文件系统的I/O 数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。
      
      2.1 Ext3日志模式
      
      Ext3既可以只对元数据做日志,也可以同时对文件数据块做日志。具体来说,Ext3提供以下三种日志模式:
      
      日志(Journal )
      
      文件系统所有数据和元数据的改变都记入日志。这种模式减少了丢失每个文件所作修改的机会,但是它需要很多额外的磁盘访问。例如,当一个新文件被创建时,它的所有数据块都必须复制一份作为日志记录。这是最安全和最慢的Ext3日志模式。
      
      预定(Ordered )
      
      只有对文件系统元数据的改变才记入日志。然而,Ext3文件系统把元数据和相关的数据块进行分组,以便把元数据写入磁盘之前写入数据块。这样,就可以减少文件内数据损坏的机会;例如,确保增大文件的任何写访问都完全受日志的保护。这是缺省的Ext3 日志模式。
      
      写回(Writeback )
      
      只有对文件系统元数据的改变才记入日志;这是在其他日志文件系统发现的方法,也是最快的模式。
      
      2.2 日志块设备(JBD)
      
      Ext3 文件系统本身不处理日志,而是利用日志块设备(Journaling Block Device)或叫JBD 的通用内核层。Ext3文件系统调用JDB例程以确保在系统万一出现故障时它的后续操作不会损坏磁盘数据结构。Ext3 与JDB 之间的交互本质上基于三个基本单元:日志记录,原子操作和事务。
      
      日志记录本质上是文件系统将要发出的低级操作的描述。在某些日志文件系统中,日志记录只包括操作所修改的字节范围及字节在文件系统中的起始位置。然而,JDB 层使用的日志记录由低级操作所修改的整个缓冲区组成。这种方式可能浪费很多日志空间(例如,当低级操作仅仅改变位图的一个位时),但是,它还是相当快的,因为JBD 层直接对缓冲区和缓冲区首部进行操作。
      
      修改文件系统的任一系统调用都通常划分为操纵磁盘数据结构的一系列低级操作。如果这些低级操作还没有全部完成系统就意外宕机,就会损坏磁盘数据。为了防止数据损坏,Ext3文件系统必须确保每个系统调用以原子的方式进行处理。原子操作是对磁盘数据结构的一组低级操作,这组低级操作对应一个单独的高级操作。
      
      出于效率的原因,JBD 层对日志的处理采用分组的方法,即把属于几个原子操作处理的日志记录分组放在一个单独的事务中。此外,与一个处理相关的所有日志记录都必须包含在同一个事务中。一个事务的所有日志记录都存放在日志的连续块中。JBD层把每个事务作为整体来处理。例如,只有当包含在一个事务的日志记录中的所有数据提交给文件系统时才回收该事务所使用的块。
      
      三、ReiserFS
      
      ReiserFS 是一个非常优秀的文件系统,其开发者非常有魄力,整个文件系统完全是从头设计的。目前,ReiserFS可轻松管理上百G的文件系统,这在企业级应用中非常重要。ReiserFS 是根据面向对象的思想设计的,由语义层(semantic layer)和存储层(storage layer)组成。语义层主要是对对象命名空间的管理及对象接口的定义,以确定对象的功能。存储层主要是对磁盘空间的管理。语义层与存储层是通过键(key)联系的。语义层通过对对象名进行解析生成键,存储层通过键找到对象在磁盘上存储空间,键值是全局唯一的。
      
      3.1 语义层主要接口
      
      1) 文件接口 每个文件拥有一个接口ID,此ID标识一个方法集,此方法集包含访问ReiserFS 文件的所有接口。
      
      2) 属性接口 ReiserFS实现了一种新接口,把文件的每一种属性当做一个文件,属性的值就是此文件的内容,以实现对文件属性的目录式访问。
      
      3) hash接口 目录是文件名到文件的映射表,ReiserFS是通过B+树来实现这张映射表。由于文件名是变长的,而且有时文件名会很长,所以文件名不适合作为键值,故引入了Hash函数来产生键值。
      
      4) 安全接口 安全接口处理所有的安全性检查,通常是由文件接口触发的。下面以读文件为例:文件接口的read 方法在读入文件数据之前会调用安全接口的read chech 方法来来进行安全性检查,而后者又会调用属性文件的read方法把文件属性读入以便检查。
      
      5) 项(Item)接口 项接口主要是一些对项进行平衡处理的方法,包括:项的拆分,项的评估,项的覆写,项的追加,项的删除,插入及查找。
      
      6) 键分配(key Assignment)接口 当把一个键分配给一个项时,键分配接口就会被触发。每一种项都有一个与其对应的键分配方法。
      
      3.2 存储层
      
      ReiserFS是以B+树来存储数据的,其结构如图:
      
      图1:ReiserFS B+ 树
        
      在B+树中的各个结点中有一个称为项(Item)的数据结构。项是一个数据容器,一个项只属于一个结点,是结点管理空间的基本单位。如图所示,一个项包括以下内容:
      
      1) Item_body:项的数据域
      
      2) Item_key: 项的键值
      
      3) Item_offset:数据域的起点在结点中的偏移量
      
      4) Item_length: 数据域的长度
      
      5) Item_Plugin_id:项接口ID。
      
      图2: ReiserFS 项结构
        
      ReiserFS设计了多种不同的项以存储不同的数据,主要有以下几种:
      
      1) static_stat_data: 静态统计数据,包括文件的所有者,访问权限,创建时间,最近修改时间,链接数等
      
      2) cmpnd_dir_item: 包含各个目录项
      
      3) extend_pointers: 指向一个盘区(extend)
      
      4) node_pointers: 指向一个结点
      
      5) bodies: 包含的是文件的小部分数据
      
      3.3 ReiserFS日志
      
      与ext3 一样,ReiserFS也有三种日志模式,即journal,ordered,writeback。同时,ReiserFS引入了两种日志优化方法: copy-on-capture和steal-on-capture。copy-on-capture:当一个事务要修改的块在另一个未提交的事务中时,就把这个块复制一份,这样这两个事务就可以并发进行了。steal-on-capture:当一个块被多个事务修改时,只有最晚提交的那个事务才把这个块实际写入文件系统,其他事务都不写这个块。
      
      四、XFS
      
      XFS 是一种高性能的64 位文件系统,由SGI 公司为了替代原有的EFS 文件系统而开发的。XFS 通过保持cache 的一致性、定位数据和分布处理磁盘请求来提供对文件系统数据的低延迟、高带宽的访问。目前SGI已经将XFS文件系统从IRIX移植到Linux。
      
      4.1 分配组(allocation groups)
      
      当创建 XFS 文件系统时,底层块设备被分割成八个或更多个大小相等的线性区域(region),用户可以将它们想象成"块"(chunk)或者"线性范围(range)",在 XFS 中,每个区域称为一个"分配组"。分配组是唯一的,因为每个分配组管理自己的索引节点(inode)和空闲空间,实际上是将这些分配组转化为一种文件子系统,这些子系统透明地存在于 XFS 文件系统内。有了分配组,XFS 代码将允许多个线程和进程持续以并行方式运行,即使它们中的许多线程和进程正在同一文件系统上执行大规模 IO 操作。因此,将 XFS 与某些高端硬件相结合,将获得高性能而不会使文件系统成为瓶颈。分配组在内部使用高效的 B+树来跟踪主要数据,具有优越性能和极大的可扩展性。
      
      4.2 日志记录
      
      XFS 也是一种日志记录文件系统,它允许意外重新引导后的快速恢复。象 ReiserFS 一样,XFS 使用逻辑日志;它不象 ext3 那样将文字文件系统块记录到日志,而是使用一种高效的磁盘格式来记录元数据的变动。就 XFS 而言,逻辑日志记录是很适合的;在高端硬件上,日志经常是整个文件系统中争用最多的资源。通过使用节省空间的逻辑日志记录,可以将对日志的争用降至最小。另外,XFS 允许将日志存储在另一个块设备上,例如,另一个磁盘上的一个分区。这个特性很有用,它进一步改进了 XFS 文件系统的性能。
      
      4.3 延迟分配
      
      延迟分配是 XFS 独有的特性,它是查找空闲空间区域并用于存储新数据的过程。通过延迟分配,XFS 赢得了许多机会来优化写性能。到了要将数据写到磁盘的时候,XFS 能够以这种优化文件系统性能的方式,智能地分配空闲空间。尤其是,如果要将一批新数据添加到单一文件,XFS 可以在磁盘上分配一个单一、相邻区域来储存这些数据。如果 XFS 没有延迟它的分配决定,那么,它也许已经不知不觉地将数据写到了多个非相邻块中,从而显著地降低了写性能。但是,因为 XFS 延迟了它的分配决定,所以,它能够一下子写完数据,从而提高了写性能,并减少了整个文件系统的碎片。在性能上,延迟分配还有另一个优点。在要创建许多"短命的"临时文件的情况下,XFS 可能根本不需要将这些文件全部写到磁盘。因为从未给这些文件分配任何块,所以,也就不必释放任何块,甚至根本没有触及底层文件系统元数据。
      
      五、JFS
      
      JFS 由IBM 公司开发,最初出现在AIX 操作系统之上,它提供了基于日志的字节级、面向事务的高性能文件系统。它具有可伸缩性和健壮性,与非日志文件系统相比,它的优点是其快速重启能力:JFS 能够在几秒或几分钟内就把文件系统恢复到一致状态。JFS 是完全 64 位的文件系统。所有 JFS 文件系统结构化字段都是 64 位大小。这允许 JFS 同时支持大文件和大分区。
      
      为了支持 DCE DFS(分布式计算环境分布式文件系统),JFS 将磁盘空间分配池(称为聚集)的概念, 与可安装的文件系统子树(称为文件集)的概念分开。每个分区只有一个聚集;每个聚集可能有多个文件集。在第一个发行版中,JFS 仅支持每个聚集一个文件集;但是,所有元数据都已设计成适用于所有情况。
      
      如图3所示,聚集开始部分是32K的保留区,紧随其后的是聚集主超级块。超级块包含聚集的信息,例如:聚集的大小、分配组的大小、聚集块的尺寸等等。超级块位于固定位置,这使得 JFS 不依赖任何其它信息,就能够找到它们。在聚集中还有一个重要的结构是聚集索引结点表(Aggregate Inode Table)以及用于其映射的聚集索引结点分配映射表(Aggregate Inode Allocation Map)。AIT表中的inode 0 保留,inode 1 描述聚集本身,inode 2 描述聚集块映射表(block map), inode 3 描述安装时的内嵌日志,inode 4 描述在聚集格式化期间发现的坏块,保留inode 5 到 15 以备将来扩展。 从inode 16 开始,每个inode代表一个文件集。文件集中也有索引结点表以及用于其映射的索引结点分配映射表,文件集中的inode 描述文件集中的每一个文件。
      
      图3 JFS磁盘结构
        
      JFS 使用基于盘区的寻址结构,连同主动的块分配策略,产生紧凑、高效、可伸缩的结构,以将文件中的逻辑偏移量映射成磁盘上的物理地址。盘区是象一个单元那样分配给文件的相连块序列,可用一个由 <逻辑偏移量,长度,物理地址> 组成的三元组来描述。寻址结构是一棵 B+ 树,该树由盘区描述符(上面提到的三元组)填充,根在 inode 中,键为文件中的逻辑偏移量。
      
      JFS 按需为磁盘 inode 动态地分配空间,同时释放不再需要的空间。这一支持避开了在文件系统创建期间,为磁盘 inode 保留固定数量空间的传统方法,因此用户不再需要估计文件系统包含的文件和目录最大数目。另外,这一支持使磁盘 inode 与固定磁盘位置分离。
      
      JFS 提供两种不同的目录组织。第一种组织用于小目录,并且在目录的 inode 内存储目录内容。这就不再需要不同的目录块 I/O,同时也不再需要分配不同的存储器。最多可有 8 个项可直接存储在 inode 中,这些项不包括自己(.)和父(..)目录项,这两个项存储在 inode 中不同的区域内。第二种组织用于较大的目录,用按名字键控的 B+ 树表示每个目录。与传统无序的目录组织比较,它提供更快的目录查找、插入和删除能力。
      
      六、性能测试
      
      6.1 测试环境
        
      6.2测试工具
      
      所用的测试工具是Postmark和Bonnie++。Postmark主要用于测试文件系统在邮件系统或电子商务系统中性能,这类应用的特点是:需要频繁、大量地存取小文件。而Bonnie++主要测试大文件的IO性能。
      
      6.3 测试结果分析
      
      下面将详细分析用上述两种测试工具在各种测试参数配置下的结果。
      
      图4 PostMark 小文件
        
      图 4是PostMark测试小文件的结果,其参数是文件大小50B增至1K, 同一目录下的文件数从5k至20k,事务总数为25k。从图中我们可以看出:
      
      1. 不论是Ext3 还是ReiserFS,在三种日志模式中,写回(writeback)最快,预定(ordered)次之,日志(journal)最慢。
      
      2. 在各种文件系统中,ReiserFS 的写回和预定模式是最快的,且随着文件数的增加事务处理速度下降的也很慢。
      
      3. Ext3在文件数较少时,事务处理速度也比较快,但当文件数超过10k后,速度就比较慢了。
      
      4. XFS和JFS的速度较慢,但随着文件数的增加,速度下降的比较缓慢。
      
      图5 PostMark 大文件
        
      图5是PostMark测试大文件的结果,其参数是文件大小1k至16K,同一目录下的文件数从5k增至20k,事务总数为25k时的测试结果。从图中我们可以看出:
      
      1. 在处理大文件时,当文件数达到15k时,各种文件系统处理能力都较差。
      
      2. 当文件数在小于10k时,ReiserFS的写回、预定模式和EXT3的写回模式性能是比较好的。但这两种文件系统的全日志模式都比较差。
      
      3. XFS文件系统的性能居中,JFS文件系统的性能最差。
      
      图6:Bonnie++顺序写的速率
        
      图7:Bonnie++顺序写时CPU利用率
        
      图6是Bonnie++对文件大小分别为1G,2G,4G顺序写的性能比较,图7是其CPU的利用率比较。从上述两图中我们可以看出:
      
      1. 除了Ext3和ReiserFS的Journal模式的性能较差外,其他几种模式和XFS、JFS写磁盘的速率相当。
      
      2. 从CPU利用率来看,各种文件系统的CPU利用率都比较低,而且随着数据量的增大CPU的利用率降低。
      
      3. Journal模式的CPU利用率比其他两种模式要低。
      
      图8:Bonnie++ 顺序创建文件
        
      图9:Bonnie++ 随机创建文件
        
      图10:Bonnie++ 随机删除文件
        
      图11:Bonnie++ 随机删除文件时的CPU利用率
      
      图8至图11是Bonnie++对创建和删除文件的性能比较,文件数由50k增至400k。从中可以看出:
      
      1. 不管是创建文件,还是删除文件,Ext3和ReiserFS的三种日志模式之间的性能差别可以忽略不计。这主要是由于创建、删除文件都是对元数据的操作,而对元数据的操作三种模式之间本身就没有什么区别。
      
      2. 不管是创建文件,还是删除文件,Ext3的性能都比较差;ReiserFS的性能是最好的,特别是文件数少于100k时。这主要是由于Ext3是基于Ext2的,其目录项是线性组织的,而其他文件系统都是树形结构。
      
      3. 从CPU的利用率来看,除Ext3的利用率交给外,其他几种文件系统的利用率都很低。
      
      综上所述,我们可以得出以下结论:
      
      1. 在小型系统,如:邮件系统或小规模的电子商务系统应用时,ReiserFS和Ext3 的性能是比较好的。但由于Ext3的目录项是线型的,而ReiserFS的目录项是树型的,故当目录下文件较多时,ReiserFS的性能更优。
      
      2. 在对于上G的这种大文件做I/O时,各种文件系统间的性能差距很小,性能瓶颈往往在磁盘上。
      
      3. 虽然XFS和JFS在设计结构上都比较好,但它们主要是针对大中型系统的,在小型系统中由于硬件的原因性能发挥不明显。
      
      4. 全日志模式和预定、写回这两种模式相比,性能差距是比较大的;而预定和写回之间的性能差距不大。所以性能和安全兼顾时,文件系统的缺省安全模式,即预定模式是比较好的选择。

    02/04/2006

    博客是两类人在玩

    博客是两类人在玩,一类是比较自恋的人在写,一类是想了解别人的隐私,喜欢偷窥的人在看
     
    金山公司副总裁——高宁宁语
     
     
    进来看我这贴的都是偷窥狂
    01/04/2006

    笑话(连笑话都是转贴的 —_—!)

    • 稳定的Blog访问量

    甲:你的Blog每天的访问量是多少?

    乙:2个,我的Blog访问量很稳定;)

    甲:哦?是哪两个?

    乙:我和Google爬虫

    甲:........ 

     

    • “小强与骇客”

    骇客:看老子多牛,搞定N台Unix服务器

    小强:看爷爷我多牛,搞定你家厨房^____^  

     

    • 编程语言

    甲:我想学一种可以做任何东西的编程语言,要强大,要实用,要可以通过它学习其他的语言,有这样的语言吗

    乙 :英语

    甲:... 

    • 阴魂不散 
    江姐问:国民党被推翻了吗?
    答:被阿扁推翻了。
    董存瑞问:劳苦人民还当牛做马吗?
    答:不劳动了,都下岗了。 
    吴琼花问:姐妹们都翻身得解放了吗?
    答:思想解放了,都当小姐了。 
    杨子荣问:土匪都剿灭了吗?
    答:都改当公安和城管了。 
    杨白劳问:地主都打倒了吗?
    答:都入党了! 
    雷锋问:那资本家呢?
    答:都进人大和政协了!
    刘胡兰问:同志们都藏好了吗
    答:都隐身上网了    
    29/03/2006

    Google 另类技巧不完全手册

      大家一定对 Google 十分熟悉了吧?除了最常规的搜索功能,它还具有很多十分另类的技巧.下面就列举一些给大家看看.
      1、搜索在线摄像头监视站点
      在Google中输入"inurl:"ViewerFrame?Mode=""或者"inurl:"MultiCameraFrame?Mode=""、"inurl:"view/index.shtml""(输入时不带外面的双引号,在英文状态下输入),你会获得无数个未经加密的网络摄像机监视到的画面.无聊的时候玩玩,可以满足一下我们的好奇心.此外,打开这个站点:www.opentopia.com/hiddencam.php ,在"from"中选择"China",你还可以看到国内的某处网络摄像机画面.

      2、让Google搜索结果在新窗口中打开
      默认情况下Google的搜索结果跟百度等搜索引擎不一样,它是直接在当前网页中打开搜索结果,这对我们的使用会感到不方便,其实我们可以通过设置来达到目的.
      打开Google后,选择"使用偏好"链接,在打开页面的"结果视窗"中勾选"开启新视窗以显示查询结果"一项,单击"存储偏好设置"按钮即可.

      3、比较两个关键词在Google中搜索结果数量
      想知道克里和布什谁更火?那就比较一下Google的搜索结果数量就知道了.打开www.googlefight.com/,在"Keyword #1"和"Keyword #2"中分别输入"克里"和"布什",单击"Make a fight!"按钮即可看到他们各自的结果.笔者试过,克里有741000个搜索结果,布什有4020000个搜索结果,布什获胜!

      4、让Google来告诉去哪儿旅游
      想好去哪儿旅游了吗?问问Google吧.打开douweosinga.com/projects/besttimetovisit站点,在"Enter the name of destination"栏中输入你想要去的城市名字,比如"北京",点击"Go"即可获得结果.

      5、搜索注册码
      在google里搜索时敲入"你搜索的软件名 94fbr",一般情况下就会立刻搜索到注册码,举个例子,搜索"ACDSee 94fbr",就会得到ACDSee的注册码.
      94fbr 是 Office 2000 的序列号的一部分,而这个序列号又广为流传,所以能找到它的地方就一定有其他软件的注册码.

      6、有趣的关键字
      在Google中输入"_*_"这个关键字,不管你是"搜索所有网页"还是"仅搜索中文网页",你都只能搜索到一大堆中文页面.想明白这是为什么吗?到blog.outer-court.com/forum/5066.html去看看就知道了,原来这是ASCII字符和Google之间的矛盾.

      7、汉语拼音输入检索
      为了方便使用中文的用户在网上搜索,Google允许用户直接在键盘上输入汉语拼音来检索相关事物,例如:
      输入 shang hai shi ke biao
      检索结果提示:您是不是要找:上海时刻表
      这正是我们需要查找的关键词,用户可以据此浏览相关结果,这包括上海地区的各种交通工具的时刻表.如果需要查找更详细的资料"上海飞机航班时刻表",则只要在原来的检索结果"上海时刻表"中间输入feijihangban,例如:
      上海fei ji hang ban时刻表
      Google的这项新功能,可以免除用户在中文和拼音输入方面的互相转换.用户在输入拼音时,不要留有空格,否则Google会误认为英文.Google把拼音与常用的字或者词组一一对应,因此,过于生僻的字或词组不适合于用这个方法查找.

      8、中英文字典
      经常使用计算机的用户手头上自然会有一、两个字典软件,用于查找和翻译中英文的词义.作为一种使用频率较高的工具,Google也提供了一个中英文字典,很方便使用.用户可以按照下列方法查找词义查找英文的中文词义则输入fy computer,查找中文的英文词义则输入 翻译 计算机

        9、天气查询
      天气情况也是人们经常要查询的信息之一,Google 提供的天气查询来自于一个更新及时的中文气象网站,适合中国人使用.用户输入中文和英文都可以查询,例如要了解雅典的天气情况,可以按照下列方法输入:
      雅典 天气  athens tq 返回的查询结果中会在第一条出现一个"雅典天气预报",用户点击后就可以看到当天雅典的天气情况.如果地名相同者,用户还需要进行一次选择.

      10、股票查询
      查询股票的网站已经很多了,Google提供的股票查询只是更方便一些而已,用户可以按照股票名称、股票代码或者股票名称的声母字母查询,下列为查询"中国联通"股票行情的举例.
      中国联通 股票 zglt gp
      gp 600050

      11、邮政编码和区号查询
      人们时常需要查询邮政编码和电话区号,Google提供了这样一个实用的功能,用户据此能够获得所要查询的省市名称,邮政编码及长途电话区号,下面为查询举例:
      邮编 杭州
      区号 绍兴
      yb  杭州
      qh  绍兴
      需要注意的是用户只能查询到城市级别的邮政编码和区号,而无法进一步查询区县的具体信息.

      12、手机归属地查询
      用户在输入手机号码后可以获得号码段、归属地、卡类型、邮政编码和电话区号的信息,但是从实用的角度看,其中只有手机归属地的信息较为有用.

      13、计算器使用
      Google有计算器的功能,例如在google检索框中输入45*86+35/7,就会得到结果:
      (45*86) + (35/7) = 3875
      有兴趣的用户,或者经常在计算机上进行运算的用户不妨可以试一试.

      14、购物检索
      Google新开设的购物检索称之为Froogle,网址为http://froogle.google.com/
      用户只要输入商品的名称,就可以看到该商品的图片和价格,用户还可以限定一种商品的价格进行检索,并且将检索结果按需要从高价到低价排序列出,许多商品可以直接在网上订购,这种图文并茂的检索购物方式较受用户青睐.

      15、美国实用生活信息查询
      如果用户生活在美国或者短期去美国出差和学习,下面的查询功能或许能对他们又帮助,因为这些检索服务目前仅限于美国.
      地区代码查询
      用户输入美国的地区代码,在返回的检索结果中的第一项就是该地区的地图,用户可以通过不断的点击来找到一条具体的大街.
      条形码查询
      用户输入一个商品的条形码就可以找到有关该产品的说明.
      飞机航班查询
      用户输入一家航空公司的名称和航班号,即可获得该航班的出发地和目的地,起飞和到达时间,以及实际航行情况,目前是否开始检票,抵达目的地候机大楼的舱门号.
      车牌号查询
      用户输入车牌号,可以获得一辆车的名称、型号、出厂年份,车身和发动机情况.
      邮件查询
      用户输入一个邮件的号码(美国),可以获悉该邮件目前的状况,譬如邮件已经抵达或者正在路途上等.
    17/03/2006

    谈谈GCC4.0几个值得关注的新特性

    本文侧重介绍了 GCC 4.0 内部结构相对于 3.4.x 版本的一些全新变化。 GCC(GNU Compiler Collection) 是 GNU(GNU's Not Unix) 计划提供的编译器家族,它能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程序设计语言前端,同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha等等几乎目前所有的硬件平台上。鉴于这些特征,以及 GCC 编译代码的高效性,使得GCC 成为绝大多数自由软件开发编译的首选工具。虽然对于程序员们来说,编译器只是一个工具,除了开发和维护人员,很少有人关注编译器的发展,但是GCC的影响力是如此之大,它的性能提升甚至有望改善所有的自由软件的运行效率,同时它的内部结构的变化也体现出现代编译器发展的新特征,所以 2005年4月20日,GNU 组织发布的 GCC 4.0 引起了广泛的关注。那么这次 GCC 从 3.4.x 直接跃迁到 4.x 的主版本变化到底有什么值得关注的呢?

    我们可以从不同的角度看待 GCC 的这次变迁,对于普通程序员来说,关注的主要是GCC 的前端支持情况以及编译性能的变化。

    1. GCC 4.0 的前端支持

    GCC 的开发者和使用者当中,大多数人都是 C 或者 C++ 的用户,所以 GCC 对Fortran 语言支持不足也不令人奇怪。但是,这并不代表 Fortran 是无足轻重的,事实上,开发商业的 Fortran 编译器的公司要远远多于开发 C 和 C++ 编译器的公司。

    在科学计算和工程应用领域,程序员们仍然在频繁使用 Fortran 程序,同时,大量的经过长时间考验的函数库也为Fortran语言的数值计算提供了强有力的支持,所以,在一些"超级计算机"(supercomputer)上,Fortran仍然是绝大多数应用的首选语言。

    然而,在GCC 4.0发布之前,如果不想购买商用的Fortran编译器,那么程序员们的唯一选择就是GNU的g77编译器。但是g77编译器是一个相当陈旧的技术,很多Fortran语言的新特性都不能支持,比如流行的Fortran 95,它能够支持的模块化编程,并行处理和数组操作等等,g77编译器基本上都无法支持。

    这次GCC 4.0发布时推出了支持Fortran 95语言前端的编译器gfortran,它已经能够大大超越g77编译器,支持Fortran 95标准中的很多新特性,虽然gfortran还有一些缺陷,比如不能支持自动并行化(automatic parallelization),不能支持Fortran 2003中的面向对象特性等等,它已经给了Fortran程序员除了商业编译器和g77以外一个更好的选择。

    2. GCC 4.0的编译性能

    编译器的性能主要可以从三个方面来考查:

    1. 编译时间(compile time),指编译器编译一个源程序得到目标代码所需要的时间。

    2. 目标代码的大小(object size),编译得到的目标代码当然是越精悍越好了。

    3. 目标代码运行时间(run time),运行时间体现了速度和效率。

    这里,作者没有亲自测试和实验,引用了Scott Robert Ladd的《GCC 4.0: A Review for AMD and Intel Processors》文章中的一些实验结果。这篇文章引起了比较大的反响,其实验结果和结论也得到了广泛的认可,如果对Scott的具体测试采用的软硬件平台和工具方法感兴趣,原文可以在http://www.coyotegulch.com/reviews/gcc4/index.html看到。

    Scott使用AMD和Intel的两款处理器:64位的Opteron处理器和32位的Pentium 4处理器,分别针对GCC 3.4.3和GCC 4.0来进行测试。他选用了POV-Ray 3.6.1, LAME 3.96.1, SciMark 2.0和Linux 2.6.11.8作为benchmark来进行测试,分别记录了GCC 3.4.3和GCC 4.0在ADM Opteron和Intel Pentium 4下的编译时间、代码大小和代码运行时间进行比较,具体的实验结果请参见原文。

    这样,根据这些实验数据,我们可以给出一个粗糙的结论,在编译性能方面,GCC 4.0似乎不如GCC 3.4.3,因为在很多时候,GCC 4.0的编译时间、代码大小以及代码运行时间全面高于GCC 3.4.3。这样的结果看似出人意料,GCC这次大的版本变化就是因为引入了新的优化框架,怎么会编译性能有所下降呢?这主要是因为:首先,这是一次主版本变化,我们可以理解巨大的变化带来的性能损耗;另外,更主要的是,GCC新的优化框架的潜力尚未完全发挥出来,这一点,在我们文章结束的时候,读者会有更深的理解。
    3. GCC 4.0 的内部结构变化

    GCC 遵循 GPL 协议,是开放源代码的,其开发过程也是完全开放的,任何人都可以对 GCC 的发展作出贡献,因而 GCC 特别适合用于学习和研究编译器。对于学习和研究编译器本身来说,GCC 内部的结构变化显然更吸引人。

    目前 GCC 发行维护者 Mark Mitchell 在接受 internetnews.com 网站采访时这样说到:"毫无疑问地,GCC 4.0 中最引人注意的特性以及为何把 GCC 的这个版本称作 4.0 而不是 3.5,就是因为其新的优化框架(optimization infrastructure)。大体上来说,GCC 以前的版本的代码优化工作主要在底层机器指令级别进行的。不幸的是,到了底层的时候,很多信息已经丢失了,因此,GCC 4.0 在更接近输入高级语言程序的级别上做了很多优化工作。"

    Mark Mitchell 所说的 GCC 新的优化框架主要就是指 Tree SSA(Static Single Assignment),Tree SSA 经过长时间的独立开发,最终整合进了 GCC 的主流(mainstream)中,可见这种设计是意义非凡的。Tree SSA 是什么?为什么要采用 Tree SSA? 使用了 Tree SSA 的 GCC 有什么不同?新的 GCC 编译和优化框架是什么样的?等等,这些将是本文探讨的主要问题。

    这部分文章内容是这样组织的:首先回顾 GCC 4.0 版本之前的编译流程,以便进行对比;接下来介绍 GCC 4.0 的编译流程以及新的优化框架结构,这里先介绍 GENERIC Tree和 GIMPLE Tree,SSA 形式等基本概念,在读者对这些概念和理论有了一定的了解之后,再介绍 GCC 中是如何实现 Tree SSA 框架结构的。

    3.1 GCC 4.0 之前的编译流程

    这里有必要回顾一下 GCC4.0 之前的版本进行代码优化的框架结构,以便进行对比分析。GCC 的前端在接受了输入的源程序之后,经过分析器(parser)处理得到 Parse Tree(通常是一种抽象语法数,AST, Abstract Syntax Tree),根据这个 Parse Tree 生成程序的RTL(Register Transfer Language)表示,然后在 RTL 表示的基础上进行优化处理,然后生成相应的目标代码,如下图 1 所示。

    但是 RTL表示是一个相当接近底层的表示,也就是说它更接近目标代码,适合进行目标相关的优化工作,比如寄存器分配等等。然而,很多的优化转换工作需要更高层的程序信息,比如数组引用、数据类型、控制流结构等等,这些很难用 RTL 表示,或者无法用 RTL表示。


    图1 GCC 4.0之前版本的代码编译流程和优化框架

    3.2 GCC 4.0 的优化框架(Optimization Infrastructure)

    提供一个可移植性强、跨平台以及编译高效代码的编译器,是 GCC 一贯追求的目标,为了使 GCC 能够获得更好的编译性能,高层程序信息级别的优化工作是必须的。Tree SSA设计的主要目的就在于此,它既与前端语言无关,又与后端目标无关,而且能够提供在 RTL表示层很难或者无法进行的高级分析和转换。

    Tree SSA 起先是作为 GCC 的一个分支(branch)进行独立开发的,经过两年多的努力开发,终于在 2004 年 5 月 13 日进入了 GCC 的主流版本。在 GCC 的 SSA for Trees 分支的网页上明确说明了,这个项目的目的就是构建一个对基于 SSA 形式的树的优化框架。在学习编译原理的时候我们知道,编译器通常会使用树的形式来描述程序,GCC 也是这样,在接受了输入的源程序后,GCC 驱动其相应语言的前端分析器(parser),处理得到一个 Tree。从图 1 可以看到,4.0 版本之前的 GCC 几乎是立即把这些 Tree 转换成了 RTL 表示。那么现在 GCC4.0 的 Tree SSA 优化框架就是在前端生成 Parse Tree 之后,把这些 Tree 转换成基于 SSA 的 Tree,对这些 SSA 形式的 Tree 进行高层次的优化,然后才把 Tree 转换成 RTL 表示。

    3.2.1 GENERIC Tree 和 GIMPLE Tree

    这个框架结构看起来比较简单,而且 GCC 的 Parse Tree 能够提供足够的信息来实现SSA,但是在真是实施的时候,还是有很大的困难的,最主要的两个困难是这样的:

    1. GCC 中的树没有统一的表示形式,每一个前端都定义了自己的树。这就意味着要得到基于SSA形式的树必须要对每种前端分析生成的树都进行处理。

    2. GCC 前端得到的 Parse Tree 的复杂度是无法估量的。把这些树转换成基于 SSA形式的树需要进行复杂的处理工作。

    为了解决以上两个问题,GCC Tree SSA 分支的开发小组引入了 GENERIC Tree 和GIMPLE Tree 两个概念:

    1. GENERIC Tree 是特意创造出来的 GCC通用的树的表示形式,它能够表示不同的前端所需要的所有的结构,而且又能够去除语言相关性。

    2. GIMPLE Tree是取自GENERIC Tree和SIMPLE两个短语的。因为GENERIC Tree的复杂性导致实现SSA形式的困难,需要把GENERIC Tree进行简化,这种简化的GENERIC Tree就称之为GIMPLE Tree。

    好了,了解了这些内容之后,我们可以看看 GCC 4.0 的编译流程和优化框架,如下图2所示:


    图2 GCC 4.0 的编译流程和优化框架

    3.2.2 Single Static Assignment Form 的基础介绍

    到现在为止,我们基本搞清了新的 GCC 的编译过程,也大概了解了所谓的新的 Tree SSA 优化框架。上面提到的 GENERIC Tree 和 GIMPLE Tree 都是为了实现 SSA 而做的准备工作,那么 SSA 本身究竟是什么?为什么 GCC 要把 Parse Tree 转换成基于 SSA 形式的 Tree 再做优化工作呢?为弄清楚这些问题,我们有必要多花一些篇幅对SSA的基本概念和理论做一些介绍。

    SSA 的全称是 Static Single Assignment,直译过来就是静态单一赋值,它是IBM公司在上个世纪 80 年代研究的成果。从前面的讨论可以看出,Tree SSA 与 RTL 一样,也是一种中间表示形式,不过相比 RTL 要更高层一点。SSA 形式是一种相对而言比较新颖的中间表示形式,早期的讲编译原理或者编译器的课本中大多没有提及。

    简单的说,SSA 形式就是每个变量只能被赋值一次。这样,非 SSA 形式的程序在转换成 SSA 形式的时候,其中的部分变量就会被分割成很多版本,通常使用下标来表示这些不同的版本。下面举一个简单的例子来说明,如下图 3 所示:


    图3 程序的非 SSA 形式和 SSA 形式

    上图中所示的代码片段,由于 y 变量被赋值两次,所以在转化成 SSA 形式的时候,y变量被分割成两个版本 y1 和 y2,这样就保证了每个变量仅仅被赋值一次。

    由于 SSA 形式中每个变量只能被赋值一次,那么 SSA 形式就能有效地把程序中所操作的数值和这些数值的存储位置这两者分开,这样就能方便一些优化工作。比如我们刚才看的图 3 中的代码片段,我们可以通过肉眼分析发现在非 SSA 形式中的第一条语句y := 1是一条无效的冗余语句,真正决定 y 变量值的是第二条 y := 2 赋值语句。那么在代码优化的时候,第一条语句就应该被删除掉。但是这是我们人工发现的优化结果,如果想要编译器来完成这个优化工作,需要进行复杂的分析,在编译原理中称之为"定义可达性分析"(reaching definition analysis)。而在 SSA 形式中,显然,做出这样的优化决定则无需进行太多分析。

    这只是 SSA 形式诸多优点中的一个而已,使用 SSA 形式可以利用更多的编译器优化算法或者是提高这些算法的效率,比如 constant propagation, sparse conditional constant propagation, dead code elimination, global value numbering, partial redundancy elimination 以及register allocation 等等。这里涉及太多编译理论和算法,本文不作详细讨论。

    SSA 形式具有上文所述的优点,当然也会有其复杂和困难的地方了,下面我们通过一个稍微复杂点的程序片段来说明把非 SSA 形式的程序转换成 SSA 形式程序的时候有些什么需要考虑的问题:


    图4

    图 4-a 所示的非 SSA 形式的程序在转换成了图 4-b 所示的 SSA 形式的程序后,有一个问题很难解决,就是图 4-b 中最下面程序块中 y 的值无法确定。因为在此之前有一条选择语句,导致程序控制流产生了分支,此时 y 的值可能是 y1 也可能是 y2,这是由程序具体执行时经过哪一条控制流来决定的。处理的方法是在最后一块程序片段之前加上一个 Φ 函数,定义一个新的 y3,并从 y1 或者 y2 中选择一个适当的值赋给 y3,如图 4-c 所示。

    推而广之,在将非 SSA 形式的程序转换成 SSA 形式后,如果某个变量被分割成了 n个不同版本的变量后,在某一点需要会合,那么在这个会合点 (joint point) 就需要加入一个 Φ 函数来确定应该选择这 n 个不同版本的变量中的某一个值。这样问题就转变成了如何计算这个 Φ 函数以及确定在程序中的什么位置应该插入 Φ 函数,这个可以使用 dominance frontiers 来进行计算,关于如何高效计算这个 Φ 函数的算法研究本文不作深入讨论。
    3.2.3 GCC 4.0 中的 Tree SSA 框架的设计和实现

    至此,我们已经比较清楚的了解了什么是 SSA,SSA 形式有什么好处,如何将非 SSA表示转换成基于SSA形式的表示以及这个过程中需要解决的主要问题等等,本文将不再对SSA进行深入的讨论了,回到我们的主题,继续讨论GCC 4.0 的 Tree SSA 优化框架是如何设计和实现的,它是怎样把 Tree SSA 融入到 GCC 的编译过程中去的。

    回顾上图2表示的 GCC 4.0 编译流程,在得到 GIMPLE Tree 之后,经过 GIMPLE optimizer 和 GIMPLE expander 的处理,得到了程序的 RTL 表示。其实把程序转换成SSA形式和在此基础上进行优化就在这个过程中完成的,下面我们就来具体看看 GCC 4.0 是怎么做的。在 GIMPLE 和 RTL 之间是树优化 (Tree Optimization) 的过程,如下图 5 所示。图 5 中所示的树优化器 (Tree Optimizer) 主要完成这几个功能:

    1. 生成一个控制流转换图 CFG(Control Flow Graph)。

    2. 将 GIMPLE Tree 转换成基于 SSA 形式的 Tree。

    3. 进行 Tree SSA 的优化。

    4. 将优化后的基于 SSA 形式的 Tree 转换成 RTL 接口所能识别的非 SSA Tree 的形式。


    图5 GCC 4.0 的 Tree Optimizer 结构

    结合 GCC 4.0 代码中的部分源文件来说明:图 5 中这个 Tree Optimizer 的行为是由tree-optimize.c 文件驱动的,tree-ssa.c, tree-into-ssa.c 以及 tree-outof-ssa.c 负责完成 SSA 形式的转换、验证以及其他需要与 SSA 形式交互的功能,建立和管理控制流转换图 CFG 的工作由 tree-cfg.c 完成。不同的树分析和优化功能分别在相应的源文件中独立实现,这些分析和优化函数必须向 GCC 注册,然后才能由 tree-optimize.c 进行驱动和管理,结合图 5来看,SSA pass1, SSA pass2 … SSA passn 代表了实现各种不同功能的 SSA 分析器,他们向 Tree Optimizer 注册,在编译时刻 Tree Optimizer 根据编译选项等等选择相应的SSA分析器进行优化或者其他处理工作,并保证在基于 SSA 形式的处理完成之后将 SSA 树转换成非 SSA树,交给下面的 RTL 模块处理。

    至此,GCC 4.0 的 Tree SSA 优化框架结构应该比较清楚了。读者可能会注意到,文中多次提到Tree SSA是一个优化框架结构(Optimization Infrastructure),为什么说是一个Infrastructure 呢?其实把 Infrastructure 称作框架结构或许并不贴切,更精确地说 Tree SSA是 GCC 提供的一种进行优化工作的基础设施。图 5 中已经体现出了这一点,Tree SSA 的分析和优化工作不是一成不变的,具体选择哪些优化功能和算法是由Tree Optimizer选择驱动的,而且这个Infrastructure是相当灵活的,我们可以很方便的加入一个 SSA 分析器,只需要如下步骤:

    1. 创建一个 struct tree_opt_pass 类型的全局变量。

    2. 在 tree-pass.h 头文件中为这个新的分析器添加一个外部声明(extern declaration)。

    3. 调用 NEXT_PASS 把这个新的分析器加入到 tree-optimize.c: init_tree_optimization_passes 序列中。

    所以这种 Infrastructure 是一个相当灵活和方便的设计,使得我们可以便利地加入新的SSA分析器,或者使用更高效的算法来重新设计完成一些优化功能等等。

    4. 总结

    GCC 4.0 发布以来得到了引起了广泛的关注,新的 gfortran 前端给 Fortran 程序员带来了福音,但也有很多不尽如人意的地方,比如编译性能的损耗,以及向后兼容问题。比如KDE(K Desktop Environment) 开发小组在发现 GCC 4.0 无法正常编译 KDE 后,迅速的抛弃了 GCC 4.0。而且,出于稳定性的考虑,GCC 3.x 版本的开发仍然在进行中。这些似乎给 GCC 4.0 的前景笼罩上了一层阴影,但我们应该容忍一点,给 GCC 4.0 一些信心,向后兼容的问题应该是能够解决的。

    至于编译性能的问题,通过我们这篇文章的讨论,我们可以看到 GCC 4.0 Tree SSA 的优化框架结构并没有充分发挥出其潜能,还可以增加和改进更多 Tree SSA 的优化工作,假以时日,GCC 4.0 的编译性能会得到提高的。

    总的来说,这次 GCC 从 3.x 版本跃迁到 4.x 版本更像一个进化 (evolution) 的过程,而非一个革命性 (revolution) 的过程,它采用的 Tree SSA 优化框架代表了编译器发展的方向,我们应该关注 GCC 4.0 的进一步发展。

    5. 参考文献

    [1] Tree SSA: A New Optimization Infrastructure for GCC. Diego Novillo, Red Hat Canada, Ltd.发表在 GCC Developers Summit 上。

    [2] Kenneth Zadeck在GCC&GNU Toolchain Developers' Summit 2004 上做的关于 SSA 的报告,Static Single Assignment Form。

    [3] Design and Implementation of Tree SSA. 仍然是 Diego Novillo 在 GCC Developers Summit 上发表的文章。

    [4] Scott Robert Ladd 的《GCC 4.0: A Review for AMD and Intel Processors》,对 GCC 4.0 和GCC 3.4.3 的性能做了评测,http://www.coyotegulch.com/reviews/gcc4/index.html。

    [5] GNU 主页上关于 GCC Tree SSA branch 的说明,http://gcc.gnu.org/projects/tree-ssa/。

    关于作者

    王逸,南京大学计算机科学与技术系在读博士生,对软件安全、Linux、编译器等比较有兴趣,目前主要关注的是隐蔽信道分析。
    10/01/2006

    RAID等级、RAID功能

      RAID技术分为几种不同的等级,分别可以提供不同的速度,安全性和性价比。根据实际情况选择适当的RAID级别可以满足用户对存储系统可用性、性能和容量的要求。常用的RAID级别有以下几种:NRAID,JBOD,RAID0,RAID1,RAID0+1,RAID3,RAID5等。目前经常使用的是RAID5和RAID(0+1)。

    NRAID
      NRAID即Non-RAID,所有磁盘的容量组合成一个逻辑盘,没有数据块分条(no block stripping)。NRAID不提供数据冗余。要求至少一个磁盘。

    JBOD
      JBOD代表Just a Bunch of Drives,磁盘控制器把每个物理磁盘看作独立的磁盘,因此每个磁盘都是独立的逻辑盘。JBOD也不提供数据冗余。要求至少一个磁盘。

    RAID 0
      RAID 0即Data Stripping(数据分条技术)。整个逻辑盘的数据是被分条(stripped)分布在多个物理磁盘上,可以并行读/写,提供最快的速度,但没有冗余能力。要求至少两个磁盘。我们通过RAID 0可以获得更大的单个逻辑盘的容量,且通过对多个磁盘的同时读取获得更高的存取速度。RAID 0首先考虑的是磁盘的速度和容量,忽略了安全,只要其中一个磁盘出了问题,那么整个阵列的数据都会不保了。

    RAID 1
      RAID 1,又称镜像方式,也就是数据的冗余。在整个镜像过程中,只有一半的磁盘容量是有效的(另一半磁盘容量用来存放同样的数据)。同RAID 0相比,RAID 1首先考虑的是安全性,容量减半、速度不变。

    RAID 0+1
      为了达到既高速又安全,出现了RAID 10(或者叫RAID 0+1),可以把RAID 10简单地理解成由多个磁盘组成的RAID 0阵列再进行镜像。

    RAID 3和RAID 5
      RAID 3和RAID 5都是校验方式。RAID 3的工作方式是用一块磁盘存放校验数据。由于任何数据的改变都要修改相应的数据校验信息,存放数据的磁盘有好几个且并行工作,而存放校验数据的磁盘只有一个,这就带来了校验数据存放时的瓶颈。RAID 5的工作方式是将各个磁盘生成的数据校验切成块,分别存放到组成阵列的各个磁盘中去,这样就缓解了校验数据存放时所产生的瓶颈问题,但是分割数据及控制存放都要付出速度上的代价。

      按照硬盘接口的不同,RAID分为SCSI RAID,IDE RAID和SATA RAID。其中,SCSI RAID主要用于要求高性能和高可靠性的服务器/工作站,而台式机中主要采用IDE RAID和SATA RAID。

      以前RAID功能主要依靠在主板上插接RAID控制卡实现,而现在越来越多的主板都添加了板载RAID芯片直接实现RAID功能,目前主流的RAID芯片有HighPoint的HTP372和Promise的PDC20265R,而英特尔更进一步,直接在主板芯片组中支持RAID,其ICH5R南桥芯片中就内置了SATA RAID功能,这也代表着未来板载RAID的发展方向---芯片组集成RAID。

    Matrix RAID:
      Matrix RAID即所谓的“矩阵RAID”,是ICH6R南桥所支持的一种廉价的磁盘冗余技术,是一种经济性高的新颖RAID解决方案。Matrix RAID技术的原理相当简单,只需要两块硬盘就能实现了RAID 0和RAID 1磁盘阵列,并且不需要添加额外的RAID控制器,这正是我们普通用户所期望的。Matrix RAID需要硬件层和软件层同时支持才能实现,硬件方面目前就是ICH6R南桥以及更高阶的ICH6RW南桥,而Intel Application Acclerator软件和Windows操作系统均对软件层提供了支持。


      Matrix RAID的原理就是将每个硬盘容量各分成两部分(即:将一个硬盘虚拟成两个子硬盘,这时子硬盘总数为4个),其中用两个虚拟子硬盘来创建RAID0模式以提高效能,而其它两个虚拟子硬盘则透过镜像备份组成RAID 1用来备份数据。在Matrix RAID模式中数据存储模式如下:两个磁盘驱动器的第一部分被用来创建RAID 0阵列,主要用来存储操作系统、应用程序和交换文件,这是因为磁盘开始的区域拥有较高的存取速度,Matrix RAID将RAID 0逻辑分割区置于硬盘前端(外圈)的主因,是可以让需要效能的模块得到最好的效能表现;而两个磁盘驱动器的第二部分用来创建RAID1模式,主要用来存储用户个人的文件和数据。


      例如,使用两块120GB的硬盘,可以将两块硬盘的前60GB组成120GB的逻辑分割区,然后剩下两个60GB区块组成一个60GB的数据备份分割区。像需要高效能、却不需要安全性的应用,就可以安装在RAID 0分割区,而需要安全性备分的数据,则可安装在RAID 1分割区。换言之,使用者得到的总硬盘空间是180GB,和传统的RAID 0+1相比,容量使用的效益非常的高,而且在容量配置上有着更高的弹性。如果发生硬盘损毁,RAID 0分割区数据自然无法复原,但是RAID 1分割区的数据却会得到保全。


      可以说,利用Matrix RAID技术,我们只需要2个硬盘就可以在获取高效数据存取的同时又能确保数据安全性。这意味着普通用户也可以低成本享受到RAID 0+1应用模式。

     

     

    NV RAID:
      NV RAID是nVidia自行开发的RAID技术,随着nForce各系列芯片组的发展也不断推陈出新。相对于其它RAID技术而言,目前最新的nForce4系列芯片组的NV RAID具有自己的鲜明特点,主要是以下几点:


       (1)交错式RAID(Cross-Controller RAID):交错式RAID即俗称的混合式RAID,也就是将SATA接口的硬盘与IDE接口的硬盘联合起来组成一个RAID模式。交错式RAID在nForce3 250系列芯片组中便已经出现,在nForce 4系列芯片组身上该功能得到延续和增强。
       (2)热冗余备份功能:在nForce 4系列芯片组中,因支持Serial ATA 2.0的热插拔功能,用户可以在使用过程中更换损坏的硬盘,并在运行状态下重新建立一个新的镜像,确保重要数据的安全性。更为可喜的是,nForce 4的nVIDIA RAID控制器还允许用户为运行中的RAID系统增加一个冗余备份特性,而不必理会系统采用哪一种RAID模式,用户可以在驱动程序提供的“管理工具”中指派任何一个多余的硬盘用作RAID系统的热备份。该热冗余硬盘可以让多个RAID系统(如一个RAID 0和一个RAID1)共享,也可以为其中一个RAID系统所独自占有,功能类似于时下的高端RAID系统。
       (3)简易的RAID模式迁移:nForce 4系列芯片组的NV RAID模块新增了一个名为“Morphing”的新功能,用户只需要选择转换之后的RAID模式,而后执行“Morphing”操作,RAID删除和模式重设的工作可以自动完成,无需人为干预,易用性明显提高。

     
     
      
    RAID功能

      RAID是英文Redundant Array of Inexpensive Disks的缩写,中文简称为廉价磁盘冗余阵列。RAID就是一种由多块硬盘构成的冗余阵列。虽然RAID包含多块硬盘,但是在操作系统下是作为一个独立的大型存储设备出现。利用RAID技术于存储系统的好处主要有以下三种:

    1. 通过把多个磁盘组织在一起作为一个逻辑卷提供磁盘跨越功能
    2. 通过把数据分成多个数据块(Block)并行写入/读出多个磁盘以提高访问磁盘的速度
    3. 通过镜像或校验操作提供容错能力

      最初开发RAID的主要目的是节省成本,当时几块小容量硬盘的价格总和要低于大容量的硬盘。目前来看RAID在节省成本方面的作用并不明显,但是RAID可以充分发挥出多块硬盘的优势,实现远远超出任何一块单独硬盘的速度和吞吐量。除了性能上的提高之外,RAID还可以提供良好的容错能力,在任何一块硬盘出现问题的情况下都可以继续工作,不会受到损坏硬盘的影响。

      RAID技术分为几种不同的等级,分别可以提供不同的速度,安全性和性价比。根据实际情况选择适当的RAID级别可以满足用户对存储系统可用性、性能和容量的要求。常用的RAID级别有以下几种:NRAID,JBOD,RAID0,RAID1,RAID0+1,RAID3,RAID5等。目前经常使用的是RAID5和RAID(0+1)。

    09/01/2006

    发觉blog并不适合我

    别人是用blog写日记,而我却是用blog保存东西
     
    比起blog,一个wiki系统更适合我
    05/01/2006

    挖掘动力 主板DDR内存时序指南

      以DFI LanParty NF4 SLI-DR主板为例,DDR内存既然叫做双倍速率SDRAM(Dual date rate SDRSM),就是说他是SDRAM的升级换代产品。从技术上分析,DDR SDRAM最重要的改变是在界面数据传输上,其在时钟信号上升缘与下降缘时各传输一次数据,这使得DDR的数据传输速率为传统SDRAM的两倍。那么大家就应该知道了,我们所说的DDR400,DDR333,DDR266,他们的工作频率其实仅为那些数值的一半,也就是说DDR400工作频率为200MHz。

      FSB与内存频率的关系

      首先请大家看看表一:FSB(Front Side Bus:前端总线)和内存比率与内存实际运行频率的关系。

    FSB/MEM比率
    实际运行频率
    1/01
    200MHz
    1/02
    100MHz
    2/03
    133MHz
    3/04
    150MHz
    3/05
    120MHz
    5/06
    166MHz
    7/10
    140MHz
    9/10
    180MHz

      对于大多数玩家来说,FSB和内存同步,即1:1(DFI 用1/01表示)是使性能最佳的选择。而其他的设置都是异步的。同步后,内存的实际运行频率是FSBx2,所以,DDR400的内存和200MHz的FSB正好同步。如果你的FSB为240MHz,则同步后,内存的实际运行频率为240MHz x 2 = 480MHz。


    表2更详尽列出了FSB与不同速度的DDR内存之间正确的设置关系

      强烈建议采用1:1的FSB与内存同步的设置,这样可以完全发挥内存带宽的优势。

      Command Per Clock(CPC)

      可选的设置:Auto,Enable(1T),Disable(2T)

      Command Per Clock(CPC:指令比率,也有翻译为:首命令延迟),一般还被描述为DRAM Command Rate、CMD Rate等。由于目前的DDR内存的寻址,先要进行P-Bank的选择(通过DIMM上CS片选信号进行),然后才是L-Bank/行激活与列地址的选择。这个参数的含义就是指在P-Bank选择完之后多少时间可以发出具体的寻址的L-Bank/行激活命令,单位是时钟周期。显然,也是越短越好。但当随着主板上内存模组的增多,控制芯片组的负载也随之增加,过短的命令间隔可能会影响稳定性。因此当你的内存插得很多而出现不太稳定的时间,才需要将此参数调长。目前的大部分主板都会自动设置这个参数。

      该参数的默认值为Disable(2T),如果玩家的内存质量很好,则可以将其设置为Enable(1T)。

      CAS Latency Control(tCL)

      可选的设置:Auto, 1, 1.5, 2, 2.5 3, 3.5, 4, 4.5

      一般我们在查阅内存的时序参数时,如“3-4-4-8”这一类的数字序列,上述数字序列分别对应的参数是“CL-tRCD-tRP-tRAS”。这个3就是第1个参数,即CL参数。

      CAS Latency Control(也被描述为tCL、CL、CAS Latency Time、CAS Timing Delay),CAS latency是“内存读写操作前列地址控制器的潜伏时间”。CAS控制从接受一个指令到执行指令之间的时间。因为CAS主要控制十六进制的地址,或者说是内存矩阵中的列地址,所以它是最为重要的参数,在稳定的前提下应该尽可能设低。内存是根据行和列寻址的,当请求触发后,最初是tRAS(Activeto Precharge Delay),预充电后,内存才真正开始初始化RAS。一旦tRAS激活后,RAS(Row Address Strobe )开始进行需要数据的寻址。首先是行地址,然后初始化tRCD,周期结束,接着通过CAS访问所需数据的精确十六进制地址。期间从CAS开始到CAS结束就是CAS延迟。所以CAS是找到数据的最后一个步骤,也是内存参数中最重要的。

      这个参数控制内存接收到一条数据读取指令后要等待多少个时钟周期才实际执行该指令。同时该参数也决定了在一次内存突发传送过程中完成第一部分传送所需要的时钟周期数。这个参数越小,则内存的速度越快。必须注意部分内存不能运行在较低的延迟,可能会丢失数据,因此在提醒大家把CAS延迟设为2或2.5的同时,如果不稳定就只有进一步提高它了。而且提高延迟能使内存运行在更高的频率,所以需要对内存超频时,应该试着提高CAS延迟。

      该参数对内存性能的影响最大,在保证系统稳定性的前提下,CAS值越低,则会导致更快的内存读写操作。CL值为2为会获得最佳的性能,而CL值为3可以提高系统的稳定性。注意,WinbondBH-5/6芯片可能无法设为3。

      RAS# to CAS# Delay(tRCD)

      可选的设置:Auto, 0, 1, 2, 3, 4, 5, 6, 7.

      该值就是“3-4-4-8”内存时序参数中的第2个参数,即第1个4。RAS# to CAS# Delay(也被描述为:tRCD、RAS to CAS Delay、Active to CMD),表示"行寻址到列寻址延迟时间",数值越小,性能越好。对内存进行读、写或刷新操作时,需要在这两种脉冲信号之间插入延迟时钟周期。在JEDEC规范中,它是排在第二的参数,降低此延时,可以提高系统性能。建议该值设置为3或2,但如果该值设置太低,同样会导致系统不稳定。该值为4时,系统将处于最稳定的状态,而该值为5,则太保守。

      如果你的内存的超频性能不佳,则可将此值设为内存的默认值或尝试提高tRCD值。

      Min RAS# Active Timing(tRAS)

      可选的设置:Auto, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15.

      该值就是该值就是“3-4-4-8”内存时序参数中的最后一个参数,即8。Min RAS# Active Time (也被描述为:tRAS、Active to Precharge Delay、Row Active Time、Precharge Wait State、Row Active Delay、Row Precharge Delay、RAS Active Time),表示“内存行有效至预充电的最短周期”,调整这个参数需要结合具体情况而定,一般我们最好设在5-10之间。这个参数要根据实际情况而定,并不是说越大或越小就越好。

      如果tRAS的周期太长,系统会因为无谓的等待而降低性能。降低tRAS周期,则会导致已被激活的行地址会更早的进入非激活状态。如果tRAS的周期太短,则可能因缺乏足够的时间而无法完成数据的突发传输,这样会引发丢失数据或损坏数据。该值一般设定为CAS latency + tRCD + 2个时钟周期。如果你的CAS latency的值为2,tRCD的值为3,则最佳的tRAS值应该设置为7个时钟周期。为提高系统性能,应尽可能降低tRAS的值,但如果发生内存错误或系统死机,则应该增大tRAS的值。

      如果使用DFI的主板,则tRAS值建议使用00,或者5-10之间的值。

      Row Precharge Timing(tRP)

      可选的设置:Auto, 0, 1, 2, 3, 4, 5, 6, 7

      该值就是“3-4-4-8”内存时序参数中的第3个参数,即第2个4。Row Precharge Timing (也被描述为:tRP、RAS Precharge、Precharge to active),表示"内存行地址控制器预充电时间",预充电参数越小则内存读写速度就越快。

      tRP用来设定在另一行能被激活之前,RAS需要的充电时间。tRP参数设置太长会导致所有的行激活延迟过长,设为2可以减少预充电时间,从而更快地激活下一行。然而,想要把tRP设为2对大多数内存都是个很高的要求,可能会造成行激活之前的数据丢失,内存控制器不能顺利地完成读写操作。对于桌面计算机来说,推荐预充电参数的值设定为2个时钟周期,这是最佳的设置。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRP值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。

      如果使用DFI的主板,则tRP值建议2-5之间的值。值为2将获取最高的性能,该值为4将在超频时获取最佳的稳定性,同样的而该值为5,则太保守。大部分内存都无法使用2的值,需要超频才可以达到该参数。

      Row Cycle Time(tRC)

      可选的设置:Auto, 7-22,步幅值1。

      Row Cycle Time (tRC、RC),表示“SDRAM行周期时间”,它是包括行单元预充电到激活在内的整个过程所需要的最小的时钟周期数。

      其计算公式是:row cycle time (tRC) = minimum row active time (tRAS) + row precharge time (tRP)。因此,设置该参数之前,你应该明白你的tRAS值和tRP值是多少。如果tRC的时间过长,会因在完成整个时钟周期后激活新的地址而等待无谓的延时,而降低性能。然后一旦该值设置过小,在被激活的行单元被充分充电之前,新的周期就可以被初始化。在这种情况下,仍会导致数据丢失和损坏。因此,最好根据tRC = tRAS + tRP进行设置,如果你的内存模块的tRAS值是7个时钟周期,而tRP的值为4个时钟周期,则理想的tRC的值应当设置为11个时钟周期。

      Row Refresh Cycle Time(tRFC)

      可选的设置:Auto, 9-24,步幅值1。

      Row Refresh Cycle Time (tRFC、RFC),表示"SDRAM行刷新周期时间",它是行单元刷新所需要的时钟周期数。该值也表示向相同的bank中的另一个行单元两次发送刷新指令(即:REF指令)之间的时间间隔。tRFC值越小越好,它比tRC的值要稍高一些。

      如果使用DFI的主板,通常tRFC的值不能达到9,而10为最佳设置,17-19是内存超频建议值。建议从17开始依次递减来测试该值。大多数稳定值为tRC加上2-4个时钟周期。

      Row to Row Delay(RAS to RAS delay)(tRRD)

      可选的设置:Auto, 0-7,每级以1的步幅递增。

      Row to Row Delay,也被称为RAS to RAS delay (tRRD),表示"行单元到行单元的延时"。该值也表示向相同的bank中的同一个行单元两次发送激活指令(即:REF指令)之间的时间间隔。tRRD值越小越好。

      延迟越低,表示下一个bank能更快地被激活,进行读写操作。然而,由于需要一定量的数据,太短的延迟会引起连续数据膨胀。于桌面计算机来说,推荐tRRD值设定为2个时钟周期,这是最佳的设置,此时的数据膨胀可以忽视。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRRD值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。

      如果使用DFI的主板,则tRRD值为00是最佳性能参数,4超频内存时能达到最高的频率。通常2是最合适的值,00看上去很奇怪,但有人也能稳定运行在00-260MHz。

      Write Recovery Time(tWR)

       可选的设置:Auto, 2, 3。

      Write Recovery Time (tWD),表示"写恢复延时"。该值说明在一个激活的bank中完成有效的写操作及预充电前,必须等待多少个时钟周期。这段必须的时钟周期用来确保在预充电发生前,写缓冲中的数据可以被写进内存单元中。同样的,过低的tWD虽然提高了系统性能,但可能导致数据还未被正确写入到内存单元中,就发生了预充电操作,会导致数据的丢失及损坏。

      如果你使用的是DDR200和266的内存,建议将tWR值设为2;如果使用DDR333或DDR400,则将tWD值设为3。

      如果使用DFI的主板,则tWR值建议为2。

      Write to Read Delay(tWTR)

      可选的设置:Auto, 1, 2。

      Write to Read Delay (tWTR),表示"读到写延时"。三星公司称其为“TCDLR (last data in to read command)”,即最后的数据进入读指令。它设定向DDR内存模块中的同一个单元中,在最后一次有效的写操作和下一次读操作之间必须等待的时钟周期。

      tWTR值为2在高时钟频率的情况下,降低了读性能,但提高了系统稳定性。这种情况下,也使得内存芯片运行于高速度下。换句话说,增加tWTR值,可以让内容模块运行于比其默认速度更快的速度下。如果使用DDR266或DDR333,则将tWTR值设为1;如果使用DDR400,则也可试着将tWTR的值设为1,如果系统不稳定,则改为2。

      Refresh Period(tREF)

      可选的设置:Auto, 0032-4708,其步进值非固定。

      Refresh Period (tREF),表示“刷新周期”。它指内存模块的刷新周期。

      先请看不同的参数在相同的内存下所对应的刷新周期(单位:微秒,即:一百万分之一秒)。?号在这里表示该刷新周期尚无对应的准确数据。

      1552= 100mhz(?.??s)
      2064= 133mhz(?.??s)
      2592= 166mhz(?.??s)
      3120= 200mhz(?.??s)
      ---------------------
      3632= 100mhz(?.??s)
      4128= 133mhz(?.??s)
      4672= 166mhz(?.??s)
      0064= 200mhz(?.??s)
      ---------------------
      0776= 100mhz(?.??s)
      1032= 133mhz(?.??s)
      1296= 166mhz(?.??s)
      1560= 200mhz(?.??s)
      ---------------------
      1816= 100mhz(?.??s)
      2064= 133mhz(?.??s)
      2336= 166mhz(?.??s)
      0032= 200mhz(?.??s)
      ---------------------
      0388= 100mhz(15.6us)
      0516= 133mhz(15.6us)
      0648= 166mhz(15.6us)
      0780= 200mhz(15.6us)
      ---------------------
      0908= 100mhz(7.8us)
      1032= 133mhz(7.8us)
      1168= 166mhz(7.8us)
      0016= 200mhz(7.8us)
      ---------------------
      1536= 100mhz(3.9us)
      2048= 133mhz(3.9us)
      2560= 166mhz(3.9us)
      3072= 200mhz(3.9us)
      ---------------------
      3684= 100mhz(1.95us)
      4196= 133mhz(1.95us)
      4708= 166mhz(1.95us)
      0128= 200mhz(1.95us)

      如果采用Auto选项,主板BIOS将会查询内存上的一个很小的、名为“SPD”(Serial Presence Detect )的芯片。SPD存储了内存条的各种相关工作参数等信息,系统会自动根据SPD中的数据中最保守的设置来确定内存的运行参数。如过要追求最优的性能,则需手动设置刷新周期的参数。一般说来,15.6us适用于基于128兆位内存芯片的内存(即单颗容量为16MB的内存),而7.8us适用于基于256兆位内存芯片的内存(即单颗容量为32MB的内存)。注意,如果tREF刷新周期设置不当,将会导致内存单元丢失其数据。

      另外根据其他的资料显示,内存存储每一个bit,都需要定期的刷新来充电。不及时充电会导致数据的丢失。DRAM实际上就是电容器,最小的存储单位是bit。阵列中的每个bit都能被随机地访问。但如果不充电,数据只能保存很短的时间。因此我们必须每隔15.6us就刷新一行。每次刷新时数据就被重写一次。正是这个原因DRAM也被称为非永久性存储器。一般通过同步的RAS-only的刷新方法(行刷新),每行每行的依次刷新。早期的EDO内存每刷新一行耗费15.6us的时间。因此一个2Kb的内存每列的刷新时间为15.6?s x2048行=32ms。

      如果使用DFI的主板,tREF和tRAS一样,不是一个精确的数值。通常15.6us和3.9us都能稳定运行,1.95us会降低内存带宽。很多玩家发现,如果内存质量优良,当tREF刷新周期设置为3120= 200mhz(?.??s)时,会得到最佳的性能/稳定性比。

      Write CAS# Latency(tWCL)

       可选的设置:Auto, 1-8

      Write CAS Latency (tWCL),表示“写指令到行地址控制器延时”。SDRAM内存是随机访问的,这意味着内存控制器可以把数据写入任意的物理地址,大多数情况下,数据通常写入距离当前列地址最近的页面。tWCL表示写入的延迟,除了DDRII,一般可以设为1T,这个参数和大家熟悉的tCL(CAS-Latency)是相对的,tCL表示读的延迟。

      DRAM Bank Interleave

      可选的设置:Enable, Disable

      DRAM Bank Interleave,表示“DRAM Bank交错”。这个设置用来控制是否启用内存交错式(interleave)模式。Interleave模式允许内存bank改变刷新和访问周期。一个bank在刷新的同时另一个bank可能正在访问。最近的实验表明,由于所有的内存bank的刷新周期都是交叉排列的,这样会产生一种流水线效应。虽然interleave模式只有在不同bank提出连续的的寻址请求时才会起作用,如果处于同一bank,数据处理时和不开启interleave一样。CPU必须等待第一个数据处理结束和内存bank的刷新,这样才能发送另一个地址。目前所有的内存都支持interleave模式,在可能的情况下我们建议打开此项功能。

      对于DFI主板来说,任何情况下该设置都应该是Enable,可以增大内存的带宽。Disable对将减少内存的带宽,但使系统更加稳定。

      DQS Skew Control

      可选的设置:Auto, Increase Skew, Decrease Skew

      DQS Skew Control,表示“DQS时间差控制”。稳定的电压可以使内存达到更高的频率,电压浮动会引起较大的时间差(skew),加强控制力可以减少skew,但相应的DQS(数据控制信号)上升和下降的边缘会出现电压过高或过低。一个额外的问题是高频信号会引起追踪延迟。DDR内存的解决方法是通过简单数据选通脉冲来增加时钟推进。DDRII引进了更先进的技术:双向的微分I/O缓存器来组成DQS。微分表示用一个简单脉冲信号和一个参考点来测量信号,而并非信号之间相互比较。理论上提升和下降信号应该是完全对成的,但事实并非如此。时钟和数据的失谐就产生了DQ-DQS skew。

      如下图所示。

      对于DFI主板来说,建议设置为Increase Skew可以提升性能,而Decrease Skew在牺牲一定性能的情况下,可以增加稳定性。

      DQS Skew Value

      可选的设置:Auto, 0-255, 步进值为1。

      当我们开启了DQS skew control后,该选项用来设定增加或减少的数值。这个参数对系统的影响并不很敏感。 对于DFI主板来说,开启"Increase Skew"选项后,可以将该值设为50-255之间的值。值越大,表示速度越快。

      DRAM Drive Strength

      可选的设置:Auto, 1-8 ,步进值为1。

      DRAM Drive Strength(也被称为:driving strength),表示“DRAM驱动强度”。这个参数用来控制内存数据总线的信号强度,数值越高代表信号强度越高,增加信号强度可以提高超频的稳定性。但是并非信号强度高就一定好,三星的TCCD内存芯片在低强度信号下性能更佳。

      如果设为Auto,系统通常会设定为一个较低的值。对使用TCCD的芯片而言,表现会好一些。但是其他的内存芯片就并非如此了,根据在DFI NF4主板上调试和测试的结果,1、3、5 、7都是性能较弱的参数,其中1是最弱的。2、4、6、8是正常的设置,8提供了最强的信号强度。TCCD建议参数为3、5或7,其他芯片的内存建议设为6或8。

      DFI用户建议设置:TCCD建议参数为3、5、7,其他芯片的内存建议设为6或8。

      DRAM Data Drive Strength

      可选的设置:Auto, 1-4 ,步进值为1。

      DRAM Data Drive Strength表示“DRAM数据驱动强度”。这个参数决定内存数据总线的信号强度,数值越高代表信号强度越高。它主要用于处理高负荷的内存读取时,增加DRAM的驾驭能力。因此,如果你的系统内存的读取负荷很高,则应将该值设置为高(Hi/High)。它有助于对内存数据总线超频。但如果你并没有超频,提升内存数据线的信号强度,可以提高超频后速度的稳定性。此外,提升内存数据总线的信号强度并不能增强SDRAM DIMM的性能。因此,除非你内存有很高的读取负荷或试图超频DIMM,建议设置DRAM Data Drive Strength的值为低(Lo/Low)。

      要处理大负荷的数据流时,需要提高内存的驾驭能力,你可以设为Hi或者High。超频时,调高此项参数可以提高稳定性。此外,这个参数对内存性能几乎没什么影响。所以,除非超频,一般用户建议设为Lo/Low。

       DFI用户建议设置:普通用户建议使用level 1或3,如果开启了CPC,可能任何高于1的参数都会不稳定。部分用户开启CPC后能运行在3。更多的人关闭CPC后2-4都能够稳定运行。当然最理想的参数是开启CPC后设为level4。

      Strength Max Async Latency

      可选的设置:Auto, 0-15 ,步进值为1。

      Strength Max Async Latency目前还没能找到任何关于此项参数的说明,不知道其功能。感觉网友的经验,在进行Everest的LatencyTest时,可以看出一些差别。在我的BH-6上,参数从8ns到7ns在Latency Test的测试结果中有1ns的区别。从7ns调低6ns后,测试结果又减少了2ns。

      DFI主板建议设置:BIOS中的默认值为7ns,建议大家在5-10之间调节。6ns对内存的要求就比较高了,建议使用BH-5和UTT芯片的用户可以尝试一下,但对TCCD不适用。7ns的要求低一些,UTT和BH-5设为7n比较适合超频。8ns对UTT和BH-5就是小菜一碟,8ns时TCCD通常能稳定运行在DDR600,如果想超频到DDR640就必须设为9ns甚至更高了。

      Read Preamble Time

      可选的设置:Auto, 2.0-9.5,步进值为0.5。

      Read Preamble Time这个参数表示DQS(数据控制信号)返回后,DQS又被开启时的时间间隔。Samsung早期的显存资料显示,这个参数是用以提升性能的。DQS信号是双向的,无论从图形控制器到DDR SGRAM还是从DDR SGRAM到图形控制器都起作用。

      DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值5.0。建议大家在4.0-7.0之间调节,该值越小越好。

      Idle Cycle Limit

      可选的设置:Auto,0-256,无固定步进值。

      Idle Cycle Limit这个参数表示“空闲周期限制”。这个参数指定强制关闭一个也打开的内存页面之前的memclock数值,也就是读取一个内存页面之前,强制对该页面进行重充电操作所允许的最大时间。

      DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值256。质量好的内存可以尝试16-32,华邦(WINBOND)BH-5颗粒的产品能稳定运行在16。Idle Cycle Limit值越低越好。

      Dynamic Counter

      可选的设置:Auto, Enable, Disable。

      Dynamic Counter这个参数表示“动态计数器”。这个参数指定开启还是关闭动态空闲周期计数器。如果选择开启(Enable),则会每次进入内存页表(Page Table)就强制根据页面冲突和页面错误(conflict/page miss:PC/PM)之间通信量的比率而动态调整Idle Cycle Limit的值。这个参数和前一个Idle Cycle Limit是密切相关的,启用后会屏蔽掉当前的Idle Cycle Limit,并且根据冲突的发生来动态调节。

      DFI主板建议设置:BIOS中的该值设置为Auto和关闭和一样的。打开该设置可能会提升性能,而关闭该设置,可以使系统的更稳定。

      R/W Queue Bypass

      可选的设置:Auto, 2x, 4x, 8x, 16x。

      R/W Queue Bypass表示“读/写队列忽略”。这个参数指定在优化器被重写及DCI (设备控制接口:Device Control Interface)最后一次的操作被选定前,忽略操作DCI的读/写队列的时间。这个参数和前一个Idle Cycle Limit是相类似,只是优化器影响内存中的读/写队列。

      DFI主板建议设置:BIOS中的该值默认为16x。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。

      Bypass Max

      可选的设置:Auto, 0x-7x, 步进值为1。

      Bypass Max表示“最大忽略时间”。这个参数表示优化器选择否决之前,最后进入DCQ(Dependence Chain Queue)的可以被优化器忽略的时间。仔细研究后,我觉得这个参数会影响内存到CPU内存控制器的连接。

      DFI主板建议设置:BIOS中的该值默认为7x。建议4x或7x,两者都提供了很好的性能及稳定性。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。

      32 Byte Granulation

      可选的设置:Auto, Disable (8burst), Enable (4burst)。

      32 Byte Granulation表示"32位颗粒化"。当该参数设置为关闭(Disable)时,就可以选择突发计数器,并在32位的数据存取的情况下,最优化数据总线带宽。因此该参数关闭后可以达到最佳性能的目的。

      DFI主板建议设置:绝大多数情况下,建议选择Disable(8burst)选项。开启Enable (4burst)可以使系统更稳定一些。

      第三部分 超强的内存芯片

      上述参数的设置不可能适用于每位用户。不同的内存芯片的电压、参数都不同,所以超频能力也不一样。下面给出超频能力很强的一些内存芯片,建议大家在选购时多加以留意。

      Winbond(华邦)系列颗粒::BH-5、CH-5、BH-6、CH-6 、UTT;
      Hynix(现代)系列颗粒:D43、D5;
      Micron(镁光)系列颗粒:-5B C、-5B G;
      Infineon(英飞凌)系列颗粒:B5、BT-6、BT-5、CE-5、BE-5;
      Samsung(三星)系列颗粒:TCB3、TCCC、TCC4、TCC5、TCCD。

    03/01/2006

    主流Blog软件的完全比较

    这里是一份对目前8种主流Blog软件的详细比较,当你无法决定哪个Blog服务最适合你的时候,这个表格无疑会起到很大帮助。  http://www.ojr.org/ojr/images/blog_software_comparison.cfm

     

    Blog software comparison chart

    This chart is a companion to the article "Time to check: Are you using the right blogging tool?," published July 14, 2005 in the USC Annenberg Online Journalism Review. Do note that this chart reflects only standard features of the tools' installation, and not every possible extension, plug-in modification... or hack.

    Functionality Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    Comments Yes Yes Yes Yes Yes Yes Yes Yes
    Categories No Yes Yes Yes Yes Yes Yes Yes
    Subcategories No No No No Yes Yes No Yes
    Trackbacks No Yes Yes Yes Yes Yes Yes Yes
    Pings No Yes Yes Yes Yes Yes Yes Yes
    RSS No Yes Yes Yes Yes Yes Yes Yes
    Atom Yes Yes Yes Yes Yes Yes Yes Yes
    Search No No No No Yes Yes Yes Yes
    Blogroll/Lists No Yes Yes Yes Yes Yes No No
    Number of blogs Unlimited 1 3 Unlimited 1 1 Determined by license Unlimited
    News Aggregation No No No No Yes No No Yes
    Extras Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    Moblogging Yes Yes Yes Yes Yes Yes No Yes
    Photo Galleries No Yes Yes Yes Yes No No Yes
    Non-blog pages No No No No Yes Yes No Yes
    Maintenance Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    API Blogger MetaWeblog MetaWeblog MetaWeblog MetaWeblog Blogger, MetaWeblog, MT MetaWeblog MetaWeblog, Blogger, MT
    Logs None Yes Yes Yes Yes Yes No Yes
    Data Storage Database Database Database Database Database Database Static or dynamic Database
    Spam Fighting Tools Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    Blacklist No Yes Yes Yes Yes Yes No Yes
    Visitor registration/login Yes No No No Yes Yes Yes Yes
    Captchas No No No No No No No Yes
    Moderation No No No No No Yes No Yes
    URL NOFOLLOW No Yes Yes Yes Yes Yes Yes Yes
    IP/User/URL banning No Yes Yes Yes Yes Yes Yes Yes
    Comment Notification Yes Yes Yes Yes Yes Yes Yes Yes
    Design Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    Skins 33 6 6 6 23 7 7 27
    Admin panel design configuration No No Yes Yes Yes No No No
    Admin panel layout configuration No Yes Yes Yes Yes No No No
    Publishing Interface Blogger TypePad Basic TypePad Plus TypePad Pro Blogware WordPress Movable Type Expression Engine
    User Levels Yes No No Yes Yes Yes Yes Yes
    Multiple authors Yes No No Yes Yes Yes Yes Yes
    Image uploading Yes Yes Yes Yes Yes Yes Yes Yes
    Image thumbnailing No Yes Yes Yes Yes Yes Yes Yes
    Post scheduling No No Yes Yes Yes Yes Yes Yes
    Save without posting Yes Yes Yes Yes Yes Yes Yes Yes
    Bookmarklets No Yes Yes Yes Yes Yes Yes No
    Edit Templates Online Yes No Partial Yes Yes Yes Yes Yes
    Edit Templates Offline No No No No No No No Yes
    File uploading No Yes Yes Yes Yes Yes Yes Yes
    Password Protection No Yes Yes Yes Yes Yes No Yes
    Localization No Yes Yes Yes Yes Yes Yes Yes
    Work offline No No No No No No No No

    ©2005 Online Journalism Review.

    30/12/2005

    服务器内存

           服务器内存也是内存(RAM),它与普通PC(个人电脑)机内存在外观和结构上没有什么明显实质性的区别,主要是在内存上引入了一些新的特有的技术,如ECC、ChipKill、热插拔技术等,具有极高的稳定性和纠错性能。

        服务器内存主要技术:

        (1)ECC

        在普通的内存上,常常使用一种技术,即Parity,同位检查码(Parity check codes)被广泛地使用在侦错码(error detectioncodes)上,它们增加一个检查位给每个资料的字元(或字节),并且能够侦测到一个字符中所有奇(偶)同位的错误,但Parity有一个缺点,当计算机查到某个Byte有错误时,并不能确定错误在哪一个位,也就无法修正错误。基于上述情况,产生了一种新的内存纠错技术,那就是ECC,ECC本身并不是一种内存型号,也不是一种内存专用技术,它是一种广泛应用于各种领域的计算机指令中,是一种指令纠错技术。ECC的英文全称是“ Error Checking and Correcting”,对应的中文名称就叫做“错误检查和纠正”,从这个名称我们就可以看出它的主要功能就是“发现并纠正错误”,它比奇偶校正技术更先进的方面主要在于它不仅能发现错误,而且能纠正这些错误,这些错误纠正之后计算机才能正确执行下面的任务,确保服务器的正常运行。之所以说它并不是一种内存型号,那是因为并不是一种影响内存结构和存储速度的技术,它可以应用到不同的内存类型之中,就象前讲到的“奇偶校正”内存,它也不是一种内存,最开始应用这种技术的是EDO内存,现在的SD也有应用,而ECC内存主要是从SD内存开始得到广泛应用,而新的DDR、RDRAM也有相应的应用,目前主流的ECC内存其实是一种SD内存。

        (2)Chipkill

        Chipkill技术是IBM公司为了解决目前服务器内存中ECC技术的不足而开发的,是一种新的ECC内存保护标准。我们知道ECC内存只能同时检测和纠正单一比特错误,但如果同时检测出两个以上比特的数据有错误,则一般无能为力。目前ECC技术之所以在服务器内存中广泛采用,一则是因为在这以前其它新的内存技术还不成熟,再则在目前的服务器中系统速度还是很高,在这种频率上一般来说同时出现多比特错误的现象很少发生,正因为这样才使得ECC技术得到了充分地认可和应用,使得ECC内存技术成为几乎所有服务器上的内存标准。

        但随着基于Intel处理器架构的服务器的CPU性能在以几何级的倍数提高,而硬盘驱动器的性能同期只提高了少数的倍数,因此为了获得足够的性能,服务器需要大量的内存来临时保存CPU上需要读取的数据,这样大的数据访问量就导致单一内存芯片上每次访问时通常要提供4(32位)或8(64位)比特以上的数据,一次性读取这么多数据,出现多位数据错误的可能性会大大地提高,而ECC又不能纠正双比特以上的错误,这样就很可能造成全部比特数据的丢失,系统就很快崩溃了。IBM的Chipkill技术是利用内存的子结构方法来解决这一难题。内存子系统的设计原理是这样的,单一芯片,无论数据宽度是多少,只对于一个给定的ECC识别码,它的影响最多为一比特。举个例子来说明的就是,如果使用4比特宽的DRAM,4比特中的每一位的奇偶性将分别组成不同的ECC识别码,这个ECC识别码是用单独一个数据位来保存的,也就是说保存在不同的内存空间地址。因此,即使整个内存芯片出了故障,每个ECC识别码也将最多出现一比特坏数据,而这种情况完全可以通过ECC逻辑修复,从而保证内存子系统的容错性,保证了服务器在出现故障时,有强大的自我恢复能力。采用这种内存技术的内存可以同时检查并修复4个错误数据位,服务器的可靠性和稳定得到了更加充分的保障。

        (3)Register

        Register即寄存器或目录寄存器,在内存上的作用我们可以把它理解成书的目录,有了它,当内存接到读写指令时,会先检索此目录,然后再进行读写操作,这将大大提高服务器内存工作效率。带有Register的内存一定带Buffer(缓冲),并且目前能见到的Register内存也都具有ECC功能,其主要应用在中高端服务器及图形工作站上,如IBM Netfinity 5000。

        服务器内存典型类型

        目前服务器常用的内存有SDRAM和DDR两种内存。

        (1)SDRAM
        (2)DDR SDRAM

        以下是两者的对比图表:



       由于服务器内存在各种技术上相对兼容机来说要严格得多,它强调的不仅是内存的速度,而是它的内在纠错技术能力和稳定性。所以在外频上目前来说只能是紧跟兼容机或普通台式内存之后。目前台式机的外频一般来说已到了150MHz以上的时代,但133外频仍是主流。而服务器由于受到整个配件外频和高稳定性的要求制约,主流外频还是100MHz,但133MHz外频已逐步在各档次服务器中推行,在选购服务器时当然最好选择133MHz外频的了!内存、其它配件也一样,要尽量同步进行,否则就会影响整个服务器的性能。目前主要的服务器内存品牌主要有Kingmax、kinghorse、现代、三星、kingstone、IBM、VIKING、NEC等,但主要以前面几种在市面上较为常见,而且质量也能得到较好的保障。

    26/12/2005

    故乡的雁 括弧 此雁非彼燕 括弧完

    阴历十一月初三,阴。大风,晨起即生,至晚不休
    十一月初四,晴。碧空万里,无片丝云。一扫前些日满天阴郁
    至午时分,闻北天嘎嘎雁鸣。屋外有人大呼“雁。。。雁。。。好多。。。雁。。。快来”。急奔出外,见漫天飞鸿,浩浩荡由北而至,遍布上空。成群结队,数千有余。目之所及,尽皆如是。并行不悖,井然有序。褐翼白肚,振翅翱翔,形态优雅。亦飞亦鸣,眼耳皆悦。至今仅只此次耳,深恐此行留憾,遂操相机拍之(不是我  ),留此存照,以慰平生
    08/12/2005

    2005岁末BLOG程序大评点

    ASP

    L-Blog: http://www.loveyuki.com
    由Loveyuki自主开发的基于 ASP+Access 的小型单用户BLOG,目前似乎已经停止更新了,但是用户群相当大,而且是国内相当多的BLOG系统的鼻祖。

    oblog: http://www.oioj.net
    多用户Blog,目前占据ASP多用户BLOG的大部分市场,2.X商业版已经实行免费,很值得继续关注与期待的国内作品。

    SLblog:http://SLblog.com
    多用户Blog,刚发展起来的,更新很快,感觉像是oblog和missblog的结合体,同时首创了Blog系统无限级分类和用户栏目的无限级分类,多功能在现编辑器。但界面不是很美观,好在模板和程序分离,方便修改。

    Misslog: http://www.misslog.com/blog
    多用户blog,每个blog可以有多个用户参与创作与维护,团队功能很强大!

    LBS: http://www.voidland.com/blog
    LBS早期基于L-Blog架构,自从LBS2推出以后,大部分属于自己的创作,模板很多,用户群也逐渐庞大。

    Z-Blog: http://www.rainbowsoft.org/zblog/
    今年发展相当快的Blog系统,官方提供了想当丰富的支持,也创造了比较好的交流环境,这是他的一大亮点。

    PJBlog: http://www.pjhome.net/
    基于ASP的单用户BLOG系统,由于其插件异常丰富,可扩展的功能很多,比较适合喜欢功能饱满的朋友。

    Alpar's Blog: http://blog.fz0132.com
    基于L-Blog架构,但是作了相当大程度的修改,全面兼容LBS^2 的Style,目前版本模板采用DIV+CSS,很值得期待后续发展。

    nblog: http://blog.nowans.com/
    一个基于Access的个人Blog程序,全生成静态页面,刚开始起步。

    2s-space:http://www.2s-space.com

    d2kblog: http://www.d2ksoft.com/
    D2KSoft公司的redguardtoo基于卫慧杰的L-Blog1.06扩展而成,事实上,90%的代码我都重新写过了,支持多国语言页面内容和页面样式分离。

    KeeBlogSystem: http://keesky.com/blog/
    XUL后台管理,很有特点的一个BLOG系统。

    ASP.NET

    .Text: http://scottwater.com/Dottext/default.aspx
    很有名的ASP的blog系统,官方暂无静态化(对每页生成静态的html页面)版本,国内donews使用该软件。

    BlogX: http://www.simplegeek.com/CategoryView.aspx/BlogX
    程序是英国人编写的,国内 BLANKSOFT.COM 进行了汉化和修改。

    dasBlog: http://www.dasblog.net
    功能比较齐全,对FireFox的支持不怎么好。

    PHP

    Okphp BLOG: http://cn.okphp.com/
    基于PHP+MYSQL开发的多用户BLOG系统,部分代码ZEND,主要特点能够很好地和许多论坛程序无缝兼容。

    BlogHoster: http://www.webligo.com
    国外的一个多用户商业BLOG系统,基于PHP+MYSQL,简洁明快的风格。

    exBlog: http://www.exblog.net/
    基于PHP/MySQL平台开发,注重稳定效率和兼容性,使用了 PHPLIB 的模板系统,提供WAP接口。

    Pixelpost PhotoBlog: http://www.pixelpost.org/
    国外的由图片系统和博客系统融合来的新型博客,已经由落伍的 星 完成汉化。

    bMachine: http://boastology.com
    国外老牌BLOG系统,同时支持文本数据库和MySQL数据库,支持中文搜索。

    7log: http://www.7log.com
    比较早的能够生成静态页面的BLOG系统,目前开发进度停滞。

    O-blog: http://www.phpblog.cn/
    需在PHP+MYSQL环境下运行,主要特色对静态生成有很大的灵活度,作者风色默默无闻地开发也让人钦佩。

    pigface blog: http://www.flashforweb.com/
    一个简单的BLOG,具备所有BLOG必须的功能,基于PHP+MYSQL。

    bo-blog: http://www.bo-blog.com/
    文本数据库,现在发展似乎遇到了瓶颈,发展不如年初那么火热,但是一样有很多追随者。

    C-Blog: http://www.saysay.cn
    由 Coolsky 自主开发的基于 PHP+Smarty模版引擎+ADODB组件 的小型单用户BLOG,目前提供2个版本:php+mysql版本 和php+access版本,能够生成静态页面。

    SaBlog: http://www.4ngel.net/blog/angel/
    安全天使小组开发的一套BLOG系统,功能不断在完善,优点在于安全性很高。

    Simple PHP Blog: http://www.simplephpblog.com/
    国外一个轻便的blog系统,包含中文语言文件。

    yo2blog: http://www.oneoo.com/
    一个简单小巧快捷的 blog 程序,使用假性目录结构生成类静态 HTML 页面链接。

    sBLOG: http://www.sblog.cn/
    国外一款基于PHP+MySQL的BLOG系统,模板遵循W3C规范,并提供mod_rewrite功能支持。

    b2: http://www.cafelog.com php
    blog的老祖宗,操作简单,容易上手,现在好像停止了开发。

    b2evolution: http://www.b2evolution.net
    B2多用户版,有很多风格和插件。

    wordpress: http://www.wordpress.org
    架站比MT简单一点,功能也很全面,应该是支持blog的首选。它有最强的模版功能,已经开始有限范围内测试多用户的新版。

    pivot: http://www.pivotlog.net
    PHP+XML,没有使用数据库,有中文语言包,

    nucleus: http://www.nucleuscms.org
    这个也是比较老牌的程序了,有中文语言包!

    M-logger: http://miracle.shakeme.net
    文本储存数据。

    drupal: http://www.drupal.org
    功能强大,在多用户支持上尤为突出。它看起来更像一个内容发布系统(CMS)而不是一个纯blog软件,所以仅仅只想使用blog功能的朋友就用不着扛着这门炮了。

    Pmschine: http://www.pmachine.com
    这个估计是blog的元老了,不过现在已经商业化了,新版本名叫Expression Engine,在国内可以免费下载!

    bBlog: http://dev.bblog.com/
    一个非常简洁好用的blog,汉化版: http://www.xptop.com/lei/

    serendipity: http://www.s9y.org
    功能很多,每个功能以模块方式安装,界面也很容易修改。

    Plog http://www.plogworld.net
    blog里的最好作品了,真正的多用户,不过目前官方网站打不开,不知道是不是偶的网络问题,呵呵!

    Plainslash: http://www.51zhao.com/plainslash/
    文本blog程序,作者很久没更新了,但现在blog的基本功能都有了。

    TatterTools PHP/MYSQL
    http://www.tattertools.com
    模版华丽见长,模版和后台脱离,多为韩国风格,女生建立blog的首选。
    中文论坛支持 http://www.meyu.net/star/

    CGI

    movable Type: http://www.movabletype.org
    一个cgi程序的blog软件,应用最为广泛,大陆不算十分多,香港台湾的80%以上的独立blog站点都是通过它架设的。插件众多,基本需要的功能都能实现,它支持多用户blog。

    Greymatter: http://www.noahgrey.com/greysoft/
    是一个类似 Movable Type 的Blog程序非常简单,也是生成静态文件。

    HUS Reviv: http://supermanc.51.net/norman/blog.cgi
    国人开发的,功能很强大,但由于cgi语言的问题,安装调试比较复杂,而且很占资源。

    Blosxom: http://www.blosxom.com
    很老的一个程序了,也可能是世界上最小的blog系统了,只有一个文件却实现了blog的大部分功能!  

    JSP

    Roller:http://www.rollerweblogger.org/page/project
    国外运用想当广泛的一套BLOG系统。

    DLOG4J: http://dlog4j.sourceforge.net/
    国人开发的,已经申报SourceForge项目 中文官方站: http://www.javayou.com

    TM: http://www.terac.com
    一个功能强大的blog,支持文件上传、RSS、评论、WYSIWYG 编辑器等功能,多种语言(含简体中文)

    07/12/2005

    规划与远见

    最近在blog上转贴的东西多了才发现一个好的分类是多么的重要。就如同城市的规划一样。而这自然就需要自身具有卓越的远见和眼光。残念阿。。。。。。。。。。
    28/10/2005

    注解高端UNIX服务器之技术

    注解高端UNIX服务器之技术

    作 者: 陈志红、海纳

    转载自:赛迪网技术天地

    对于服务器而言(不管是PC服务器,还是UNIX服务器),单纯地提高单个处理器的运算能力和处理能力正在变得越来越难,虽然许多制造商从材料、工艺和设计等方面进行了不懈的努力,近期内仍然使得CPU保持着高速的增长势态,但高频之下的高功耗所引起的电池容量问题和散热问题等负面效应,以及这些负面效应对整机系统产生的电磁兼容性问题,又反过来将CPU运算能力的提升推到了暮年。显然,提高单个处理器速度和性能已是强弩之末,而研发多个 CPU的并行处理技术,才是真正提高现代服务器处理能力和运算速度的有效途径。这也正是多处理器服务器不仅是UNIX服务器的专利,而且也是已经在PC服务器中普遍采用的原因。目前,业界比较关注的并行处理技术主要有SMP技术、MPP技术、COMA技术、集群技术和NUMA技术等。

      1.SMP技术
      SMP(对称多处理—Symmetrical MultiProcessing)技术是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,多个处理器运行操作系统的单一复本,并共享内存和一台计算机的其他资源。所有的处理器都可以平等地访问内存、I/O和外部中断。

      在非对称多处理系统中,任务和资源由不同处理器进行管理,有的CPU只处理I/O,有的CPU只处理操作系统的提交任务,显然非对称多处理系统是不能实现负载均衡的。在对称多处理系统中,系统资源被系统中所有CPU共享,工作负载能够均匀地分配到所有可用处理器之上。

      目前,大多数SMP系统的CPU是通过共享系统总线来存取数据,实现对称多处理的。如某些RISC服务器厂商使用Crossbar或Switch方式连接多个CPU,虽然性能和可扩展性优于Intel架构,但SMP的扩展性仍有限。

      在SMP系统中增加更多处理器的难点是系统不得不消耗资源来支持处理器抢占内存,以及内存同步两个主要问题。抢占内存是指当多个处理器共同访问内存中的数据时,它们并不能同时去读写数据,虽然一个CPU正读一段数据时,其他CPU可以读这段数据,但当一个CPU正在修改某段数据时,该 CPU将会锁定这段数据,其他CPU要操作这段数据就必须等待。

      显然,CPU越多,这样的等待问题就越严重,系统性能不仅无法提升,甚至下降。为了尽可能地增加更多的CPU,现在的SMP系统基本上都采用增大服务器Cache容量的方法来减少抢占内存问题,因为Cache是CPU的“本地内存”,它与CPU之间的数据交换速度远远高于内存总线速度。又由于Cache支持不共享,这样就不会出现多个CPU抢占同一段内存资源的问题了,许多数据操作就可以在CPU内置的Cache或CPU外置的 Cache中顺利完成。

      然而,Cache的作用虽然解决了SMP系统中的抢占内存问题,但又引起了另一个较难解决的所谓“内存同步”问题。在SMP系统中,各CPU通过Cache访问内存数据时,要求系统必须经常保持内存中的数据与Cache中的数据一致,若Cache的内容更新了,内存中的内容也应该相应更新,否则就会影响系统数据的一致性。由于每次更新都需要占用CPU,还要锁定内存中被更新的字段,而且更新频率过高又必然影响系统性能,更新间隔过长也有可能导致因交叉读写而引起数据错误,因此,SMP的更新算法十分重要。目前的SMP系统多采用侦听算法来保证CPU Cache中的数据与内存保持一致。Cache越大,抢占内存再现的概率就越小,同时由于Cache的数据传输速度高,Cache的增大还提高了CPU的运算效率,但系统保持内存同步的难度也很大。

      在硬件方面,SMP可以在UltraSPARC、SPARCserver、Alpha以及PowerPC架构上实现,也可以利用包括486以上所有Intel芯片来实现。

      2.集群技术
      集群(Cluster)技术是近几年兴起的发展高性能计算机的一项技术。它是一组相互独立的计算机,利用高速通信网络组成一个单一的计算机系统,并以单一系统的模式加以管理。其出发点是提供高可靠性、可扩充性和抗灾难性。一个集群包含多台拥有共享数据存储空间的服务器,各服务器通过内部局域网相互通信。当一台服务器发生故障时,它所运行的应用程序将由其他服务器自动接管。在大多数模式下,集群中所有的计算机拥有一个共同的名称,集群内的任一系统上运行的服务都可被所有的网络客户使用。采用集群系统通常是为了提高系统的稳定性和网络中心的数据处理能力及服务能力。

      常见集群技术有:

      (1)服务器镜像技术

      (2)应用程序错误接管集群技术

      错误接管集群技术是将建立在同一个网络里的两台或多台服务器通过集群技术连接起来,集群节点中的每台服务器各自运行不同的应用,具有自己的广播地址,对前端用户提供服务,同时每台服务器又监测其他服务器的运行状态,为指定服务器提供热备份服务。

      错误接管集群技术通常需要共享外部存储设备—磁盘阵列柜,两台或多台服务器通过SCSI电缆或光纤与磁盘阵列柜相连,数据都存放在磁盘阵列柜上。这种集群系统中通常是两个节点互为备份的,而不是几台服务器同时为一台服务器备份,集群系统中的节点通过串口、共享磁盘分区或内部网络来互相监测对方的心跳。

      错误接管集群技术经常用在数据库服务器、MAIL服务器等的集群中。这种集群技术由于采用共享存储设备,所以增加了外设费用。它最多可以实现32台机器的集群,极大地提高了系统的可用性及可扩展性。目前在提高系统的可用性方面用得比较广泛的是应用程序错误接管技术,即我们通常所采用的双机通过SCSI电缆共享磁盘阵列的集群技术。

      (3)容错集群技术

      容错集群技术的一个典型的应用即容错机,在容错机中,每一个部件都具有冗余设计。容错集群技术的实现往往需要特殊的软硬件设计,因此成本很高,但是容错系统最大限度地提高了系统的可用性,是财政、金融和安全部门的最佳选择。

      3.NUMA技术
      现今的64位UNIX并行计算服务器可分为两类:分布式共享存储结构(DSM)和集群系统。非均匀存储访问(NUMA)是一种并行模型,属于DSM这一类。NUMA的物理内存分布在不同节点上,在一个处理器存取远程节点的数据,比存取同一点的局部数据“路径”远一些,时间长一些,所以是非均匀存储访问。

      对称多处理也是一种共享存储器的多处理机结构。它的单一寻址空间、简单的编程方式、操作方便是其容易普及的主要原因。大规模并行处理(MPP)属于集群系统这一类体系结构,它的优势是可扩展性好,但需要并行编程和并行编译,使用不便。NUMA系统把SMP与集群的优势结合在一起,它既有SMP的可编程性,又具有集群的可扩展性。实际上,这一“优势的结合”实为一种折衷,其中关键是寻求结合的途径并确定结合点。

      NUMA3系统架构的由来
      NUMA(非均匀存储器存取结构-Non Uniform Memory Access Architecture)是在八十年代后期作为斯坦福大学的一个研究项目诞生的。1995年,SGI与斯坦福大学DASH项目组一起设计出了第一代 NUMA系统;1996年,SGI推出了第二代NUMA系统,该系统的处理器数目可以从32个一直扩展到512个,并且系统带宽可随处理器数目增加而线性扩展;为了进一步扩展NUMA架构的功能和提高灵活性,SGI在2000年秋季推出了第三代NUMA系统,简称NUMA3系统。新系统可以使系统的计算能力、内存容量、外存容量、图形性能及联网能力独立地扩展,NUMA3系统具有多功能性、模块化、灵活性等三大特点。用户可以根据需要量体裁衣地配置系统,因而投资可以得到充分保护。

      第三代NUMA系统采用不同的功能模块(Brick)构成,这些模块比第二代NUMA机的模块小,功能更专一、更具可扩展性,而且尺寸标准化,这就进一步增加了系统的灵活性。

      在第三代NUMA服务器中,采用性能更好的交叉开关Bedrock,所有的处理器和存储器通过Bedrock连接在一起。这些处理器、存储器和交叉开关的结合组成了称为NUMAlink的互联结构。另外,在第三代NUMA服务器中采用了更先进的路由芯片,通过使用特殊的光缆提供具有高带宽和极低延迟的互联网络,路由芯片所有的Bedrock交叉开关连接起来形成一个单一的、连续的达1TB的存储空间。处理器和本地以及远程存储器之间的通信宽带(双向)由原来的1.6GBps提高到3.2GBps。另外,电源采用N+1的冗余方式,因此可靠性也进一步提高。

      在NUMA体系结构中,每个处理器与自已的本地存储器和高速缓存相连,多个处理器通过处理器、存储器互联网络相连。处理器还通过处理器、I/O网络访问共享的I/O和外围设备。至于处理器之间的通信则通过可选的处理器之间的通信网络来实现。NMUA技术在科学与工程计算领域具有不可替代的地位,在联机事务处理(OLTP)、决策支持服务(DSS)和Intranet以及Internet中的地位也越来越重要。目前,NUMA并行机的处理器数目可达到512个,且带宽可随处理器数目基本上呈线性扩展。这样大的处理器数,使单一系统映像的NUMA机足以覆盖绝大多数的应用。首先,由于它具有与SMP相同的编程模式,因此在科学与工程计算领域具有不可替代的地位;其次,由于它具有共享内存和良好的可扩展性优势,所以能很好适应企业数据中心的多种应用。

      今天,NUMA系统能够运行世界上一些最大的UNIX数据库应用,而且正被广泛接受为电子商务的主流技术,包括处理功能、I/O的大规模可扩展性、高可用性、工作负荷和资源管理的广泛灵活性,而且无需改变SMP编程模型。

      存储一致性与ccNUMA
      在NUMA并行机中,虽然存储器在物理上被分配到各节点中,但可被系统内所有处理器访问或共享。存储一致性问题是由于多个处理器共享同一个存储单元而引起的。SGI采用高速缓存一致性(Cache Coherent)技术来解决存储一致性问题,这就是“ccNUMA”并行机名称的由来。

      在ccNUMA系统中,每个CPU有一个私用高速缓冲存储器。为了得到较好的性能,CPU经常在它的高速缓存中取指令及存储数据。在这种系统中,一个存储器地址的内容可以有许多独立的拷贝给各个CPU。如果每个CPU指向同一个存储器地址,则每个CPU的高速缓存将得到该地址的内容拷贝。但是当一个CPU修改该地址的内容后,必须阻止其他各个CPU使用当前已经“过时”的数据,这就是所谓高速缓存一致性问题。那么如何保证所有高速缓存能反映存储器的真实情况呢?

      高速缓存一致性不是用软件来实现,它必须用硬件来管理。高速缓存一致性问题也不是用CPU来实现,而是用Hub芯片中的部分辅助线路来实现。为了提高系统的带宽和规模可伸缩性,在采用ccNUMA体系结构的服务器中,不采用基于总线的广播方法,而是采用基于目录的高速缓存一致性方案。任何时候,当一个节点请求访问存储器中某一Cache行时,它的集线器就启动曾经访问过该行节点的高速缓存,并把Cache行的存储器数据拷贝到这一节点的高速缓存中。当存储器中的Cache行未被独占时,其他各节点就可按同样方式通过互联网络从高速缓存中读取该行数据。当一个CPU要修改一个 Cache行时,它必须取得独占权。为此,集线器从目标行的状态位中进行检索,并发送一个无效信息给对该行数据作过拷贝的每个节点,在目录存储器中设置了对内容作修改的节点的编号。当一个CPU要读一个Cache行,且该行被独占时,集线器就要求该节点对这个Cache行作拷贝。其他节点则通过互联网络从拥有独占权节点的高速缓存中拷贝该Cache行的最新信息。如果两个节点要求同时访问某一Cache行时,则有协议来保证某个节点去访问该Cache行。

      ccNUMA结构的服务器在性能、灵活性、可用性方面都能适合用户多种应用的要求,它已成为当今互联网经济时代非常卓越的 Internet/Web服务器,特别是在宽带因特网中作为多媒体应用的核心服务器。与集群不同的是,集群采用一种松散的结合方式,在几台机器之间相互通信,内部交换时间长、消耗大,而且把几台机器作为一个系统管理,势必增加了管理上的难度。而ccNUMA计算机则不同,无论它内部有多少个处理器,对用户来说,它也仅仅是简单的一台计算机。

      总而言之,ccNUMA克服了SMP和集群的某些弊端,在他们不能施展才能的地方发挥了作用。

      模块化结构
      模块化服务器主要包括计算模块、I/O模块和海量存储器模块。这些模块协同工作,构成一个模块化服务器系统。在一个模块化服务器系统中,可以分别对每一个模块进行升级、故障查找,或用新模块替换旧模块,同类模块也可以随时加入到模块化服务器中,以便对系统进行扩展。

      模块化服务器的最大好处之一,就是可以保护客户的投资。模块化服务器是一种可伸缩的服务器,客户可以随着业务需要,通过向服务器中添加各种模块,扩展他们的服务器系统;另一个显著优点是维护管理十分方便。模块化服务器增强了系统的可用性和容错性。从高性能多处理器计算机体系结构观点来看,ccNUMA体系结构,把多个处理器通过路由器光纤互联在一起,系统带宽可随系统规模扩大而增加,从而克服了基于总线的SMP体系结构所造成的瓶颈。 ccNUMA结构采用超立方体的多维互联特性,加上模块化计算所带来的灵活性,使系统的可伸缩性达到了前所未有的水平,同时节省了费用。因此,模块化的 NUMA服务器在灵活性和经济性方面达到了一个新境界。

      硬件分区
      硬件分区,是将一台服务器的硬件分割成多个分区的体系结构。将服务器配置的处理器、内存和I/O控制器等硬件资源分配给多个分区,让各分区上运行不同的OS,也就是提供“分区功能”。利用系统的硬件分区能力,系统可同时为多种不同操作系统提供支持,从而满足客户对相同物理硬件不断增长的需求。系统分区最初是静态的,当资源从一个分区移到另一个分区时,这两个分区中的应用和操作系统需要停止,在操作控制台对系统重新配置后,应用和操作系统才可以重新启动。随着操作系统进一步完善,操作系统在支持热插拔和热添加能力的同时,也为动态分区提供了所需要的支持基础,这就是说,资源可以在各个分区之间移动,而不会影响这一分区中的应用运行。

    长久以来一直存在着一个话题:UNIX服务器能否替代专有系统。这同样是一个见仁见智的问题,但是不容忽视的事实是,各UNIX厂商在高端产品不断推陈出新,增加产品的技术内涵,既以达到并超过大型主机为目标,又作为自己UNIX技术的集中体现,与其他UNIX厂商竞争。

      当然, UNIX技术的发展决不能仅限于性能和功能上。在安全性和管理性上,UNIX服务器有不少需要向主机学习的地方。但是,高端UNIX系统已经基本可以满足主机用户的要求,并且在各厂家的推动下更快地进步。UNIX占据主机的部分市场也将是不可避免的。这就和NT服务器和低端UNIX服务器的竞争有些类似。

      随着市场竞争的日益加剧和IT企业的大规模兼并,曾经出现的几十家UNIX厂商竞相角逐的景象已不复存在。目前仅剩下几家UNIX厂商,他们把持了UNIX服务器的市场和技术发展趋势。下面我们就看看几款有代表性的产品。

      HP 9000 Superdome高端UNIX服务器

    Superdome服务器主要面向大型互联网企业、互联网服务提供商,以及开发电子商务战略,需要处理大量数据的企业。

      Superdome是惠普公司在继V系列之后推出的第一款支持64个及可无限扩展微处理器的服务器,可以同时支持PA-RISC和 IA64处理器。64个CPU的一款可支持256GB内存,I/O插槽最多可达192个。Superdome提前做好了开放系统的集成工作,可在同一台系统上分区,运行HP UX-11i、Linux、MPE和Windows NT;性能可以通过硬件物理分区、多级分区、软件虚拟分区和综合动态分区等功能获得提高。惠普为Superdome制定了全新的销售定价方式和服务模式- “全面客户服务模式”。Superdome的客户将得到惠普公司的全套解决方案,使客户在系统革新、建设、运行和发展升级四个使用阶段中都能全程享受到惠普提供的支持服务。

      IBM p系列680服务器


    p系列680服务器是IBM最强大的UNIX对称多处理器系统,在处理众多不同的关键电子商务应用(包括Web serving和hosting、ERP、 SCM、CRM等等)上尤为出色。

      680中配备的微处理器采用了绝缘硅(SOI)技术。该技术通过在芯片电路上涂上一层绝缘体,降低了电流发热。芯片热度的降低不仅可以提高运行速度,还可以减少运行错误,或系统崩溃的机率。680配备的CPU运行频率为600MHz,每一枚微处理器的缓存容量为16MB,系统内存容量为 96GB,SMP配置最多可达4个6路处理器模块。

    Sun Enterprise 10000服务器

    Sun Enterprise 10000运行在Solaris操作环境下,对于基于主机的或客户机/服务器的各类应用,如在线交易处理、决策支持系统、数据仓库、通信服务或多媒体服务等,它都是理想的通用服务器或数据服务器。

      Sun E10000脱胎于CRAY的CS6400,是第一个具有硬件分区(Hard Partition)功能的UNIX高端服务器,同时也是第一个达到64路SMP计算的UNIX单机。它采用Sun UltraSPARCII 400MHz处理器,最多可配置64个CPU,最大内存容量为64GB,可以实现最多16个分区(或称为域),在线磁盘存储容量可达64TB,具有动态重组特性(可提供在线服务能力)和动态系统域特性。通过在系统的核心部位采用Gigaplane-XB互连,提供的数据带宽可达到每秒12.8GB。

      SGI Origin 3000服务器

    SGI Origin 3000高性能服务器新产品采用SGI NUMAflex结构,即SGI新型模块化计算结构或称为第三代NUMA架构。SGI 3000服务器可以从两个64位的MIPS RISC CPU的最低配置扩展到512个CPU的共享存储的多处理器系统。另外,SGI的InfiniteReality3图形子系统也可以集成到该结构中。

      第三代NUMA服务器采用模块化设计,7种基本模块分别是CPU扩展模块、磁盘存储器扩展模块、基本的I/O模块、PCI扩展模块、路由器互联模块、XIO扩展模块和图形扩展模块。模块化设计使系统配置更加灵活,更加经济高效,并具有很高的容错性和系统扩充性,能为客户提供可靠的总体投资保护和卓越的性能。

    30/09/2005

    计算机科学与技术领域常用中文电子信息资源举要

    计算机科学与技术领域常用中文电子信息资源举要
    原创:北京工业大学图书馆 李军英 林屹 2003年11月1日

    计算机科学与技术领域常用中文电子信息资源举要

    北京工业大学图书馆 李军英 林屹

    关键词:计算机科学与技术 电子资源

    摘要:本文针对计算机科学与技术领域用户在科学研究和攻读学位方面的需求,推介一些常用中文电子资源,目的在于使专业人员了解信息社会电子信息资源检索与利用基本常识,提高学术电子信息资源的利用效率和科研工作效率。

    在信息社会中,信息对于不同的层面、职业和环境来说,都是十分重要资源,就某种意义来说,信息就是财富的代名词。因此,掌握获取信息资源的途径和方法,将成为现代人生存、工作和终生学习、进取的宝贵技能。

    过去人们读书学习、获取信息的场所主要是图书馆、办公室、书店等物理空间,随着计算机技术和网络技术的广泛应用,信息传播的介质和人们获取文献信息的手段发生了根本性的改变,超越时空的互联网络和一台联网的计算机终端就可以使用品种繁多的网络数据库、电子图书、电子期刊和多媒体光盘。这些数字化了的信息资源以其传递迅速、内容丰富、获取便利、检索功能强大的优势取代了传统的纸本文献,在现代信息管理技术和自动化网络化技术的支持下,为读者获取和利用文献信息提供了自主、互动和不受时空限制的知识平台,其水平和效益远远超过了传统的图书馆。

    本文针对计算机与技术学科领域用户的基本信息需求,对该领域电子信息资源的获取和利用方法做一入门介绍,以期为其开展科研教学和攻读学位提供有益的信息支持。

    一、 电子信息资源的表现形式

    电子信息资源是指以数字方式将图、文、声像等信息存储在磁、光、电介质上,通过计算机等设备阅读使用的资源,包括网络资源、数据库资源和电子出版物,常用的学术型电子信息资源主要指各类文献数据库(Database),也就是至少由一种文档(File)组成,能够满足特定目的或特定数据处理系统需要的大量数据的集合,其主要形式有:

     

    1.全文电子期刊数据库
    存储的是文献的原文信息,检索最终结果为文献原文。

     

    2.文摘索引数据库
    检索最终结果的书目、索引或文摘,仅提供文献线索,读者根据所提供的线索查找文献原文。

      3.电子图书数据库
    指完全在网络环境下编辑、出版、传播的图书以及印刷型图书的电子版,电子图书数据库还具有检索、借阅、目次浏览、打印、个性化标注等功能。
      4.免费网络资源数据库
    Internet作为全球最大的信息资源库,为计算机科学与技术领域的科研工作提供了良好的网络环境、方便的检索工具和大量的相关信息资源。其信息源许多来自权威学术团体、政府机构、科研院所的网站和一些著名的商业网站。采用搜索引擎通常能够获取到质量上乘、学术价值较高的免费网络信息资源。

    二、中文全文电子期刊数据库

    1.《中国期刊网》

    《中国期刊网》由清华大学中国学术期刊(光盘版)电子杂志社主办,按学科划分为理工A、理工B、理工C、农业、医药卫生、文史哲、经济政治与法律、教育与社会科学、电子技术与信息科学9个专辑,126个专题。根据不同文献层次,又划分为专题全文数据库、题录数据库两种。“专题全文数据库”收录1994年以来中国出版发行的5300种学术期刊全文,累积全文约620000万篇,检索结果为篇名、作者、机构、刊名、关键词、摘要、原文等。

    正式购买《中国期刊网》数据库的团体用户可通过局域网登陆该数据库网址http://www.edu.cnki.net免费检索《中国期刊网》的题录、专题全文数据库,并可进行下载及打印。显示、下载全文,检索前需先安装【CAJ全文浏览器】,该软件可直接从《中国期刊网》主页下载。在线用户数50。

    2.维普中文科技期刊全文数据库

    《维普中文科技期刊数据库》是目前国内最大的综合性全文数据库。收录范围:收录1989-1999年出版期刊7000种,2000年后出版期刊12000余种。学科范围覆盖理、工、农、医以及社会科学各专业。数据容量1989-1999年累积文献量400万篇。2000年以后每年出版文献90-100万篇。

    正式购买用户可直接登陆http://www.tydata.com或该数据库的镜像站点,注意使用前请先下载并安装维普全文浏览器,方可阅读全文。

    3.万方数据资源系统

    万方数据资源系统包括以下内容

      1)“商务信息子系统”:主要产品为《中国企业、公司及产品数据库》(CECDB)至今收录96个行业16余万家企业的详细信息。
     

    2)“科技信息子系统”:包含科技期刊以外的所有与科技期刊相关的二次文献数据库总记录1100多万条,分成台湾系列、商务与贸易、公共信息、科技文献、名人与机构、中外标准、成果专利7个小类,总计近90余种数据库。

      3)数字化期刊子系统”:采用HTML和PDF文件格式阅读,以刊物为单位,可以按刊浏览,目前已收录2500多种  科技类期刊,以核心刊物为主。收录科技部认可的1411种科技核心刊中的1360种,收齐率96%。
      4)中国学术会议论文全文数据库(PACC)
    《中国学术会议论文数据库》是国内唯一的学术会议文献全文数据库。国家级学会、协会、研究会组织召开 的全国性学术会议论文。每年涉及 600余个重要的学术会议,每年增补论文15000余篇。数据范围覆盖自然 科学,工程技术,农林,医学等所有领域的学术会议1890个,收录论文125008篇。学术会议全文数据库既可 从会议信息,也可以从论文信息进行查找,是了解国内学术动态必不可少的帮手。

    访问网址为:http://wanfang.calis.edu.cn。

    4.《中国优秀博硕士学位论文全文数据库》
     
    《中国优秀博硕士学位论文全文数据库》收录了2000年以来全国重点院校的3万余篇博硕士论文,它以"专 题数据库"的形式将各学科、各门类的论文分为122个专题,并按照《国务院学位办》公布的“培养硕、博研 究生的学科专业设置”思路,设计论文整合原则及相应的导航体系(细化到三级学科)。根据每篇论文所提供 的“专业代码”,将文献聚类到相应的子学科(子栏目)。

    访问网址:http://www.edu.cnki.net

    三、文摘索引数据库

    中国科学引文索引数据库(CSCI)

    《中国科学引文索引数据库》简称CSCI或CSCD,由中国科学院文献情报中心研制出版。2001年版收录我国出版的千余种中、英文重要科技核心期刊,专业覆盖数、理、化、农、林、医及工程技术各领域,年度更新。中国科学引文数据库功能如下:可查询专著、期刊论文、会议文献、专利和其它非正式出版物的被引用情况;可查询科技期刊被引情况;可查询论文发表情况:可查询专题文献。

    该数据库数据自1989年起,目前是单机光盘。

    四、电子图书数据库:

    方正Apabi电子图书

    方正Apabi电子图书是北大方正电子联合电子工业出版社、北京大学出版社、高等教育出版社等十几家出版社、中国数字图书馆、北京大学图书馆等多家图书馆,推出的完全属于自主版权的网络出版物,它是能够完美保留原来纸介书的字符、字体版式、色彩、图案等信息,是完全高保真的电子图书。

    Apabi为读者阅读eBOOK、领略电子书的无穷魅力开阔视界。Apabi中的五个字母A、p、a、b、i分别是Author、publisher、artery、buyer intemet第一个字母,分别代表作者、出版者、分销渠道、购买者和因特网,整合起来理解,即是指以网为纽带,将传统出版的供应链相互连接起来。

    访问网址http://www.apabi.com/ebookdown/index.htm注意使用前需下载专用浏览器并安装注册。

    随着自动化网络技术与现代信息管理技术的有机结合日臻完善,各学科领域的电子资源将会不断丰富,信息服务手段也将不断完善。本文在此仅起到抛砖引玉的作用,希望广大计算机科学与技术领域的用户能够节约用于查找资料方面的宝贵时间和精力,以最小的检索投入获取最多和最优的信息内容。

    06/09/2005

    硬盘的相关参数分析与常见误区

    硬盘的相关参数分析与常见误区

    类型:原创 作者:中关村在线 日期:2004-05-28 17:34:20




    硬盘的主要技术指标

        在我们平时选购硬盘时,经常会了解硬盘的一些参数,而且很多杂志的相关文章也对此进行了不少的解释。不过,很多情况下,这种介绍并不细致甚至会带有一些误导的成分。今天,我们就聊聊这方面的话题,希望能对硬盘选购者提供应有的帮助。

    首先,我们来了解一下硬盘的内部结构,它将有助于理解本文的相关内容。



        工作时,磁盘在中轴马达的带动下,高速旋转,而磁头臂在音圈马达的控制下,在磁盘上方进行径向的移动进行寻址

    硬盘常见的技术指标有以下几种:

    1、 每分钟转速(RPM,Revolutions Per Minute):这一指标代表了硬盘主轴马达(带动磁盘)的转速,比如5400RPM就代表该硬盘中的主轴转速为每分钟5400转。

    2、 平均寻道时间(Average Seek Time):如果没有特殊说明一般指读取时的寻道时间,单位为ms(毫秒)。这一指标的含义是指硬盘接到读/写指令后到磁头移到指定的磁道(应该是柱面,但对于具体磁头来说就是磁道)上方所需要的平均时间。除了平均寻道时间外,还有道间寻道时间(Track to Track或Cylinder Switch Time)与全程寻道时间(Full Track或Full Stroke),前者是指磁头从当前磁道上方移至相邻磁道上方所需的时间,后者是指磁头从最外(或最内)圈磁道上方移至最内(或最外)圈磁道上方所需的时间,基本上比平均寻道时间多一倍。出于实际的工作情况,我们一般只关心平均寻道时间。

    3、 平均潜伏期(Average Latency):这一指标是指当磁头移动到指定磁道后,要等多长时间指定的读/写扇区会移动到磁头下方(盘片是旋转的),盘片转得越快,潜伏期越短。平均潜伏期是指磁盘转动半圈所用的时间。显然,同一转速的硬盘的平均潜伏期是固定的。7200RPM时约为4.167ms,5400RPM时约为5.556ms。

    4、 平均访问时间(Average Access Time):又称平均存取时间,一般在厂商公布的规格中不会提供,这一般是测试成绩中的一项,其含义是指从读/写指令发出到第一笔数据读/写时所用的平均时间,包括了平均寻道时间、平均潜伏期与相关的内务操作时间(如指令处理),由于内务操作时间一般很短(一般在0.2ms左右),可忽略不计,所以平均访问时间可近似等于平均寻道时间+平均潜伏期,因而又称平均寻址时间。如果一个5400RPM硬盘的平均寻道时间是9ms,那么理论上它的平均访问时间就是14.556ms。

    5、 数据传输率(DTR ,Data Transfer Rate):单位为MB/s(兆字节每秒,又称MBPS)或Mbits/s(兆位每秒,又称Mbps)。DTR分为最大(Maximum)与持续(Sustained)两个指标,根据数据交接方的不同又分外部与内部数据传输率。内部DTR是指磁头与缓冲区之间的数据传输率,外部DTR是指缓冲区与主机(即内存)之间的数据传输率。外部DTR上限取决于硬盘的接口,目前流行的Ultra ATA-100接口即代表外部DTR最高理论值可达100MB/s,持续DTR则要看内部持续DTR的水平。内部DTR则是硬盘的真正数据传输能力,为充分发挥内部DTR,外部DTR理论值都会比内部DTR高,但内部DTR决定了外部DTR的实际表现。由于磁盘中最外圈的磁道最长,可以让磁头在单位时间内比内圈的磁道划过更多的扇区,所以磁头在最外圈时内部DTR最大,在最内圈时内部DTR最小。

    6、 缓冲区容量(Buffer Size):很多人也称之为缓存(Cache)容量,单位为MB。在一些厂商资料中还被写作Cache Buffer。缓冲区的基本要作用是平衡内部与外部的DTR。为了减少主机的等待时间,硬盘会将读取的资料先存入缓冲区,等全部读完或缓冲区填满后再以接口速率快速向主机发送。随着技术的发展,厂商们后来为SCSI硬盘缓冲区增加了缓存功能(这也是为什么笔者仍然坚持说其是缓冲区的原因)。这主要体现在三个方面:预取(Prefetch),实验表明在典型情况下,至少50%的读取操作是连续读取。预取功能简单地说就是硬盘“私自”扩大读取范围,在缓冲区向主机发送指定扇区数据(即磁头已经读完指定扇区)之后,磁头接着读取相邻的若干个扇区数据并送入缓冲区,如果后面的读操作正好指向已预取的相邻扇区,即从缓冲区中读取而不用磁头再寻址,提高了访问速度。写缓存(Write Cache),通常情况下在写入操作时,也是先将数据写入缓冲区再发送到磁头,等磁头写入完毕后再报告主机写入完毕,主机才开始处理下一任务。具备写缓存的硬盘则在数据写入缓区后即向主机报告写入完毕,让主机提前“解放”处理其他事务(剩下的磁头写入操作主机不用等待),提高了整体效率。为了进一步提高效能,现在的厂商基本都应用了分段式缓存技术(Multiple Segment Cache),将缓冲区划分成多个小块,存储不同的写入数据,而不必为小数据浪费整个缓冲区空间,同时还可以等所有段写满后统一写入,性能更好。读缓存(Read Cache),将读取过的数据暂时保存在缓冲区中,如果主机再次需要时可直接从缓冲区提供,加快速度。读缓存同样也可以利用分段技术,存储多个互不相干的数据块,缓存多个已读数据,进一步提高缓存命中率。

    这是我们经常能看到的硬盘参数指标,正确理解它们的含义无疑对选购是有帮助的

    7、 噪音与温度(Noise & Temperature):这两个属于非性能指标。对于噪音,以前厂商们并不在意,但从2000年开始,出于市场的需要(比如OEM厂商希望生产更安静的电脑以增加卖点)厂商通过各种手段来降低硬盘的工作噪音,ATA-5规范第三版也加入了自动声学(噪音)管理子集(AAM,Automatic Acoustic Management),因此目前的所有新硬盘都支持AAM功能。硬盘的噪音主要来源于主轴马达与音圈马达,降噪也是从这两点入手(盘片的增多也会增加噪音,但这没有办法)。除了AAM外,厂商的努力在上文的厂商介绍中已经讲到,在此就不多说了。至于热量,其实每个厂商都有自己的标准,并声称硬盘的表现是他们预料之中的,完全在安全范围之内,没有问题。这一点倒的是不用担心,不过关键在于硬盘是机箱中的一个组成部分,它的高热会提高机箱的整体温度,也许硬盘本身没事,但可能周围的配件却经受不了,别的不说,如果是两个高热的硬盘安装得很紧密,那么它还能承受近乎于双倍的热量吗?所以硬盘的热量仍需厂商们注意。

    对硬盘认识的常见误区(一)

    1、 转速与寻道时间:

        现在不少人都认为硬盘转速越快寻道时间就越快,但这是最常见的错误认识,事实上寻道速度根本不决定于转速,因为两者的控制设备就不一样。转速是由主轴马达控制,寻道则由音圈马达控制。寻道时间说白了就是体现了磁头臂径向运动的速度与控制能力,音圈马达与相应的伺服系统起着重要作用。另外,磁头的高灵敏度也有助于在高密度磁盘上准确捕获伺服标记,进而快速定位。很多情况下,我们都可以看到5400RPM硬盘的寻道时间与7200RPM硬盘一样(如三星的V40与P40)。之所以有些高速硬盘(如SCSI硬盘)的寻道时间更快,是因为厂商的有意设计,就好像一台Pentium4电脑只配32MB内存让人觉得不平衡一样,厂商也会给高速硬盘配上更快的寻道时间(也意味着更好的元件与更高的成本,显然厂商要根据市场的需要权衡利弊)。实际上,通过上文有关平均访问时间的解释,大家应该明白,提高转速的主用意就是减少平均潜伏期,进而加快整体的访问速度,也许很多人不认同这是它最重要的用意,由此就又引出了下一个误区。

    2、 转速与数据传输率:

        在很多人的印象和厂商的宣传中,更高的转速的主要用意在于提高数据传输率,但这并不正确。持续数据传输率决定于很多指标,并不光只是转速。当然,有人会说转速更高,磁头单位时间划过的扇区就越多,不错,但前提是线密度一样。线密度可理解为每磁道扇区数(SPT,Sectors Per Track)。低速硬盘完全可以通过提高SPT来加大数据传输率, SCSI硬盘就是追求SPT的典型。事实上,很多厂商在相同单碟容量上对于不同的转速采用了不同的SPT设计,如金钻七的最外圈磁道扇区数为837个,而星钻三代则为896个。有人可能会问,那如何保证容量一致呢?这就涉及到每英寸磁道数(TPI,Tracks Per Inch),它代表了磁道密度。SPT高则TPI就会相应减少,如金钻七为60000TPI,星钻三代则是57000TPI。本次测试最典型的例子是Caviar系列硬盘,WinBench测得的数据传输率与某些7200RPM产品相当。虽然我没有该系列硬盘最外圈SPT资料,但肯定不会低于1000(若转速实为5400RPM),即使转速真的是6000RPM,也在900之上。因此5400RPM硬盘完全可以通过提高33%(7200RPM比5400RPM转速高33%)的SPT来得到相同的数据传输率。

        综上所述,7200RPM相对于5400RPM硬盘的最大优势就在于更短的平均潜伏期,进而减少平均访问时间。毕竟转速是死的,5400RPM永远处于劣势。

    3、 真正的内部数据传输率:

        随着硬盘知识的普及,硬盘DTR这一指标也逐渐被人们所认识,但又出现了新的误区——拿以Mbps为单位的最高内部DTR说事,这其中某些厂商与所谓高手的误导有着不可推卸的责任,后果也是相当严重。由于内部DTR决定了硬盘的实际数据传输性能,所以很多人都在关心硬盘的内部DTR,而厂商也投其所好,在产品资料中基本都公布了最大内部传输率,但多是以Mbps为单位,不少人因此拿这个数值来预测硬盘的性能,甚至分析到接口速率的瓶颈(这些人通常将其换算成MBPS,而目前最高的数值将近80MBPS,离Ultra ATA-100的最大速率已相差不远了)。但是,它恰恰不能通过除8来换算成MBPS,因为这个数值是磁头处理二进制0/1信号(即bit)的纯理论性能,而磁头处理的信号很大部分并不是用户需要的数据(存入的数据都是经过编码的,包含许多辅助信息),因此不能以字节为单位。很多硬盘这一数值都是相当高的,如以前的富士通硬盘,指标很好,但实际性能却是另一码事。完全可以说,这个Mbps值没有什么实际价值,给人的是一种假象。

        在硬盘中,真正重要的是内部持续DTR,它分为单磁道瞬间DTR与持续DTR两个指标,单磁道瞬间DTR的计算公式是“512字节×SPT×磁盘每秒所转圈数”或“512字节×SPT÷磁盘转一圈所用时间”,由于磁盘转一圈所用时间一般不能除尽,所以经常用前一种公式。持续DTR的计算公式则为“512字节×SPT×磁头数/总耗时”,其中“总耗时=(磁头数-1)×磁头切换时间+道间寻道时间+磁头数×磁盘转一圈的时间”。磁头切换时间一般在产品的用户手册中有标注,大约在1ms左右。单磁道瞬间DTR表明了硬盘实际上所能达到的最大内部DTR,持续DTR则体现了硬盘真正的数据传输能力。很遗憾的是,目前只有迈拓和IBM提供了内部持续DTR数据,其他厂商仍然用Mbps数值迷惑普通大众。但是,厂商心里是明白的,他们自己也不会混淆概念(只是没事偷着乐),在数据的说法上也是非常严谨,如果你哪天发现厂商公布的内部DTR使用了MB/s为单位,那么这很可能就是我们所真正需要的数据,而不要再用Mbps去除8了。


    IBM 120GXP的技术资料,其中有两个内部DTR,我们只需关心第二个

    4、 缓冲区容量与性能:

         上文说过内部DTR决定了外部DTR的实际表现,但为了将内部DTR对外部DTR的影响降至最低,产生了缓冲区设计。理论上讲,缓冲区越大,即使内部DTR不变,硬盘的性能也会更好,这就好比CPU中的缓存一样。不过,要做到缓冲区容量的增加并提高性能还是有一定难度的。这主要体现在缓存功能管理与数据安全两个方面。缓存功能管理决定了缓冲区智能化与缓存效果,简单的说就是一种管理算法与替换策略,负责这一任务的就是缓存控制器。上文已经讲到目前都将缓冲区做分段处理,并且是动态的,根据数据流情况自动划分。以120GXP为例,在读操作时可最多划分12个数据段(平均容量约155KB),在写操作时数据段可高达52个(平均容量约35KB)。那么怎么去动态的划分区段,怎么去选择最不常用的区段以替换成新的数据,都将影响最终的性能表现。比如区段划分不合理将影响缓冲区空间的利用率和预读效果,数据替换不合理将影响缓存命中率,这样一来说不定与小容量缓冲区性能差不多。讲到这,大家肯定会想到了CPU缓存的算法(比如N路级联与更新策略等),的确两者有相同之处。对于更大容量的缓冲区,肯定就不能照搬小容量缓冲区的缓存管理算法。因此,缓冲区越大性能越好是有前提的,这对厂商的缓存管理技术水平提出了更高的要求。

        大容量缓冲区的数据安全性主要是指在突然断电的情况下,缓冲区中的待写数据将如何处理的问题。这方面笔记本电脑硬盘就有了得天独厚的优势,因为有电池为后盾,笔记本电脑硬盘的缓冲区容量已经提升到了16MB。但对于台式机,这是个不小的考验。WD公司在这方面做出了有意义的探索,主要方法是通过将数据暂时保存在最外圈暂存区(因为最外圈的写入速度最快),下次开机再写入原目的地址的方法来保证缓冲区中待写数据的安全,显然这需要特殊的管理机制,也是厂商的自由发挥了。

        最后我们再谈谈目前普遍流行的说法——大容量缓冲区对零散数据非常有利,这是很片面的认识。当然,这种说法可以理解,也没有什么根本性错误,但容易误导人们对大容量缓冲区的认识。从分段式缓存结构可以看出,更大的缓冲区理论上可以划分出更多的数据段,能容纳更多的互不相干的小数据块。而这种随机的、不连贯的、小数据量的读取行为在Web服务、数据库服务与日常办公应用中很常见。如在Web服务中,经常出现对一个网页同时有多个请求的情况,而一个网页的大小也就是几十到几百KB的容量,如果缓冲区能缓存更多的页面,那么服务器的表现也会越好。因此大容量缓冲区在这方面的贡献,我们完全肯定。但另一方面,对于大容量,连续读写的数据操作,大容量缓冲区同样能发挥重要的作用。更大的缓冲区此时意味可一次缓冲更多的数据(硬盘会根据数据量将区段合并),即能在相同的时间内向主机或磁头发送更多的数据,而磁头的连续读写扇区的能力更容易发挥。所以,在音频、视频处理等经常用到大数据量连续读写的场合,大容量缓冲区硬盘是最佳之选。在下面的测试中,大家也会发现8MB缓冲区硬盘相对于2MB缓冲区硬盘的整体优势。

    对硬盘认识的常见误区(二)

    5、 SCSI与IDE的性能:

        在WD1000JB推出时,有些读者就根据其与低端SCSI硬盘的对比测试数据,曲解原文的用意发表了IDE硬盘性能已经可与SCSI硬盘相抗衡的看法,这显然是一种误导。在测试原文中与WD1000JB做对比的是希捷早期万转SCSI硬盘——Cheetah 36XL。单碟容量为9GB,不到1000JB单碟容量的1/3,缓冲区容量为4MB,而WD1000JB则是8MB,但两者的持续传输率基本一致,因此有一定可比性。原文将当时最高配置的IDE硬盘与较低配置的SCSI硬盘作对比的主要用意在于证明8MB缓冲区的作用,并通过测试表明在此情况下最高端IDE的性能完全可以与低端SCSI一争高低,而不是给“IDE性能可与SCSI对抗”这一笼统的错误说法提供论据,因为这种比较是有条件的。从测试成绩上看,Cheetah 36XL全面落后,但这是在单盘情况下。而随着硬盘数量的增多,SCSI共享数据通道的优势将逐渐体现,此时就不是IDE硬盘可比的了,即使你接满4块IDE硬盘也于事无补,况且随着更高单碟容量(如18GB)的万转SCSI与15000转SCSI硬盘的普及,IDE的单盘优势也不明显了。所以SCSI与IDE根本就针对着不同的市场与操作应用。做对比测试的原作者也只是借WD1000JB证明,目前最高端IDE硬盘完全可以在负荷不很繁重的中低端单盘工作站市场一展身手,而不是全面冲击SCSI硬盘,这一点一定要认清楚,不要误解原文作者的用意。

    6、 总容量与性能:

        如果单碟容量相同,那么总容量的不同就意味着磁头数量(即数据面数,一张磁盘有两个数据面,但有时只用一个,而一个数据面对应一个磁头)的不同,这其中会与性能有什么关系呢?由此就要联系到柱面这一概念,柱面是指硬盘中每张磁盘上编号(位置)相同的磁道集合,硬盘操作时,是从最外圈柱面开始,当该柱面所有磁道用完后,再移至内圈的下一个柱面,而不是先存完一张盘再存一张盘。同系列的硬盘的柱面数是一样的,但每个柱面包含的磁道数要因磁头数而异,计算公式为:磁道数=磁头数×柱面数。如迈拓D740X,20GB型号由于只有一个磁头,所以一个柱面的容量是一个磁道,而80GB型号则是4个磁头,一个柱面的容量就是4个磁道。以最外圈柱面为例,D740X是外圈磁道是837个扇区,按每扇区512字节计算,20GB型号的最外圈柱面的容量为418.5KB, 80GB型号的最外圈柱面容量为1674KB 。也就是说如果连续存储500KB的数据,20GB就要移动磁头进行道间寻道了,但80GB的还不会,只是存在同一柱面内磁头切换的延迟。大家可以这么认为,80GB型号中一个柱面相当于20GB型号中的4个柱面,而同一柱面内的磁道切换速度通常要快于柱面间的切换,对保持数据传输率更为有利。


     

    柱面示意图

        由此,很多人可能得出结论,同一产品系列中,磁头数越多的型号的连续读写性能越好(如果是零散读写根本不受柱面容量的影响)。这个说法基本正确,但是有忽略的地方。首先,目前的硬盘都采用了区域数据记录,在同一区域内,每磁道扇区数固定,比如D740X分为15个数据区(最外圈还有一个但用于存储系统数据,可不计),最外圈数据区中有2582个柱面,这些柱面的扇区数是相同的,所以即使是20GB型号,也只会在存满1.03GB左右的数据后才转入下一个SPT更少的数据区。而且也有柱面切换速度比磁头切换快的硬盘,D740X就是,因此在这头1个GB的数据区中,80GB的D740X型号性能也许更差。但我们一般使用硬盘都要分区,C盘大概在5-10GB左右,此时20GB的型号已用到了第4个数据区,而10GB的容量在80GB型号中还没有超出第二个数据区,因此就这个分区的整体性能而言,80GB的显然要占优势。从WinBench的硬盘传输率曲线上就能看出这一点, 80GB型号的最高传输率范围覆盖了更多的空间。不过,上面的对比是较极端的,如果是40GB与60GB的型号去对比就不会这么明显,可以说磁头数相差如果在3个以内,性能的差距将非常微弱,但对有的硬盘,即使磁头数相差3个也基本不会有什么差距。

        上为D740X-80GB型号的DTR曲线图,下为D740X-40GB型号的DTR曲线图,以10GB容量为界,可发现40GB型号已经用到了DTR更低的第三个数据区,而80GB型号仍处在DTR更高的第二个数据区,理论性能要强于40GB型号

        现在再让我们看看另一个例子——酷鱼四,从曲线图上可以看出其第一个数据区占据了1/3多的柱面,也就是说即使是20GB的酷鱼四,在前10GB容量的性能不见得就比80GB的型号差。所以,具体的差别除了要看磁头相差数量还要看数据区的设置。另外,在产品的生产过程中,厂商可能随时进行改进(不仅指Firmware,还包括元件的优化与改良等),往往会出现新的产品比老产品性能更好的情况,比如WD的CaviarXL系列,评测的1200BB是2001年9月的产品(10月才发布单碟40GB的CaviarXL系列),800BB与400BB都是今年一月和二月的产品(Firmware版本没变),后两者的表现与1200BB相比并无劣势。而IBM则为不同磁头数的型号开发了不同版本的Firmware,使得各型号的性能表现都趋于一致。因此,影响容量与性能的可变因素很多。

        上为酷鱼四-60GB型号的DTR曲线图,下为酷鱼四-80GB型号的DTR曲线图,即使以20GB容量为界,可发现60GB型号仍在DTR最高的第一个数据区,理论上性能和80GB型号一样

        不过,在一些测试中,最大容量型号的表现基本都很出色,有的大容量5400RPM的性能甚至好过一些小容量的7200RPM硬盘。

    7、 FDB的作用:

        FDB马达对于很多人来说是比较新鲜的,在很多公司的宣传中,FDB的作用被定为减少噪音与热量,甚至能提高性能。这么说似乎有道理,但容易产生误导。BB轴承使用圆形滚珠(材料可为金属或陶瓷)作为主轴与基座之间的运动连接/支撑体,由于滚珠加工精确度产生的必然差异,在主轴高速运转中,滚珠之间会发生碰撞而振动,这就是马达(主轴)噪音的主要根源(其他原因还包括轴承装配精度与力矩的平衡),FDB则使用了液态润滑物质代替滚珠,这样就完全消除了因碰撞产生的噪音。但是,主轴的噪音在硬盘整体噪音中的强度比重较小,而且人耳对其远不如音圈马达寻道噪音敏感(因为频率较低),所以FDB的减噪功能确切的说只有在硬盘空闲时(磁盘空转,磁头不寻址)才能体现。另外,对于热量,滚珠之间磨擦肯定是一个热源,但这与马达电机相比也不算什么,而且FDB的效率往往并不如BB,马达功耗可能会更大。第一块使用FDB的IDE硬盘——希捷的“大灰熊”,其热量之高想必是很多老玩家记忆犹新的,而且即使是不用滚珠的音圈马达的热量也很高。因此主轴马达的主要热源并不在轴承。我们在测试中也发现,现阶段FDB并没有体现出对BB的降热优势。

        综上所述,大家要对FDB有一个客观的认识,不能盲目听信宣传,认为FDB肯定比BB好(毕竟转速是固定的,性能不会改变)。至少在目前,FDB并没有多大优势,这可能也是为什么IBM与WD仍没有使用FDB的一大原因。

    8、 怎么测试硬盘:

        看过不少的硬盘横向测试,虽然使用的软件都一样,但其中的测试方法实在不敢认同。硬盘测试有两个方面,一是硬盘本身的性能,另一个是硬盘对整机性能的影响。对于前者,很多测试人员将被测硬盘也当作是系统硬盘,也划出成多个分区。虽然比较符合实际的应用,但不能真正反映硬盘的性能,而真正符合实际应用的测试并不在于硬盘的单独测试上。事实上,最合理的硬盘单独测试方法是,操作系统与测试软件装在另一个硬盘上,被测硬盘单独接在一个硬盘接口,接下来就是分区,此时必须要将全部容量分成一个区才能体现硬盘的综合性能。现在最常用也是最好用的硬盘测试软件WinBench99就是以分区大小来确定测试区域的,包括DTR、访问时间、应用模拟测试等,在DTR测试中以分区的最外圈磁道开始到分区的最内圈磁道终止,所以如果只用头10GB的容量为一个分区,那么测出来的就是这10GB之内的DTR而不是整个硬盘的,这也是为什么有些数据中,结束端比起始端的数值还要高的原因(如果分区容量没有超出数据区,那么很容易因为误差产生这种结果)。另外,如果测试区域很小,则磁头寻道的时间也会限制在更低的范围内(因为寻道的范围也小了),同样有利于得高分,类似的影响也体现在商业与高端测试中。所以,硬盘单独测试时必须进行全分区!至于用什么样的文件系统就不是很重要了,不过FAT32的得分一般都比NTFS的高,但如果测试条件统一,那么都是有说服力的,成绩排名也不会因为文件系统的改变而改变。

        现在再说说整机测试。虽然是硬盘横向测试,但要想知道哪个硬盘对整机性能提升最大,就必须动用Winstone系列软件来进行对比测试了,这可以说是对硬盘的性能终极考试,因为WinBench99相对简单,也不是很全面,更容易被厂商钻空,而Winstone就不一样了,硬盘只是其中的一个子系统,但它也会影响最终的成绩。遗憾的是很多硬盘横向测试中都没有这一项,只是简单的跑跑WinBech99就完了。Winstone测试就要在接近真实使用情况的设置下进行,此时就不能用全分区了,因为现实中很少有人这么做。而测试一般都在被测硬盘的C区,所以容量通常为5-10GB。当然,也可以进行全分区的整机测试,这就取决于测试人员自己的决定了。

        在经过正确的硬盘单独与整机测试后,我们就能对被测产品性能有一个比较全面的认识和客观的评价了。

        好啦,有关硬盘的相关常识今天就先讲到这,在日后本站的硬盘测试中,还将陆续向大家介绍相关的硬盘技术与知识,敬请大家密切留意本站的动态。

    08/08/2005

    什么是Cairo?

    Cairo,过去叫做Xr或Xr/Xc,是一个跨平台的开放源代码的矢量图形函数库,可以提供高质量的显示和打印输出。通过Glitz函数库, Cairo 能使用 OpenGL或X Render扩展的硬件加速功能来绘制图像,这使得基于Cairo的应用能在现代化的3D显示硬件上获得益处。

    Cairo提供一个稳定的用户层API,它可以提供现代化的图形处理管理能力,如绘制和填充,映射转换,合成(注意,是合成)与改变alpha半透明图像,高真文本显示等等。能够在不同的媒体上实现相同的输出。

    其实更早关于Cairo人们关注的还是Gtk/Gnome的进展,我们可以在 Gnome中国 上看到对Cairo应用前景的展望,可以看到,Cairo应用可以实现的东西是激动人心的。

    Cairo拥有多种不同的后端,能够支持多种输出设备。现在所支持的后端包括:

    图像:以内存图像缓冲区(in-memory image buffers)为目标。该图像缓冲区可被保存成文件,或者其数据可以被不具有本地后端的图形系统调用。

    gl: 通过 glitz库(http://www.freedesktop.org/Software…制图像。包括GLX 和 AGL (分别为Unix和苹果的标准)。

    png: 这个后端使用图像后端来生成png图像文件。

    ps: 生成一个PostScript文件,适合高质量打印输出。现在ps后端生成点阵内容,连接图像后端。

    xlib: 使用X Window的xlib接口,以Windows 或 Pixmaps 为目标。Render扩展可用,但不必需。

    xcb: 和xlib相似,但使用XCB(http://freedesktop.org/Software/xcb)接口。

    还有其他一些后端正在开发中:

    pdf

    svg

    quartz——MacOS的后端(http://cairographics.org/QuartzBackend

    win32——Windows GDI 后端(http://cairographics.org/win32