第一章 海量网络存储系统概述

更新时间:2024-05-12 15:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1章 存储系统设计原理

自从5000年以前,埃及人把象形文字记录在石牌上面开始,人类可以通过记录有文字的载体把思想从一个人告诉给另一个人,从一代人传递给下一代人。无数的壁画、石碑、甲骨、竹简等记录了无数的故事和传说,人类的文明通过这种方式,经过无数人知识和经验的积累和世代传承逐渐发展壮大。纸张的出现、印刷技术的发明使得承载各种知识的文明之火熊熊燃烧并迅猛传播开去。

60多年前,计算机系统的出现,人类纪录知识和信息的方式摆脱了纸张的约束,以数字方式存放在计算机系统之中,这一过程并得到不断的深化和发展,直到有一天人类突然发现通过网络互联的计算机系统取代了充满藏书的图书馆成为知识和信息存储和传播的主体;无数电子设备(数字摄像机、数字照相机等)可以无时无刻纪录人类身边的每一个变化取代了书斋中的作者以优雅的文字辛勤地纪录身边的历史;敲几下键盘、点几下鼠标获取所需的信息取代了辛苦的大量翻阅。计算机存储系统成为无数知识和信息的最主要载体,同时也是社会正常运转不可或缺的重要保证。

1.1 应用需求

新的信息和网络时代对现代存储的要求使得存储技术正经历着革命性的发展。依托于计算机技术发展的信息革命就是不断把各种人类活动过程数字化,并通过各种不同的计算机系统对于这些数字化信息进行存储、传输和处理。

60多年前,第一代计算机ENIAC每秒5000次加法或400次乘法操作的处理速度仅需要100字磁芯存储容量;而当前一张3600*2700分辨率的数码照片压缩后的大小大约为4MB,一部1920*1080(HDTV)画质电影需要大约20GB的存储容量和3MB/s的I/O持续数据传输率,与此同时许多应用程序对于I/O的响应时间也有了严格的要求,例如许多SLA(Server-Level Agreement)应用(例如银行和网站)对于I/O请求的响应时间有了严格的规定。正是这种不断增长的应用需求推动着存储系统从小到大,从慢到快,从简单到复杂,并对存储系统的健壮性、可用性、安全性和管理性提出了更高的要求。

一个有意思的现象是整体而言数字化发展过程大体上正比于当前的数字化程度,从这个结论很容易推导出整体数字化过程具有指数增长的特征。这产生一个值得探究的问题:这种发展速度背后的推动力是什么?一个直接的原因归功于科学技术的发展,而任何一个技术的发展速度又依赖于当前技术的发展水平和对于新技术的期望程度(事实上就是开发这种新技术的投入,包括人力在内的各种投入力度,这也反映对这种新技术的需求)。显然存储系统的发展符合上述观察,大容量高性能的存储系统满足了当前应用的要求同时也导致更多对于存储系统有更高要求的应用产生。一个例子就是google搜索平台推进了大规模集群存储的发展,而大规模集群存储系统的发展促进了云存储的需求。

1.1.1 数据量增长

存储系统革命性变化首先表现为其容量的急剧膨胀。根据权威机构国际数据公司(International Data Corp.,IDC)最新的研究报告《数字宇宙膨胀:到2010年全球信息

增长预测》中统计的数据,2006年全球每年制造、复制出的数字信息量共计1610亿GB,而人类开始记录历史以来,到2006年为止全部的书本文字加起来大约50PB,显然当年信息产生量大约是图书信息总量的300万倍。如果将书籍排列起来,总长度为地球到太阳距离(约1.5亿公里)的12倍。IDC报告同时显示,至2010年,这个数字将猛增到6倍,达9880亿GB,年复合增长率为57%。当前,AT&T的网络每天流动16PB的数据,Goolge 每天处理20PB的数据,Facebook每天存储1PB的照片,Opera浏览器每个月处理多于1PB的数据,而BBC的iPlayer每个月有大约7PB的数据流,Youtube存储了31PB的流媒体数据。Cisco估计到2012年每个月网络上视频流大约为5Exabytes(5000PB)。

摩尔定律断言CPU的处理速度每18个月增加一倍,同样通过若干年的观察发现网络带宽和存储容量增长也都具有指数增长的规律。图灵奖获得者Jim Gray提出了一个新的经验定律:网络环境下每18个月产生的数据量等于有史以来数据量之和。至少到目前为止,数据量的增长基本满足这个规律。

在数字化和网络互联环境中,数据信息膨胀的具体表现为: 1. 比特流的无限蔓延,电子数据无处不在; 2. 数据就绪时间的延展:过去的信息系统基本上都有后台作业时间,而今天的信息系

统却要求网络数据每周7×24小时时刻处于就绪状态; 3. 数据存储的结构产生了巨大的变化:在信息孤岛时代,存储设备基本上是与封闭的、

特定的计算机系统对应,而在网络互联时代,数据是跨系统、跨部门、甚至是面向全世界用户的。除去安全性要求,数据的存取不再受到时间或者空间约束;

4. 数据类型的多样化:基于文本或者固定结构的数据曾经是计算机处理的主要对象,

而当前数据类型极其丰富,特别是具有不同结构的多媒体数据层出不穷。 设计新型存储系统以满足海量数据存取的要求成为一种必然的要求。当然海量数据本身就是一个具有相对性的概念,20年前1GB就是海量数据,10年前1TB也可以称得上海量数据,而当前1PB的系统也并不少见。 虽然在这期间作为主流存储介质的磁盘系统的容量也不断的增加,但一般海量存储系统的容量大约是主流单个磁盘容量的1000倍以上,这必须通过系统的方法构建海量存储系统以满足数据容量的要求。因此在本书中讨论的海量存储系统并不限定于一个绝对的容量,而是重点讨论通过特定的系统结构增加整体的存储容量和性能。

1.1.2 数据的价值

与数据量增长相适应的是数据已成为人类最宝贵的财富之一。人们在日常生活和工作中越来越依赖于信息技术,越来越多的重要数据被存储在计算机系统中,这在很大程度上促进了信息和数据管理的自动化,提高了工作效率。对于个人来说,最典型的数据可能是数日撰写的文稿,也可能是数月辛苦下载的多款游戏和数百集的珍藏电视剧,还可能是数年积累的珍贵的摄影照片或家庭摄像作品。对于公司和企业用户,信息系统的使用提高了企业事务处理和业务运行的效率,用户需求可以得到方便快捷的响应。尤其在金融、通讯、交通等行业中,信息系统中保存的可能是非常重要的商业机密,也可能是大量的设计资料和财务数据,还可能是集团公司庞大的人力资源数据库等。因此,企业对信息系统的依赖性已经到了关系企业存亡的程度。

数据的价值如此宝贵,一旦数据发生丢失或损坏,会给个人和企业都带来不可估量的损失。对于个人用户,数据丢失将会给个人带来精神和物质的双重损失;对于企业和公司,一旦信息系统发生故障导致数据丢失并且不能得到及时恢复,其造成的损失可能是毁灭性的。根据IDC调查,美国在2000年以前的10年间发生过数据灾难的公司中,55%当即倒闭,29%在两年内倒闭,生存下来的仅占16%。在类似的大量调查报告中也表明,大约40%左右的企

业在遭遇数据灾难之后没有恢复运营,由于缺少远程备份以及有效的数据恢复技术,剩下的也有1/3在两年内破产。每500个数据中心中,就有1个每年要经历一次灾难。

数据恢复的及时性成为企业兴衰成败的关键所在。一项来自美国明尼苏达大学的研究报告显示,在灾害之后,如果无法在14 天内恢复资讯作业,有75%的公司业务会完全停顿,43%再也无法重新开业,因而有20%的企业在两年之内被迫宣告破产。另一方面,对于灾害所造成的冲击分析显示,各行业最长可忍受的信息系统停机时间分别为:金融业2天、销售业3.3天、制造业4.9天、保险业5.6天。平均来看,一般行业可忍受的信息系统停机时间为4.8天。

人们对于数据价值的日益重视也极大地推动着存储系统发展,大量的提升存储系统安全和可靠的技术不断产生并应用于现实系统之中。

1.2 计算机存储系统概述

应用推进了存储系统的发展,这使得我们有必要对计算机存储系统的内涵和外延进行全面的分析,进而为设计新型存储系统提供更加清晰的思路。

1.2.1 计算机存储系统

现代计算机以图灵机为基本计算模型,以冯.偌依曼的“存储程序式计算机”为基本实现模型。其对于数据处理依赖于数据存取的过程,表现在两个方面,首先数据计算部件和数据存储是分开的,只有在需要时处理器才按照指令要求把所需的数据从存储设备读入处理器内部寄存器进行处理,在运算完成后把无需立即使用的数据写回存储设备进行保存;另一方面,所有的程序也是以数据的形式存放在存储器上,在执行时把每条指令依次读到处理器执行。

计算机存储系统是用来保存数据,并能够按照用户请求提供相应数据的部件、设备和计算机系统。事实上存储设备在本质上也是一种计算机系统,例如内存条本身也具有计算部件和寄存器。

在计算机系统中存储系统具有层次性的结构,存储系统根据和CPU的距离可分为多个层次,每层存储器的数据存取时间、数据传输带宽和容量是不同的。第0层一般是指处理器内部的寄存器组和一级、二级cache,第一层是指主板上的cache和随机存储器,这两层构成第一级存储,也被习惯称为主存储器。CPU可以通过指令直接访问主存储器中的数据。第二层是外存储器,相对于主存储器,二级存储系统不能直接被CPU访问,必须通过输入/输出(I/O,Input/Output)通道进行存取并且提供大容量和非遗失的数据存储能力,典型的二级存储设备就是磁盘。第三级存储往往通过mount和dismount操作连接到计算机系统中,它们具有离线存储的特征,典型第三级存储设备是磁带库。

广义的存储设备包括CPU中的寄存器、多级Cache、内存和外部存储系统。前者也称为内存系统(Memory System),而后者称为存储系统(Storage System)。狭义的存储系统通常就是仅仅指外部存储系统。在本书中如果没有特别说明,存储系统就指外部存储系统。相对于内存系统,存储系统必须提供大容量和非遗失的数据存储能力,非遗失性使得存储系统在掉电或者断连主机的情况下能够正确的保存数据。

存储网络的出现,使得存储的层次更加复杂,一个远地存储系统可以为主机提供存储服务,极大地扩充主机可以使用的存储空间,但同时引入了存储空间管理的复杂性。因为每个存储设备总是要提供相应的存储空间供系统存取数据,必须把这些独立的、基础的物理存储空间构成统一使用的逻辑存储空间,这也是存储虚拟化所做的工作,但随着数据存储系统中

存储设备和存储层次的增加,这种统一过程的复杂度和难度也相应地增加。

以二进制形式存在的比特数据是计算机系统处理的基本对象,文字、数字、图像、声音和其他各种形式的信息被转化为比特。计算机本质上就是对数据的存储和运算。为了使得计算机能够方便得到数据的存储地址,存储设备必须能够提供数字地址空间,使得处理器通过计算地址读取所需数据或者存放结果数据到相应的存储位置。也就是存储器中的地址信息也是以数字的形式编址的。另一方面使用以数字标识的逻辑地址空间可以有效屏蔽底层存储设备的差异,例如磁盘和光盘在物理结构和存储原理上有很大的不同,但都能够提供寻址空间供计算机存取数据。也就是地址信息作为一种数据和其他的数据是同构的,计算机可以统一处理,这就为间接寻址提供了可能。其中线性编址是最简单的存储空间组织方式,也是计算机最容易理解和处理的。作为主要的存储设备,内存和磁盘都是通过提供线性的存储空间供计算机进行数据存储的。

间接寻址可以产生层次性存储结构。寻址方式可以通过执行特定的程序产生更多变化,文件系统本质上也完成了寻址功能。在现代计算机层次性存储结构中,各层的存储容量有很大的不同。Cache以KB为单位,内存以MB为单位,而磁盘等存储设备是以GB为单位,海量存储系统是以TB为单位。在内存中存取数据的最小单位是机器位长,而磁盘中存取数据的最小单位是数据块,都是线性编址。磁盘等块设备是以LBA的形式提供线性地址的,网络存储系统一般提供数据块和文件两种操作接口。

网络存储系统出现和发展以前,存储系统主要为单个计算机系统提供存放数据的功能,由于存取过程的指令通过CPU发出,因此存储子系统往往依附于CPU和内存子系统为核心的主机系统,提供低速、大容量(相对于内存系统而言)和非遗失的基本存储功能,其数据整个存取过程基本上由主机的操作系统控制,这种存储系统称之为DAS结构(Direct-Attached Storage)。事实上,在这种结构中存储系统数据管理和组织功能由本机操作系统实现。在使用存储系统方面也分为两种方式,一种是存储子系统作为层次内存结构的第三级载体,实现和内存交换页的虚拟内存器功能,页的大小是固定的,虚拟内存模块通过在磁盘上开辟一段连续空间保存置换出内存的页;另一种方式就是通过文件系统管理和存取磁盘系统上的数据,其基本方式是通过文件目录树的方式组织数据,而文件通过相应的文件分配表记录数据在磁盘上的物理存放。

数据量的大幅增长对于存储系统设计带来新的挑战,第一,需要更多的存储设备存放不断增加的数据;第二需要在多个用户之间共享数据,以提高存储系统的利用率;第三,海量数据管理的复杂性必须占用相应服务器的大部分处理能力,这三方面的需求推动独立于单个主机的存储系统的出现。在充分吸收网络技术的基础上,具有大容量、可共享和可扩展的网络存储系统应运而生。这种存储系统具有高性能的处理部件、高速的内外部传输部件和大容量、可扩展的存储能力,事实上它已经成为提供大容量数据存储服务的独立计算机系统。

存储系统虽然在过去几十年内无论在功能还是在规模方面都有了极大的发展,计算机存储系统最为基本的功能依然是保存数据,并提供存取数据的操作集。存储系统通过存储介质存放数据,每种存储介质有其自身的物理存储机理,例如磁盘通过磁记录方式保持二进制数据,并能通过磁头的读写过程实现数据在物理介质的存取。作为存储系统的设计者往往并不需要了解物理存储过程的全部细节,例如磁介质中每个磁簇的磁场变化的具体物理过程。但必须知道实际存储过程的一些宏观特征和操作特征,包括容量、数据布局、性能和可靠性等,例如在磁盘驱动器中,数据是如何按照磁道和扇区分布,磁头的寻找磁道和定位扇区过程及其相应的时间开销。因为这些存取特性直接决定了存储系统的性能和可靠性等设计参数。

另一方面存储系统必须提供一系列存取操作实现对于存储系统中数据的访问,存取操作包括访问接口及其相应的存取操作集。访问接口也提供了用户对于存储系统访问的操作语义集,例如很多块存储设备采用SCSI的访问接口,这种接口提供了以固定大小块为单位的线

性空间,请求按照存储单元的块地址进行访问。访问接口事实上抽象存储系统实际存取过程,屏蔽存储系统内部的复杂结构。而对应的存取操作依赖于设备的实际存储机制,例如上述块存储设备提供逻辑块地址到物理地址的映射。事实上在标准的存取接口下,不断优化存储系统中实际的存取操作一直是一个重要的设计方法,另一方面如何设计更加灵活和高效的存取接口也受到越来越多的关注。

数据存储系统就是以提供良好存储服务为目的的计算机软硬件系统。数据存储系统从结构上可以分为物理结构和逻辑结构,前者指数据存储系统中物理设备及其组成方式,包括存储设备、计算设备、连接设备以及相应的拓扑结构等;后者指的是存储系统数据存取和管理的逻辑结构,及其相应的管理软件系统。需要说明的是数据存储系统包括传统上的计算机存储系统,同时比后者具有更丰富的内涵。因为计算机存储系统更主要的是从计算机系统物理组成的角度研究数据存储系统,也即是偏重于物理存储结构设计;而数据存储系统考虑到物理存储结构的同时,也包括在物理基础上设计相适应的逻辑存储结构,而这种逻辑结构必须考虑到数据的应用背景和特征,以及相应的要求对存储系统设计产生的重要影响,另外应用级的存储服务软件也属于数据存储系统的有机组成部分。

1.2.2 存储结构的发展

计算机系统由计算部件、传输部件和存储部件三部分组成。计算部件从最初的单机、发展到基于局域网的集群,最后到基于广域网的计算网格。同样,随着信息的爆炸性增长,存储将经历类似的发展历程。回顾存储技术的发展历史,基于总线的存储系统以服务器为中心,结构虽然简单,但因存在原始容量限制、无扩展性、存取性能受服务器性能限制、无法集中管理等先天缺陷,其被以网络为中心的网络存储系统所取代是历史的必然。网络存储在一定程度上解决了系统在数据共享、可用性/可靠性、可扩展性、可管理性等方面的问题,然而随着数据资源的不断涌现,系统规模的不断扩大,新的技术又迫切地需要被运用到网络存储系统之中,传统的网络存储系统必然要向大规模海量存储集群过渡。可以预见,理想的存储系统应该可以通过外部网络并行存储数据到多个存储设备上,聚合多个设备的带宽以达到外部网络的最大带宽,同时满足存取过程中对可靠性、可用性、安全性等方面的要求。存储技术由简单向复杂的演变过程如下图所示。

用户用户对用户透明节点节点节点节点节点节点节点SAN高速局域网单一文件映像NASDiskRAIDDiskDisk直接存储NAS、SAN海量存储集群图 1.1数据存储系统结构的发展

在上一节中,对于传统存储系统的介绍事实上就是DAS结构,存储子系统通过外部总线和主机相连,不过它也是其他更为复杂的存储结构的基础。

现在网络存储逐渐成为大规模存储系统的基本体系结构。我们称网络存储设备为NAD(Network Attached Disk,NAD)。根据NAD提供的存取接口不同,其软硬件系统结构是不同的。目前最为典型的三种基本网络存储结构是SAN、NAS和iSCSI。图 1.2是NAS系统的基本物理模型,图 1.3为SAN系统的基本物理结构,图 1.4提供iSCSI系统的基本结构。

客户机客户机LANNAS头存储池NASNASNAS头存储池

图 1.2 NAS的物理拓扑结构

WWW服务器服务器存储域服务器存储域服务器服务器ComFC交换机ComFC交换机HS1HS2OK1OK2PS9101112COL-ACT-STA-CONSOLEFC交换机HS1HS2OK1OK2PS9101112COL-ACT-STA-CONSOLEFC交换机HS1HS2OK1OK2PS9101112COL-ACT-STA-CONSOLEFC交换机FC/SCSI桥接器磁带库磁带库光盘塔阵列磁盘阵列磁盘阵列

图 1.3 SAN的物理拓扑结构

Gibson按接口(面向数据块和面向文件)形式把网络存储分为两大类{Meter, 2001 #1},一是基于SAN结构,SAN系统提供简单、无类型、固定大小的数据块(典型操作为get block,set block),多个SAN的存储设备在逻辑上构成存储池。从接口的抽象角度来看,这和传统的直接连接的存储设备没有什么不同,但由于SAN网络使得多个客户可以同时直接访问共享数据,而SAN系统不能保证它们之间的互斥访问,因此当产生共享访问时,必须对多个客户进行同步,这一工作应该通过建立集中的管理方式解决。另一种是基于NAS结构,它提供丰富的、有类型的、可变尺寸(文件)的层次性的接口(典型操作为read,write和create)。

图 1.2是NAS系统的基本物理模型。NAS开始作为一种开放系统技术的出现是由Sun公司推出的NFS开始的。NAS通过瘦文件服务器的方式把存储设备和外部网络连接起来。对于本地存储设备中的数据整体管理的任务还是由NAS完成,但此时服务器的负载相对减少很多,并且由于瘦文件服务器模式完成的功能要求相对简单,可靠性比DAS有所提高{Khaleel,Narasimha, 2000 #2}。另一方面NAS实现文件级的数据共享,数据易于管理和维护,同时可以通过扩展,实现NAS设备间的数据备份和容量线性扩展,通过管理软件可以进一步提高

整体的存储性能。另外大型的NAS设备的后端可以是高性能的RAID或者SAN网络。其结构如图 1.2所示。NAS最主要的特点是可以通过文件操作语义访问,客户可以使用NFS或者

iSCSI设备TCP/IP网络iSCSI设备客户端iSCSI启动器CIFS访问NAS设备。

图 1.4 iSCSI网络存储结构

iSCSI设备

iSCSI作为一种融合NAS和SAN的技术最初由Cisco和IBM两家发起,提交给Internet 工程任务组(IETF)将其标准化。其结构如图 1.4所示。目前由IETF制定的iSCSI协议草案的最高版本为draft-ietf-ips-iscsi-20。通过使用iSCSI技术使得本机可以通过数据块操作界面访问网络上的各种存储设备,iSCSI把本机的SCSI请求通过SCSI/IP模块发送到IP网络上,到达目的地时再通过SCSI/IP模块转化SCSI命令对存储设备进行直接的操作{Satran, 2003 #3},对iSCSI连接的存储设备的操作就像对本机的存储设备操作一样。显然IP Storage的出现极大扩展了存储系统的范围,但另一方面,由于经过多次的协议转化和现有传输协议不适应存储特性,使得点对点的数据操作和传输变的复杂而且安全性受到极大的挑战{Pleszkun, 2003 #4}。

目前另外一些整合NAS和SAN的技术也在不断发展之中,如IBM的Tivoli SANergy {Kimberly Keeton, 2003 #5},GPFS文件系统等。它允许联入SAN的异种服务器之间共享文件和数据。并且采用的是基于NFS和CIFS的标准的文件系统,使得多个计算机可以同时通过SAN访问共享文件。一方面具有SAN的高速性能,同时保持了NAS在文件共享、安全等方面的优点。总体上这种统一方式分为“垂直”和“水平”两种方式:采用Network Attached Storage Head-end Servers的方式,NAS和SAN是“vertically垂直”的关系;另一种是在SAN中增加元数据服务器,类似于IBM SANergy,通过采用将控制通道和数据通道分开的机制提高数据访问的性能,用户首先向元数据服务器提出请求,得到授权和相应信息后,客户直接和存储设备建立数据通道,数据直接通过SAN 返回客户。

应用程序1.DAS结构2.NAS结构/网络文件服务器/存储应用3.带RAID的NAS结构/网络文件服务器4.具有三方传输的文件服务器5.NASD(OSD)对象存储LANLANLAN文件目录结构存储对象/逻辑卷SANSAN磁盘等存储介质SANSAN大块数据直接传输SANSANLANread,writeSANSAN6.NASD集群LANLANread,writeSANLAN7.Petal集群LANLAN8.iSCSI存储 图 1.5几种网络存储技术的比较

图 1.5提供网络存储系统软件层次结构模型。从中不难发现,各种网络存储技术在系统逻辑层次上具有明显的差别,这也决定了各种网络存储技术的特点。

未来存储网络的发展表现在以下几个方面:

1. 以网络速度的存储。万兆网络作为商业产品出现,对于大多数挂接在以太网上的系统而言,网络对于存储成为最快的路径。管理网络上的磁盘和内存,使之成为统一的存储资源成为关键的技术挑战,系统整体的速度和快速增长的网络速度保持同步,而不必过分依赖于磁盘速度。

2. Internet和局域网成为存储系统的主干。商业系统靠在存储区域网中增加存储设备和服务器的互连提供共享存储,例如光纤通道。然而,最近局域网性能的高速增长缩小了SAN和LAN之间的带宽差距,减小对于分离SAN的需要。基于LAN的网络存储系统提供的扩展性、可靠性和管理的简单性、以及性能等方面能够接近基于FC的SAN,但同时提供满足高速存储的附网低价设备。

3. 非中心的文件服务结构。客户/服务器局域网文件服务在80年代末和90年代直到今天,大多数文件功能被中央文件服务器通过输出一个或者多个存储卷使用,基于Internet的网络文件协议NFS,使得最近一代的网络文件服务器经常被认为就是附网存储,以区别于SAN方法。为了在具有潜力的高速局域网上传输,NAS必须从客户服务器模式进化到并行非中心服务结构,分布存储功能在一组协作的服务器和存储设备中实现。

4. 智能的数据分配和移动。整个存储系统的性能和可靠性主要被分布数据到存储节点或者到磁盘,以及数据在慢速磁盘和快速内存之间移动的时间的策略决定。通过针对特定数据存取模式智能采用相应的策略和机制,如信息预取、网络cache、镜像分片、程序直接的数据块分布、数据迁移等是存储管理的重要研究方向。

1.3 评价指标和功能需求

1.3.1 评价指标

显然存储系统和部件的基本评价指标就是容量,而评价容量的指标就是字节数。当前单条随机存储器的容量大约为GB级,而单个磁盘驱动器的容量为TB级,单张DVD光盘容量为5GB左右,而蓝光光盘容量为20GB,磁盘阵列的容量依赖于其中磁盘驱动器的数量和组织模式,而大规模存储系统的容量从几十个TB到几十个PB不等。存储容量是存储设备的系统静态指标,特别是对于存储设备而言,容量在设备生存期基本是不会改变的;而许多存储系统往往通过系统扩展技术实现实际存储容量的增加。

相对于存储容量,在存储设备和系统中与时间相关的两个基本性能评价指标为系统吞吐率(Throughput)和请求响应时间(Response time)。虽然这两个指标也一直是计算机系统和网络的重要评价标准,但在存储系统中它们往往具有特殊的含义。在网络系统中往往使用每秒比特(Kbit/s,Mbit/s和Gbit/s)来表示网络连接速度,而在存储系统中缓冲区(buffer)和I/O接口的传输速度往往使用每秒字节(KByte/s,MByte/s和GByte/s)表示。而请求响应时间根据存储部件和任务的不同可以从几个ns到几个小时不等。

对于存储系统和部件的设计者而言,吞吐率定义为单位时间内系统能够完成的任务数,它是一个重要指标,反应了系统处理任务的能力。但在实际应用中,吞吐率大小往往依赖于任务的特征,例如磁盘阵列评价指标每秒I/O数量(IOps,I/O per Second)就是指每秒的I/O处理个数,显然当每个I/O请求为1MB和8KB时,就会得到不同的吞吐率;并且吞吐率和请求大小一般情况下不具有线性比例关系,上例中通常后者吞吐率也不会是前者的128倍。这种现象来源于多种原因,其中一个原因是每个请求无论大小都需要相对固定用于对请求包进行分析和处理的时间。显然很难仅仅用吞吐率去衡量存储系统的性能。

对于应用程序和用户而言,请求响应时间是他们更加关注的。实际请求的响应时间受到多个方面的影响,首先存储系统结构会影响请求响应时间,例如一个具有本地8MB缓冲区的磁盘驱动器通常就比具有更小缓冲区的磁盘驱动器具有更好的响应时间;其次请求自身的特性也会影响实际的响应时间,例如8MB的请求比4MB的请求有更长的响应时间;再次请求数据的物理存放位置也会对响应时间产生巨大影响,例如本地磁盘中的数据比远程磁盘中的数据具有更小的访问延迟;还有请求响应时间还依赖于当前存储系统的繁忙程度,请求在负载重时比负载轻时有更长的响应时间。实际上还有其他因素也会影响请求的响应时间,例如前后请求是否连续对于磁盘响应时间就是极其重要的。这些都使得在存储系统中对于请求响应时间的计算和分析非常困难。

从上面的分析可以看出,无论吞吐率还是请求响应时间,都涉及到请求或者说负载的特征,不同的负载在相同存储系统上可能具有截然不同的表现,例如一个面向共享应用的分布式存储系统可能对于大量并发读写的负载(科学计算)有很好的性能,但对于具有大量频繁更新操作的联机事务处理(OLTP,On-Line Transaction Process)就有很差的性能。因此在对于存储系统进行评价的时候,确定运行在该系统之上的典型应用负载是非常重要的问题。

正是因为存储系统中影响吞吐率和响应时间的因素太多,所以在当前的研究中很难使用模型的方法精确计算出存储系统的性能,那么更多的采用构建仿真或者搭建原型系统,通过运行典型负载,然后通过实际测量来获取系统的性能。

1.3.2 功能需求

数据量的急剧增加,和数据本身内涵的多样性以及用户不断增长的需要对数据存储系统的功能设计提出了极大的挑战,用户不再仅考虑存储系统的容量和性能。存储系统需要更多

的功能满足不断增加的应用需求。特别是在多用户并行的环境中,大规模应用系统的广泛部署对存储系统的性能和功能也提出更多的挑战,主要表现为:

1. 高性能:性能永远是系统设计追求的重要目标,数据存储系统必须能满足用户对性

能的需求。用户希望系统整体性能应该能够随着设备性能和数量的增加而增加。对于各种实时性要求严格的特殊应用系统,存储系统必须根据负载特征进行针对性的优化以满足实时性要求;尤其在大数据量和高突发性的应用系统中,吞吐率和命令处理速率是非常关键的性能指标。 2. 可扩展性:存储系统必须能够根据应用系统的需求动态扩展存储容量、系统规模以

及软件功能。许多应用系统,如数字图书馆、石油勘探、地震资料处理等都需要PB级的海量存储容量,并且其存储系统结构能够保证容量随时间不断增加。存储系统的设计不仅考虑单个物理存储介质容量的增加,同时还需要从体系结构方面入手,使得系统能够根据需要加入和管理更多的存储设备;而且扩展过程必须表现为在线的扩大,不应该影响前台业务的正常运行。 3. 可共享性:一方面存储资源可以物理上被多个前端异构主机共享使用;另一方面存

储系统中的数据能够被多个应用和大量用户共享。共享机制必须方便应用,并保持对用户的透明,由系统维护数据的一致性和版本控制。

4. 高可靠性/可用性:数据越来越被称为企业和个人的关键财富,存储系统必须保证

这些数据的高可用性和高安全性。许多应用系统需要24×365小时连续运行,要求存储系统具有高度的可用性,以提供不间断的数据存储服务。 5. 自适应性:存储系统能够根据各种应用系统的动态工作负载和内部设备能力的变化

动态改变自身的配置、策略以提高I/O性能和可用性。

6. 可管理性:当系统的存储容量、存储设备、服务器以及网络设备越来越多时,系统

的维护和管理变得更为复杂,存储系统的可用性和易用性将受到空前的关注。事实上当前维护成本已经接近系统的构建成本。系统通过简单性、方便性、智能性的设计提供更高的管理性,以减少人工管理和配置时间。

7. 海量数据组织和维护:当前数据具有量大,结构复杂的特点,对于这些海量数据的

高效组织和管理成为一件极具挑战性的工作。为所有数据增加特性标签、建立快速和高效的索引结构成为存储系统必须考虑的问题,另外对于数据进行生命周期管理和对冗余数据进行重复删除都是提高存储系统利用效率的方法。 8. 数据存储服务的QoS:数据具有不同的属性(读写频率等),用户对数据也有不同

的需要。以往对所有数据一视同仁的方法,只会导致整体存储资源的浪费和服务的低下。而现在的数据存储系统设计必须能够认清这种差别,使用合适的方法更好的满足用户对数据存储的要求。例如,不同存取模式对存储系统有不同的影响,而且系统必须自动的适应存取模式的变化。 9. 高效的能耗管理:大规模存储系统需要消耗大量的电能,设备的空转会消耗大量的

电能产生大量的热量,这又导致散热和制冷的功耗增加,因此当前存储系统设计必须考虑如何节省系统运行的整体功耗。

虽然用户期望存储系统能够达到上述列举的多方面功能要求,但在实际的存储系统设计过程中这些功能需求会相互关联、相互制约。例如安全机制的引入往往会对性能有相反的作用。因此在实际的设计之中,需要根据应用的实际需要在多个功能之间进行一定的取舍和平衡。

1.3.3 典型系统

1. 高性能计算领域

对于海量和高性能数据存储最早提出迫切需求的是高性能计算领域,主要来自于科学和工程计算,以及国防安全领域,涉及纳米技术、基因工程、化学和生物、放射、核磁共振图像、流体动力学等各个科学类别和工程领域。由于数据处理过程中,数据计算、传输和存储三个环节密不可分,必须相互配合才能达到任务运行指标。特别是由国家级研究中心负责的面向天气预报、地震预测、航空航天和高能物理等研究工作需要处理大规模数据处理任务。因此,主要承担这些科研和计算任务的国家实验室和高性能中心开始建设大规模存储系统以满足自身大规模数据处理的需要。下表{IBM, 2008 #6}列出截至2008年底,国际范围现有的大容量高性能存储系统。可以看出存储容量基本上都达到PB量级,文件数达到百万以上,并且都是大文件。

表 1.1 2008年底国际上较大的高性能存储系统

System (Each system shown is a single HPSS instance and namespace) National Lab (LANL) Secure Computing Facility (SCF) Lawrence Livermore National Lab (LLNL) Secure Computing Facility (SCF) The European Centre for Medium-Range Weather Forecasts (ECMWF) Brookhaven National Lab (BNL) Commissariat à l'Energie Atomique/Division des Applications Militaires (CEA) LLNL Open Computing Facility (OCF) National Centers for Environmental Prediction (NCEP) San Diego Supercomputer Center (SDSC) Stanford Linear Accelerator Center (SLAC) Institute National de Physique Nucléaire et de Physique des Particules (IN2P3) Center (NERSC) Oak Ridge National Laboratory (ORNL) LBL NERSC Backup System Indiana University (IU) LANL Open Computing Facility RIKEN in Japan National Climatic Data Center (NCDC) NASA Langley Petabytes (10^15 bytes) 13.19 11.72 10.62 9.42 7.27 6.38 6.19 5.93 4.61 4.53 Million files 104.1 84.9 44.9 52.8 2.1 76.7 5.7 52.4 5 .8 21.2 61.3 10.8 Avg file MB 121 132 226 170 3233 79 1043 108 753 203 57 321 Lawrence Berkeley Lab (LBL) National Energy Research Scientific Computing 3.68 3.65 2.56 2.06 1.60 1.53 1.10 0.77 12.1 18.3 202 107 65 469 23 146 23.7 3.1 46.4 5.0 1998年美国能源部Los Alamos国家实验室建立的Mountain Blue-Los Alamos系统,包含了48个128-processor SGI Origin 2000系统,其磁盘存储器的总容量为75TB。此后,于2002年又建立了ASCI Q系统。这个系统由310个32-processor的机器节点加上64个32-processor的I/O节点组成,它用2Gb FC接口连接64个I/O节点及存储子系统,组成了访问带宽为20Gb/s,存储容量达692TB的存储系统。大容量管理受到传统的基于块的文件系统的限制,因而该系统共用了4个文件系统,每2个文件系统管理346TB容量。在2008年,又开始建设世界最快的超级计算机Roadrunner(1.105 petaflop每秒),其中包含12个高性能I/O结点,提供216GB/s的持续文件系统I/O,通过216个双工的万兆以太网络连接到Panasas的PanFS对象存储系统。

此类系统的使用特点是:

1. 能以并行I/O的高带宽支持多用户以数百GB/s的速度访问同一文件;

2. 能支持非常大的文件系统:允许文件规模大到TB级;允许同一目录下有百万个以上

的文件;能在一秒钟内创建数千个文件,并支持元数据操作。

3. 能以高带宽将数据移入第三级存储设备;

4. 能自适应预取:完善的预取策略和延迟写(Write-behind)策略。 5. 能控制流量和I/O服务量。

随着新实验设施和更高性能的超级计算机的出现,千万亿级的计算对于新型存储的容量、性能、并行性、可靠性、可用性和管理性等方面提出更加严格的要求;同时研究者必须能够通过存储系统管理、共享和分析这些PB级的数据。这对大规模存储系统提出了更高的要求。例如位于加利福利亚伯克利Lawrence国家实验室的NERSC (The National Energy Research Scientific Computing Center)通过全局文件系统Global File System (NGF)为5个超级计算机系统提供共享存储服务。这5个超级计算机系统分别为Franklin(Cray XT4,9660个结点,Opteron处理器)、PDSF(275个结点,x86处理器)、Jacquard(356个结点Opteron)、Bassi(122结点,POWER处理器)和DaVinci(350个结点,Itanium2处理器)。每个超级计算机系统都有本地的存储空间,并使用不同文件系统,它们必须通过NGF文件系统共享数据。NGF使用IBM的GPFS提供96个卷共132TB的容量,存储设备包括2个DDN S2A 9550(24个阵列组)磁盘阵列和4个IBM DS4500(16个阵列组)磁盘阵列。可以看出,现在海量存储系统必须满足高性能计算机环境高带宽、低延迟的要求,并提供大容量、高可用的数据存储服务。 2. 企业级数据中心

随着社会信息化程度的不断深化,日常生产和商务等企事业经济活动也需要大容量存储系统的支持。相对于高性能计算领域渴望采用新存储技术和系统更快、更好的完成计算任务,大量的企事业单位更加关注于在成本约束下如何充分利用成熟的存储技术和存储系统提高自身的生产力和竞争力。因此在现有企业级数据中心基本还是采用磁盘阵列和磁带库系统作为主要的后端存储载体,这些存储设备通过高速的光纤通道网络互联起来,并连接到前端的服务器集群。对于中小型企业往往采用更加廉价和易管理的基于IP的存储解决方案,大量的客户端通过高速以太网连接共享的NAS或者iSCSI存储设备。

当前许多企事业单位还是以数据库作为信息管理和业务运行的支撑平台,而日常作业也大部分属于联机事务处理(OLTP)类型,因此需要存储系统具有低延迟、高每秒I/O处理能力、细粒度的高效存取以及对于读-写-修改模式的优化,例如IBM的DS8000磁盘阵列可以提供4路SMP处理能力,4个4Gbps的FC端口和4.9百万IOps能力和256GB的cache容量。在这种应用背景下,存储系统大多使用匹配相应业务量需求的磁盘阵列,而较少使用高性能计算领域中常用的大规模分布式文件系统和独立的I/O处理服务器。由于这些磁盘阵列采用SCSI协议与服务器进行数据通讯,因此使用主机上的文件系统,甚至数据库都可以方便地直接管理和使用这些块设备。 3. 大规模网络信息服务提供商

互联网络的蓬勃发展,人们的工作生活越来越离不开大量信息的支持,例如更多的企业依赖电子商务模式进行商品贸易,又如更多普通人能够制作反映各自生活的影像资料,并通过网络广泛传播,这一切运作都离不开网络信息服务商,例如亚马逊、雅虎和新浪等,它们为百万以上的用户提供高效的包括信息发布、电子邮件、视频点播和电子商务等信息服务,显然大量的业务和用户数据是这些企业赖以生存的根本。

很多网络信息服务商需要构建大规模存储系统以支持日常的业务需要,这种存储系统有别于上述两种类型的存储系统。与一般企业级数据中心相比,他们往往采用基于IP网络的基于成百上千结点的存储集群,运行更加复杂的应用程序,为上万个用户提供并发基于Web的各种服务;与高性能计算领域相比,每个结点是一台普通的商用服务器甚至就是PC级主机,具有独立的处理器、内存和磁盘,所有结点通过商用交换机互联,因此整体硬件价格可

以维持在一个较低的水平,具有更高的性能/价格比。另一个显著的特点是,他们的应用往往建立应用级的存储集群,也就是这种集群结构是基于特定的应用,而不是构建通用分布式文件系统,例如构建上百个结点的邮件集群,或者如Google一样,建立面向搜索服务的应用集群系统。而且在这些系统之中,单部件的失效率远远大于高性能计算领域的集群系统,但通过廉价部件的冗余技术提高系统的可用性。

1.4 存取路径和接口

存取接口对于存储系统具有重要的意义,它能够在操作语义上面抽象和规范出存储系统的行为,一方面把不同存储设备系统通过统一的接口集成起来,为存储虚拟化提供条件;另一方面能够让应用程序对于存储设备的访问是透明的,不必了解设备的特殊性。

而存取路径是数据和命令在存储设备和系统内的物理和逻辑移动路线,它展示了存储系统内各个部件相互协调工作的实际过程,也是对于存储系统设计与分析必不可少的方法。

1.4.1 存取接口

1. 块级接口

对于存储空间的组织,线性编址是最基础、最方便的组织方式,线性空间中的每一个数字对应一个唯一的存储单元地址,那么对于地址的寻址操作对应于线性空间中的数值操作。如果每个存储单元都是一个字节,那么最大的存储空间就是地址空间大小;而如果每个存储单元都具有相同的数据块,那么最大的存储空间就是存储空间大小和块大小的乘积。当请求要求特定存储单元中的数据时,只需知道该存储单元的地址就可以唯一定位该存储单元,从而可以方便的存取相应存储单元中的数据。

现代计算机中内存空间一般都是按照字节编址,目前物理内存一般为几个GB到几十个GB,其需要的地址通过5个字节就可以表示了。事实上处理器位长和字节的乘积就是理论上处理器直接寻址空间的最大尺度,如果考虑到指令中不仅包括地址内容,还要包括指令编码,实际的直接寻址空间将远远小于上述最大寻址范围。因此指令的直接寻址范围显然受到CPU字长的限制。

外部存储系统有比内存地址更大的存储空间,远远超过处理器指令直接寻址的范围。必须使用间接寻址扩充处理器寻址的空间。例如使用数据块的概念实现二级间接寻址,对于由数据块为单位组成的存储空间,数据的地址由块地址和块内偏移决定,块内地址可以是一个独立的线性空间,所以块地址和块内地址这两项都可以用数字表示。通过这种方式使得处理器的寻址空间增大。间接寻址往往使用特殊的寻址操作或者直接由硬件实现,操作可以通过程序结合相应数据结构(必须有两级地址信息)共同完成。理论上这种间接寻址的概念可以无限扩展到多级,如果每级的地址空间都是N,那么m级后,地址空间可以增加到N的m次方。

一个基于固定块的线性地址空间给存取操作带来极大的方便,上层看到的就是一段连续的地址构成的存储空间视图。并且由于每个块在逻辑上是独立无关的,所有块逻辑上没有什么差别。这有效地屏蔽了底层物理存储设备的细节,对于上层程序而言对于线性空间的操作就是对于实际物理设备的操作。在存储系统中往往把这个逻辑地址称为LBA(Logical Block Address)。但逻辑结构并不是真正物理数据存放结构,数据存储的物理介质还是以磁盘为主的存储设备,因此必须建立数据逻辑组织结构到磁盘物理结构的映射,并且这种映射应该是高效和可靠的。由于物理磁盘组织结构由磁道、扇区和柱面等构成,而设备驱动程序对于磁盘操作的接口应该是逻辑块,所以这一映射是由磁盘驱动器完成。事实上这一映射关系通常

由物理存储驱动器固件(firmware)完成的,当某一物理扇区失效时,firmware会把逻辑地址重新映射到一个空余的新扇区,而上层程序完全不知道这个改变。

在存储系统中,存储设备提供的线性空间也往往被称为逻辑卷,它是对于物理磁盘提供线性存储空间的一种抽象,文件系统将其视为有边界的、由固定大小块组成的、可随机存取的存储空间。事实上一个逻辑卷可以映射到多个物理设备的物理空间(如磁盘阵列),或者一个物理设备包含多个逻辑卷(在一个磁盘上建立多个分区),并且逻辑卷中的块大小可以和物理设备的物理块大小不同,卷管理器将这些逻辑块映射到物理存储介质上的物理块。

传统文件系统中,使用分区的概念把磁盘提供的线性存储空间分割成若干用户可见的逻辑空间。事实上,当操作系统格式化磁盘等块设备时,就在上面建立了可操作和管理的线性地址空间,其空间大小对应着分区大小。一旦分区建立,系统能很难在线的对分区进行修改,例如扩容等。逻辑卷管理器的引入,可以在线的进行块地址空间的合并、重映射和减小操作。

正是因为基于块的线性存储空间的逻辑简单性和通用性。块接口是当前存储系统,特别是底层存储设备的基本操作语义,为上层提供简单的视图。而当前实际系统中,最为流行和常用的块接口协议为小型计算机系统接口SCSI协议族。SCSI通常用来连接外围存储设备和前端计算机,它的数据传输是以块方式进行。SCSI起初由Shugart Associates和NCR公司于1981年开发,作为磁盘控制器接口的一部分,称作SASI。这个规范被提交给ANSI X3T9以后,ANSI X3T9委员会对此进行了进一步地发展,并改名为SCSI,此后,ANSI X3T9委员会继续对它进行开发,直到1986年6月,SCSI变成了ANSI的官方标准。自那以后,ANSI X3T9委员会仍然不断地完善SCSI规范。SCSI-1是最初版本的SCSI,具有8位总线,数据传输率为40 Mbps(5MB/s),它为磁盘、磁带和其他的外围设备定义物理接口、传输协议和标准命令;SCSI-2 是基于CCS的SCSI-1改进版本,增加了多线程命令,更多的设备命令和传输协议清除功能,由18条基本命令组成,传输率和带宽都得到增强。Fast SCSI 的传输率为10 MB/s,当采用16位总线时,传输率为20 MB/sec(Fast-Wide SCSI)。由Adaptec及SCSITA于1992年制定具有首个并行接口的SCSI-3,进一步提高的带宽(Ultra-2/Ultra-160/Ultra-320),可以把物理层、通讯协议和SCSI命令集单独分开,例如分别定义了硬盘命令(SBC:Block Command)、磁带设备的流命令(SSC)和多媒体命令(MMC)等命令级。SCSI-3通过即插即用(plug-and-play)解决了以前版本中终结器和延迟问题。由ANSI INCITS T10技术委员会开发的串行SCSI命令(SAS:Serial Attached SCSI)提供更快速的传输速度以及更简单的配置,采用点对点的连接,并允许多个端口集成到单个控制器,第二代SAS为磁盘阵列中的每个驱动器提供了600MB/s的传输速度。

2. 文件存取接口

如果说线性地址空间的整数地址方便计算机处理,那么对于应用而言,特别是对于人类而言,无意义特别是具有很大位数的数值是难以理解和记忆的。就像人类习惯用一个名词去定义一些具有丰富内涵的概念,应用程序和用户也往往给数据集取一个名字以方便的识别。而这个数据集在文件系统中以文件的方式存在。文件作为一组具有逻辑关联的数据的集合,是数据的逻辑容器。因此文件也可以是一个单独的数据寻址单元,而文件内的数据组织可以是线性的地址空间就像块内地址一样,不同的是文件内部字段之间往往是一种逻辑关联,因此对于文件而言,“理解”数据是非常重要的,事实上对于文件数据的“理解”是通过应用程序来执行的。不同应用程序操作的文件往往具有特定的格式,这种格式往往决定了在形式上相同的数据之间的语义差别,因此从另一个角度看格式也应该是文件属性的一部分,通过文件名显示说明其格式类型能够更好的反映文件内部数据的语义含义,实际系统中往往通过文件的后缀表达其文件格式类型。例如可以通过一个媒体播放器播放一个以wmv为后缀的流媒体文件。

仅通过文件名管理文件是低效率的,一方面无法反映文件之间的关系;另一方面如果文

件很多的话,也是难以管理的。就像人类习惯把一系列概念进行分类和组织一样。如果说文件是数据的一个基本集合,那么通过引入目录的概念对大量文件进行归类,往往具有某种相关性的文件存放在特定的目录,目录之间也可以嵌套。文件和目录一起构成了命名空间,而这种命名空间显然具有树形的特点。文件系统以树形结构的方式对文件和目录进行组织,其本质是用文件名(路径也是文件名字的一部分)确定文件的存储位置,文件空间到底层线性块地址空间的转化就成了文件系统必须完成的一项任务。文件系统对于上层应用提供基于文件目录的树形存储空间结构,然后把每个文件目录映射到下层存储设备的物理存储空间,同时提供对两层存储空间的管理和操作。

由于文件名的长度在实际的文件系统中都有限制,例如windows系统中文件名不能超过255个字符;另一方面,一个文件包含的数据集往往具有多种含义,这些又很难仅通过文件名表达。因此通过文件名对于数据集的含义进行描述是有限制的。

现在大部分文件系统可以为文件定义许多静态属性,如创建时间、文件大小和所有者等,但仍然无法描述文件的动态属性,例如,无法统计特定用户在特定时段内存取次数最多的文件。对于这些关系存储性能优化的动态属性统计和表达,现在的文件系统往往无能为力。另一方面,在现代文件系统中,文件寻址和表达文件含义的属性没有直接关系,系统主要仍然是通过绝对地址在文件目录树中进行寻址。由于用户往往按照数据集的含义记忆文件,随着系统中文件的增加和每个文件内涵的增加,用户越来越难以确定自己所需文件所在的位置,很多情况下依赖于对于文件目录树的关键字搜索。因此如何对于海量文件进行高效组织和基于内容的寻址是当前文件系统研究的重点之一。

文件目录是一种对大量数据集及其相关性的组织抽象,文件目录结构是存储系统展现给用户或者上层应用的逻辑视图,和线性块存储空间相比,一方面,树形的文件目录存储空间更容易让人们理解不同数据集之间的组织关系,方便对于数据集的组织和管理;另一方面应用程序或者用户对于文件和目录的操作无需了解所在存放存储设备的特性,也无需关心具体的存取过程。因此文件目录抽象容易被用户理解和操作。

另外,由于在文件目录树中两个子树在路径上是逻辑无关的,因此可以把多个子树通过挂接到所设置连接点构造成一个更大的逻辑树,这一特性使得文件目录树非常方便扩展,例如NAS存储系统通过输出的文件目录结构给用户使用。

IEEE制定的POSIX(Portable Operating System Interface)是应用程序访问文件系统的API标准,也就是前面提到的文件级存取接口及其操作集。POSIX虽然最早为UNIX操作系统设计,但目前几乎所有的文件系统都遵守这一标准或者能够与之兼容。最早的POSIX标准制定于1988年,之后又修订过多次,最新的标准为(IEEE Std 1003.1-2008),其中对于文件和目录操作部分几乎没有改动,这也成为事实上的标准文件操作语义集。

3. 文件地址到块地址的映射 上面两节,分别讨论了块接口和文件接口。存储设备通过块接口给上层展现出基于块的线性地址空间;而文件目录结构给应用和用户提供了一种具有树结构的文件组织视图。事实上经常认为文件目录接口为高层存取语义,而数据块接口为低层存取语义,相对于数据块存取语义,文件目录存取语义具有更丰富的内涵,更容易让人操作和理解。现在的问题是如何实现文件逻辑地址到存储设备物理地址的对应关系和具体操作过程。

文件系统对于文件的物理存取由两次映射完成,一是从用户的文件视图到文件系统的逻辑卷,二是从逻辑卷到具体的物理存储设备。这种映射是建立在系统的核心数据结构和相关的存取操作基础之上的,核心数据结构构成了系统的静态组织结构,包括文件分区表、MFT表、i节点、super 节点等等,每种文件系统可能都有不同的结构方式。另一个方面是加之在这些数据结构上操作,例如从inode结构中获取每个文件数据块的磁盘逻辑地址,又如文件通过系统调用方式存取文件分区表。通过这些核心数据结构和相应的操作完成文件目录到

物理设备之间的映射关系。

作为本地存储系统的组织管理者,主机文件系统实现依赖于相应的操作系统平台,呈现出不同的组织结构和操作形式。在WINDOWS平台的FAT类型文件系统中,文件系统通过FAT表来管理和分配磁盘的存储空间,在NTFS文件系统中使用MFT结构来管理磁盘的存储空间。而在UNIX平台的系统中使用inode作为在磁盘组织文件的重要数据结构。

下面我们以FAT32为例,看文件如何映射到物理地址之中。

FAT文件系统将一个分区划分为四部分,每个分区可以看成独立的逻辑卷,整个分区依次包括引导区(BOOT区)、文件分配表区(FAT区)、根目录区域(ROOT区)和数据区(DATA区)。引导区和文件分配表区又合称为系统区。引导区从第一扇区开始,使用了三个扇区,定义了该分区每扇区字节数,每簇对应的扇区数等重要参数和引导记录。这些记录之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。区共保存了两个相同的文件分配表,以保证在一个损坏时,另一个依然可以工作。文件分配表实际上是数据区中所有簇的位图文件,文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位。每簇的使用情况用32位二进制填写,未被分配的簇相应位置为零;坏簇相应位置填入特定值;正常已分配的簇相应位置具有非零值,如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由数据区共有多少簇所决定,取整数个扇区。FAT16文件系统的根目录区(ROOT区)是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。根目录区在FAT32系统中存在分区中的任何位置,因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,可看作是数据区的一部分。一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。目录表作为文件的寻址入口,记录文件的第一个簇地址。

图 1.6为UNIX的文件inode索引结构{Bar, 2003 #7},通过这种结构文件内的连续地址空间可以映射到逻辑分区中的块地址区域,除外inode还记录文件的属性。图 1.7为FAT的文件索引结构{尤晋元, 2001 #8},它是FAT文件系统管理文件和磁盘的核心结构,保存所有文件的分配信息(通过簇链表示)。

除了建立核心数据结构之外,文件系统还建立cache用于缓存元数据和文件数据、存储空间的分配和回收等管理机制。

数据块文件属性??数据块地址????2????32????332??1211??3

图 1.6 UNIX系统中inode索引结构示意图

EOFMovie.mpgLec.docMusic.mp3EOFEOF

图 1.7 FAT的索引结构

在实际运行中,文件系统的核心元数据(如FAT表,Superblock)记录存储系统的全局逻辑视图,是所有存取过程所共享的,因此其访问频率是极高的。为了提高这些数据结构的存取性能必须对其进行cache;但另一个方面它们如果不可访问或者不一致,整体存储系统中的数据都不能正常存取,因此保证其完整性也是至关重要的。而cache数据在掉电后丢失,这样就造成最近的元数据和磁盘保存的元数据不一致的问题,原因主要是cache中保存的元数据没有及时更新到磁盘。但另一个方面,如果每次更新强制写磁盘,考虑到元数据操作往往涉及很多小的I/O读写,如目录查询等操作,因此带来很多额外开销,特别是在具有较高延迟时间的网络存储环境中。在NAS系统中文件组织的元数据是存放在NAS设备端,当用户读写NAS中的数据时,必须通过网络获得NAS中的元数据。当涉及到大量的文件创建和删除操作时,命令通过网络传输,性能会严重下降。因此元数据的组织对于系统整体性能和可用性是极其重要的。

另一方面,一般系统初始化是构建核心的数据结构(如FAT表)建立文件目录视图到逻辑卷块线性地址的映射,这些核心的存储结构一旦在系统运行时发生改变,整个系统就会崩溃。另外部分系统的元数据往往受限于设计容量,其扩展性较差,例如FAT32就限制文件的大小。逻辑卷管理层的引入在一定程度上增加了系统的在线扩展性,例如在线的分区扩充,这已不需要系统重新启动,又如使用活动磁盘的概念可以在线的扩展存储容量。又如使用VFS接口和iFS可安装文件系统可以在文件系统级进行适当在线扩充,而且能够融合更多的异构文件系统。但这种扩充性是在不改变本地文件系统结构的前提下完成的。

4. OSD协议

随着数据结构和应用负载的多样化,为了高效使用底层存储设备和系统的特性,必须为存储系统设计新的接口模式满足性能优化的要求。块和文件存取接口分别为应用访问块设备和文件系统提供标准的存取操作语义,一直是存储系统最为流行和通用的接口标准。它充分屏蔽了不同存储系统内部结构和应用程序的差异。然而现有的接口标准不能充分表达应用程序的特殊I/O需要,也不能反映存储设备和系统的许多特性。事实上具有不同存取模式的应用,例如连续流媒体点播(大的连续读)和联机事务处理(小读小写)应用在使用两个接口时不能反映各自的特性;而应用也无法区分底层磁盘阵列是采用的RAID1模式还是RAID0组织模式。

另一个方面,正如前面提到的,文件逻辑地址到块设备物理地址映射的文件分配元数据信息由文件系统维护,而随着存储系统中文件和目录数量的急剧增加,大量用户的并发访问产生更加密集的元数据操作,对于文件系统提出了巨大的挑战;而同时现在存储设备具有越来越强的处理能力,那么把文件的元数据操作放到底层设备上进行处理有效减少主机文件系统的负担。但是在原有两种接口体系下,无法实现这种机制。

一方面为了扩展现有标准接口语义的不足;另一方面也使得存储系统上下层能够更加充分的交换数据的属性,进而实现数据存储的自管理、共享和安全性;同时把数据对象的空间管理移到底层存储设备负责,以便于更好的提高存储服务质量,基于对象的存储接口协议因此被提出,具有以下的特性:

? 提高设备和数据的共享能力:通过设计平台无关的元数据组织格式,把数据空间管

理功能移到设备;系统仅仅需要建立所有存储对象的命名空间,通过唯一的名字访问数据对象;

? 提供扩展性和安全性:存储设备可以直接处理客户的请求;数据对象可以建立用户

级粒度的安全存取策略; ? 提高性能:应用程序可以提供额外信息用于优化数据存取过程,并能够建立满足服

务质量策略;同时存储设备也能够对于不同数据类型进行优化放置。 ? 提高存储管理能力:存储设备能够对于内部的数据对象进行自管理,为不同的数据

对象建立相应的存储策略,使得数据管理更加智能化,减少管理员负担。 1995年卡内基梅隆大学的NASD项目首次提出了存储对象的概念,随后标准草案于1999年提交给存储网络工业协会(SNIA ,Storage Networking Industry Association),并于2004成为ANSI标准。对象存储设备(OSD,Object-based Storage Device)标准对现有SCSI协议进行了扩展,集成低层存储、空间管理和安全功能到存储设备,以保证可扩展、自管理,可保护异构共享存储系统;OSD对象包含数据和属性,包括用户数据在设备上的空间信息,并增加了对象ID、对象属性及其操作和对象存取密钥等。事实上这一标准还在不断增加新的内容,例如异常处理和恢复能力以及引入信息生命管理等。

1.4.2 存取路径

设计和理解存储系统涉及到许多具体的细节,一个最为重要的方法就是分析数据的存取路径。事实上存取路径包括物理过程和逻辑过程,前者是数据在硬件部件上实际流动的过程,而后者是软件对于数据的处理过程。存取路径是指请求和数据在存储系统中传递的通道。而存取路径就是从数据请求到物理存储设备之间的交互通道。之所以称之为交互通道,其原因在于它不是单向的,而是双向的,无论是读还是写过程都需要数据和命令的传输,这两个方面的过程往往占据双向过程中的某一边。

网络文件请求网络存储设备网络文件协议驱动程序本地文件请求系统环境I/O重定向文件系统卷管理器设备驱动程序接口NIC设备驱动程序I/O控制器设备驱动程序网络存储设备主机I/O总线存储网络设备网络接口卡主机I/O控制器存储I/O总线(到设备)局域网服务器

图 1.8数据请求的物理存取路径

正如在前面讨论计算机系统存储层次结构,物理存取路径的起点或终点是内存,典型物理路径包括系统主机总线、主机I/O总线、主机I/O控制器或者主机总线控制器(HBA),I/O总线或者网络连接、存储设备和外部存储系统,最后是实际的存储介质。需要指出由于存储设备和外部存储系统自身也是一台计算设备,因此它们具有和上述主机内部的物理路径类似的内部物理路径。而数据或者命令在物理路径上流动都需要部件的处理单元参与,并且主机

对于存储设备或者系统发出I/O指令(不仅限于处理器的指令集,包括应用程序的I/O请求)触发实际的数据存取过程。

图 1.8显示了同一个主机中两种不同应用分别针对网络存储设备和本地存储设备访问的物理存取路径。事实上,对于网络存储设备的访问物理存取过程还必须包含网络和远程存储设备的内部物理路径,考虑到不同的网络存储设备有不同的内部存取路径,因此只是简单表明网络存储设备。

实际运行时,并不是每次数据存取过程都需要上述全部物理部件的参与。在DAS结构中,数据不需要经过网络传输。考虑在上述物理部件中基本上都存在buffer或者cache,如果需要读的数据已经存在于内存之中,相应的的物理存取过程也许仅仅涉及内存操作。

当前对于技术的发展,交换型的数据通道也可能取代传统总线型的物理数据通道成为物理路径的一部分,例如Infiniband高速网络在高性能存储下系统中就可以起到系统主机总线的作用,而光纤通道FC也在SAN系统中占据了传统I/O总线的位置。

而逻辑存取路径主要涉及存储过程中的软件。逻辑存取路径的软件部分可以包括应用软件、操作系统、文件系统和数据库、卷管理器和设备驱动程序,以及存储设备的嵌入式系统软件等。下面用一个例子来说明逻辑存取路径,如果某个程序需要读取本地磁盘中的一个文件并且该文件还没有被系统缓存,程序通过操作系统提供的系统调用发出读文件请求,而文件系统响应应用程序的请求,通过请求中的文件路径获取该文件所在的卷号和分配表,并对分配表记录逻辑地址发出页请求,由于文件不在内存缓冲区,页请求被发送给卷对应的设备驱动程序,设备驱动程序把页请求转化为对于磁盘驱动器的I/O请求,而磁盘响应驱动程序的请求,把逻辑地址转换为实际的物理地址并读取数据,之后数据再通过请求路径传递给应用程序。而写文件过程的路径和上面一样,只是首先把数据传递给磁盘,而确认信息通过相同的路径返回应用程序。一般把从应用程序到存储设备的过程定义为下行过程,而把存储设备到应用程序的过程定义为上行过程。因此很多研究把应用程序到存储设备软件层次称为I/O功能“栈”。

应用程序文件目录结构文件分配表逻辑卷管理器设备驱动程序主机适配器存储设备控制器本地物理存储设备网NAS/OSD设备iSCSI设备络基于主机的磁盘阵列独立磁盘阵列块设备(磁盘)块设备(磁盘) 图 1.9数据请求的逻辑存取路径

I/O栈的每一层往往提供请求/响应接口,实际的过程分为同步I/O和异步I/O。例如设

备驱动程序为维护一个请求队列,文件系统发出I/O请求会进入请求队列,当任务完成后,驱动程序通过回调方式返回数据给文件系统。同样磁盘驱动器也有相同的过程。

大部分数据请求开始于某一个应用程序,这个应用可以是数据库操作、Email服务、Web服务或者系统管理应用。这些应用由用户发起完成特定的功能或者服务,它们通常通过标准的存取接口访问存储设备或者系统。事实上,还有许多I/O请求是由操作系统本身发起的,例如虚拟存储器中的页交换过程。

实际上,物理存取路径和逻辑存取路径是一致的,是实际存取路径在物理和逻辑上的不同表现形式。如果物理存储路径需要通过TCP/IP网络到远程NAS设备存取数据,逻辑存取路径包括本机的TCP/IP协议栈和远程NAS的TCP/IP协议栈。正是由于软件和硬件相互合作才能完成数据请求。

下面以iSCSI为例,分析实际的数据存取路径。Linux的SCSI驱动程序的实现分为三个模块:SCSI上层,SCSI中层,SCSI底层。可以用iSCSI模块替换三层模块中的任意一层来对SCSI命令进行封装并通过TCP/IP网络传输。可以通过替换Linux的SCSI驱动的中层模块来对iSCSI协议进行解释和封装。如图 1.10所示,(1)当用户向一个iSCSI target设备发出访问请求时,应用程序通过系统调用访问文件系统,(2)文件系统首先解释这个IO命令,分析IO命令所在的设备和地址。然后它把这个请求发送给SCSI上层驱动程序,(3)SCSI上层驱动程序把相应的IO命令转化为SCSI命令,并发给iSCSI Initiator,(4)iSCSI Initiator把SCSI命令封装打包,通过网络发送到iSCSI Target模块,(5)当iSCSI Target模块收到iSCSI命令包后,它把iSCSI命令包中的SCSI命令发送到SCSI的底层驱动程序,(6)由SCSI底层驱动程序完成IO请求。把数据按原路返回给用户。

用户态用户应用①文件系统网络协议栈iSCSI的Target②SCSI上层③iSCSI的Initiator⑤SCSI底层④网络协议栈核心态SCSI磁盘⑥ 图 1.10访问iSCSI Target设备的I/O流程

总之,如果说存储接口为存储系统划分了几个横向具有标准接口的断面,那么一条存取路径就是纵向贯穿存储层次连接从请求发起的应用到数据源的通道。在读数据过程中,读请求顺着特定路径达到物理存储设备,数据准备好后,数据沿着特定道路返还给用户;在写数据过程中,数据沿着特定的路径到达物理存储设备,数据写到物理存储设备后,确认信息返回给用户。

I/O请求的响应时间就是数据和请求命令(或者写确认)在存取路径往返的总延迟。因此一种减少响应时间的方法就是缩短实际的存取路径,而在存储系统每层的接口处设计cache机制提供请求在本层的命中率,从而减少I/O请求的响应时间。

在大容量存储系统中应用发出的文件需要从多个存储结点获取数据,那么一条存取路径往往在主机系统I/O栈的底层分裂为几个相对独立(横向和纵向)的子I/O路径(I/O路径

是位于两个部件或者设备之间传送数据的通道),分别从相应的存储结点读取数据。例如应用通过分布式文件系统存取文件,一个文件请求有可能分裂成对应多个存储结点的相应分条文件发出的子I/O请求。

1.5 存储空间组织和管理

存储系统中可能包含多个存储设备,如何建立一个架构保证用户和应用程序一致和透明的存取这些存储设备中的数据是存储系统设计者需要重点考虑的问题。一个最为简单的方式就是把不同存储设备抽象为存储空间,建立相应的数据结构以维护存储空间,并提供操作集对于存储空间进行存取、组织和管理。通过这种方法可以把一个复杂的大规模存储系统简化为若干存储空间的集成,通过I/O路径的分析能够清晰的分析不同存储空间之间的逻辑联系。

实际上,前面讨论的文件和块级的标准存取接口为抽象存储设备提供了一个好的平台。正是因为接口的抽象性和设备无关性,使得存储空间这种抽象过程能够很方便的应用于实际的存储系统设计之中。

1.5.1 存储空间的基本概念

计算机存储系统从整体上讲分为物理存储系统和逻辑存储系统,物理存储系统就是把多个同构或者异构存储设备(内存、磁盘、磁带等)通过连接部件(总线和网络)连接起来构成一个整体供计算机存储数据。而逻辑的存储系统就是在物理的存储系统上构建可以相互映射的多个存储空间并提供相应的操作供计算机存取数据。文件系统属于典型的逻辑存储系统。数据的存取过程从本质上讲就是寻址和解释的过程。因此,我们有必要引入一个逻辑概念,描述复杂存储系统结构。

存储空间(Storage Space)是一种逻辑存储结构,它对上层应用提供寻址空间和相应的逻辑存储单元(Logic Storage Unit),并提供操作集(Access Operations)用于存取存储单元中的数据;同时在内部具有表示存储空间的数据结构(Meta data)实现逻辑存储单元和下层存储空间地址的映射关系;同时具有访问下层存储空间的存取操作集,把上层对于逻辑存储单元的数据存取请求解析传递给下级存储空间。

存储空间的定义是递归的,直到磁盘驱动器把上层的数据请求变成实际对于存储介质的物理存取操作。

存储空间包含三个要素,第一个是逻辑存储单元及其地址空间(编址方法),它构成存储空间的用户视图;第二个是存储系统元数据结构,它维护逻辑存储单元和下层存储空间的映射关系;第三个是操作集,包括存取操作(上下层的数据操作语义)。 如果两个存储空间的操作和存储元数据结构是相同的,则称这两个存储空间是同构的。

需要说明的是存储空间中的逻辑存储单元和下层存储空间的逻辑存储单元不一定是一一对应的。一个地址对应多个存储单位可以产生镜像和多副本的作用

存储空间A的操作集和地址空间存储空间A存储空间A的内部结构存储空间A存储单元集合存储空间B的操作集和存储空间C的操作集和地址空间地址空间存储空间B的内部结构存储空间C的内部结构存储空间B存储单元集存储空间C存储单元集合合图1.11存储空间的包含关系

存储空间B存储空间C

存储空间是可以嵌套的,如图1.11所示。通过在下一级存储空间上提供新的地址空间和存储操作的方法可以实现新的逻辑存储结构,也就是新的存储空间。最下层的存储空间就是物理存储设备,它提供物理的存储介质和在这些介质上的机械和物理操作。

一个存储空间可以跨越若干个物理设备,也可以是一个物理存储设备的一部分。另一方面不同的结构中存取数据对计算速度的要求也是不一样的,在不同存储介质上数据的读取不仅仅受介质存取方式的影响,还要受到数据组织方式的制约。这表现在数据的组织即管理程序也是需要执行时间的;数据的组织结构对于如何存取数据产生巨大的影响,例如在内存中是以数据块进行线性编址,而文件系统的组织形式是一个树状结构,而两种情况下读取数据的方式是极其不同的。

在计算机系统中对于数据的操作包含两类语义,一种是文件操作语义,一种是数据块操作语义。前者对应于文件系统,后者对应于存储设备。根据这两种操作类型,逻辑存储空间分为文件存储空间和数据块存储空间。从逻辑上讲存储空间内部存储单元之间应该是同构和独立的,对于存储空间内的两个存储单元的访问应该具有相同的存取特性。然而,由于逻辑存储空间毕竟是由物理设备的物理存储空间构成,不同的设备以及设备内不同位置的存取属性是不同的(如存取速度等),并且这种差异会随着实际负载状况而变化。

另一个方面,如果一个存储空间跨越一个存储设备的物理存储边界,其空间内部的差异问题表现的更加显著,对具体的存取操作性能有着直接的影响。从技术上讲,设计一个存储系统有两个目标,第一是如何把多个物理上分离的存储空间组成一个统一访问的存储空间,可以使用相同的数据结构和操作语义,这也是存储虚拟化的目标。第二是如何根据物理存储设备的不同属性建立一个符合平衡存储多方面需要的最优系统。上述两个目标在实际实现时往往具有矛盾,前者要求忽略底层设备的差异,应用透明地访问存储系统,实现操作的简单性和可移植性,而后者要求负载和存储差异可知,系统能够根据这些差异进行合理调度优化。显示中,存储系统的设计往往争取在这两个目标之间取得平衡。

存储空间的元数据表示空间的组织结构,对于树状结构的存储空间,因为它最终建立在物理线性存储介质上,因此元数据不仅要表示树状结构,同时还必须完成变换到线性空间的数据分配,例如inode或者FAT表。元数据存放的位置也是在存储设备上,因此元数据的读取往往是存储系统中最为频繁的。

当多个用户同时访问存储空间某个共享的存储单元或者数据结构时(例如FAT表),就有可能产生并发访问冲突。冲突的原因来源于用户对于共享数据的修改,如果所有用户都是读共享数据则不会产生问题,但一旦有用户对于数据进行修改时就会产生数据不一致的问题,这又分为几种特殊情况,第一如果只有一个用户修改数据,而其他用户只是使用数据,那么是否应该把更新数据广播给其他只读用户;第二,如果有多个用户同时修改数据,如何

确定所有更新中那个数据是最后有效写到存储单元中的,并且是否通知其他用户写失败。

因此对于一个支持多用户并发访问的可共享的存储空间必须提供并发操作语义,也就是在并发操作发生的情况下规范不同用户的行为。例如提供写排他锁机制,也就是同时只能允许一个更新操作。事实上POSIX标准中提供锁机制来保证并发存取。

1.5.2 存储空间和主机的关系

网络存储系统的出现,使得存储空间和使用存储空间主机之间的关系更加复杂。从存储空间的定义来看,存储空间三个要素:存储单元及其地址空间、元数据结构和存储空间操作,在网络存储系统中往往物理上相互分离。存储空间结构通过在存储空间元数据结构及其相应的操作实现,而操作往往涉及到谁操作,如何操作的问题。一个存储空间中也许对应着多个下层存储空间,而它们在物理上属于不同的主机系统。

从主机和存储空间之间的访问关系模式可分为主动存取模式和被动存取模式。 主动存取模式是指存储空间仅仅提供存取内部存储单元的接口操作和地址空间,对于存储空间内部的元数据操作和维护由存储空间所在的主机完成,也就是客户和存储空间通过请求/响应过程交互,表现为客户/服务器模型。事实上NAS就是主动存取模式。

被动存取模式是指存储空间的操作是由请求存储操作的主机完成的,存储空间提供的操作是以功能库的形式实现。例如磁盘卷和相应主机之间的关系。

现在讨论一下存储控制域(Storage Control Domain, SCD)的问题。

存储空间管理器也就是维护存储空间,响应对该存储空间的存取请求,完成请求和数据在存储空间上下层传递的主机(处理器)。

存储空间的入口点(entry)是指存储空间接受存储请求的入口,往往以标识的形式作为请求的参数。事实上存储空间的入口点也是存储空间管理器的服务点。

存储控制域就是某个主机可以采用被动存取模式访问的存储空间总和。也就是主机需要维护和管理的存储空间的总和,对于这个存储控制域的存储请求都由这个主机负责完成。这个主机是存储控制域所有存储空间的共同的管理器。主机是逻辑概念,实际可以是物理上的一个、多个主机或者单个处理器。

因此存储空间属于该空间管理器的存储控制域。一个存储空间只能属于一个主机的存储控制域。这说明存储空间和管理器之间是一对一的关系;而主机和存储空间的关系是一对多。

访问存取域是指如果某一主动存储空间可以被一个客户机访问,则称存储空间属于这个客户机的访问存取域。数据存储域(Data Access Domain, DAD)就是指一个处理器或者主机可以访问的存储空间的总和。

某一主机的数据存储域包括存储控制域和访问存取域。图 1.9展示了三个概念之间的关系。如果一个存储空间属于某一主机A的控制存取域,而属于另一个主机B的访问存取域。一般而言B通过A提供的接口实现对存储空间的访问。

对于主机系统而言,自己的存储子系统所有存储空间构成主机的存储控制域,在网络存储系统中,NAS设备对于自身的处理器构成一个存储控制域,而对其他可以访问NAS的主机而言,NAS设备是一个数据存储域,而SAN中的设备则可以包含在多个主机的存储控制域中,由于数据块存储空间并不提供并发操作语义,因此存储控制域的重叠会产生数据的共享冲突和数据一致性的问题。而数据存储域的重叠虽然也会产生数据共享冲突和数据一致性的问题,但可以在重叠的数据存储域中设置控制器或者并发操作语义避免冲突操作。

服务器数据存储域控制存取域访问存取域控制存取域存储空间A iSCSI 存储空间B(NAS,FTP)存储空间C(iSCSI)

图 1.12存储控制域、访问存储域和数据存储域之间的关系

需要说明的是存储控制域的形成。在主机系统中由于存储设备通过外部总线连结到主机系统总线上,因此,在物理上对于存储设备的控制权完全由相应的主机获得,具体的讲就是通过文件系统或者设备管理软件对存储器上的存储空间进行抽象和管理。现有的基于数据块存取的系统,虽然通过存储网络访问远端的存储设备,但是文件系统仍然认为这个数据块存储设备为自己所独占。即使远端存储设备是主动存储空间,但是完全按照传统的数据块操作语义,对于通过高层语义使用存储空间的存储客户而言还是被动存储空间。

一个存储空间如果同时属于一个或者多个存储控制域,那么存储空间就会产生存储控制冲突。因为每个域控制器都会按照自己执行次序存取数据,特别是在内存修改元数据,当访问同一存储单元时,会产生冲突;如果不同时间访问同一存储单位,由于其他处理机不知道存储单元中的数据已经被修改,那么会产生数据不一致的问题。

多个主机同时访问访问存取域中的共享存储空间时,如果一个存储单元内的数据在有效期内被修改,而其他可以访问此存储单元的主机并不知道此存储单元已经被修改,会产生数据一致性的问题。这个问题可以通过在共享存储空间中定义并发操作语义进行协调解决。

1.5.3 存储空间的合并

考虑到一个存储系统包括N个存储资源,每个存储资源作为一个独立的存储空间存在,这些存储空间可能有相同的或者不同的操作语义和存储结构,为了通过统一的方法存取这些存储资源,就需要在它们之上建立新的存储空间,使得用户存取数据时不必知道存储系统具体的组织结构和实施细节。显然不同的存储空间合并方式会对新存储空间的性能、可用性等产生巨大的影响。在本节我们称上级存储空间为父空间,下级存储空间为子空间。

(1)空间直接相加

如果两个或者多个子空间具有相同的组织形式,把每个子空间的地址空间通过叠加或者简单扩展统一成全局地址空间,全局地址空间中的每一个地址对应于子空间中特定的存储单元。则这种合并方式称为空间直接相加。

如果各个子空间是同构的,也就是对外提供的操作相同,在父空间的入口点增加子空间入口点的标识,能够请求通过父空间的入口点路由到子空间的入口点,由子空间完成具体的请求。这样的方式不用改变子空间结构和操作。子空间保持相对完整,构造出的父空间和子空间是同构的。

把多个树形子存储空间合并,每个子空间作为一棵子树挂接到父空间的树上。这样产生的新树形结构构成了父空间。而树上的节点构成了一个树形的命名空间。

在线性存储空间,每个子空间按照顺序线性编址,可以看成两级编址。首先定位那个子空间的入口点,其次再确定子空间中的偏移地址。

异构子空间同样可以采用空间直接相加的方法实现空间合并,但方法较同构子空间而言更加复杂。由于每个子空间的操作各不相同,基本的思路是父空间的入口点把请求操作本身作为路由信息,把请求转发到相应的子空间中进行处理。

空间直接相加的好处是不改变子空间的内部结构,不需要太多存储单元地址的转换。扩展性较好,某个子空间发生错误甚至失效都不会影响其他子空间的稳定;另外当有新的子空间加入时,只需在父空间的入口点增加路由信息。

但子空间的健壮性由子空间自己维护和保证,系统的整体性能主要由子空间的性能决定,这样并没有充分利用空间融合的优势,提高整体的可用性或者性能。

(2)变换合并

父空间中的每个存储单元和子空间的存储单元不存在简单的一一映射的关系,必须经过特定变换。父空间和子空间不一定同构。变换过程可以是简单的地址函数,也可以是复杂的寻址。

例如RAID1系统,父空间一个存储单元实际对应着两个或者多个子空间的存储单元。而文件存储空间就是在一个或者多个线性存储空间上实现了树形结构。

变换合并方法的缺点是扩展时需要空间的重构,扩展性相对较差;一个子空间的失效有可能会引起系统整体失效;请求路由比较复杂。

变换合并方法的优点可以定制父存储空间结构满足某种应用需要。例如利用多个子空间并发存取提高系统整体性能,例如RAID0就是把多个磁盘的空间通过组合之后构造成逻辑卷,逻辑卷中的一个分条对于不同磁盘上的条带,条带间的读写可以并行执行。这种变换在线性子系统中较为容易,只需把父空间的一个存储单元划分成几个子单元然后映射到不同的子空间存储单元。在树形空间中较为复杂,必须使用一个复杂的数据结构记录这种变换关系,事实上分布式文件系统的元数据服务器就是完成这个功能,例如Lustre。而且由于文件系统的最小单位是文件,因此只能同一目录的文件分散到不同的存储子空间中,在存取整个目录时才能产生并行的效果。

在考虑利用多个子空间提高整体可用性时,可以把一个父空间的存储单元完全映射到几个子空间的存储单元,也就是子空间相应存储单元互为镜像。

(3)异构存储空间的合并

如果子存储空间之间的内部结构和存取操作是不同的,则称为异构子存储空间。在这种情况下对于多个子空间进行合并,例如要求一个NAS服务器和iSCSI服务器给用户提供一个统一存储视图。一般的原则是父存储空间选择自己一种接口模式及其操作集,然后在内部实现和子空间不同存储结构之间的变换,把对自己的存取操作翻译为对子空间的操作语义;同时实现子存储空间地址空间整合。对于上面的例子,可以在iSCSI设备之上构建一个文件空间(格式化iSCSI卷),然后通过把它和NAS提供的文件空间合并。

1.5.4 存储空间的可用性

存储空间的可用性体现在两个方面,一个是存储空间整体可用性,指存储系统不会整体失效;另一方面是部分可用性,就是指系统一部分存储单元失效,只造成部分数据不可访问,而不会引起其他的数据失效。

在线性存储空间中,由于存储单元之间逻辑上相互独立,存储空间地址映射也较为简单,因此某些单元的失效仅仅局限于这些单元。对于树形存储空间而言,某个节点的访问,必须从根开始检索;子树的可用性往往依赖于上层节点的可用性,当子树失效时,一般不会引起其他部分的失效。

如果存储空间的存储单元和n个下级存储空间的存储单元有映射关系,这种关系包含两种类型;一是上下级存储单元存储的数据完全相同(可用性就是并集的关系),另一种关系

是多个下级存储单元中的数据联合通过计算(如RAID5的校验)起来才能构成上级存储单元的数据内容(可用性是交集的关系)。两种情况下,存储单元的可用性是不同的。

同时因为不是所有数据都要求相同的可用性,而且维护可用性的代价也是很高的,存储管理系统最好能够按照数据的价值安排。

1.5.5 存储系统的层次结构

随着网络存储系统的规模不断增加,系统内包含大量的软硬部件,每种部件有具有各自的接口、规格和功能,物理部件包括网络物理线缆、以太交换机、主机等等,而软件部件更是多种多样,包括应用软件、文件系统和数据库等。作为一个存储系统设计者需要一张“地图”标明各种软硬件部件应该所处的位置,及其软硬部件之间的关系,从而能够设计出一个完整的存储系统。

存储系统在整个层次结构中包含多个软硬件模块,每个模块通过特定的接口提供存取操作,而存取路径从请求起点到数据源纵向贯穿各个模块。存储系统整体的层次结构如下图所示,总体分为文件操作层和数据块操作层,由于可以使用统一的命名空间管理文件和对象,因此对象存储设备可以通过全局命名空间层管理。

应用程序文件/对象操纵层文件记录层全局命名空间全局文件映射层本地文件映射层全局逻辑卷层逻辑卷/数据块层存储介质逻辑卷映射层SAN设备卷(包括各种形式的网络TCP/IP,FC,Infinband)FC网络层(包括各种形式的网络本地块设备(磁TCP/IP,FC,Infiniband,VI等)盘或者磁盘阵网络数据块存储设备列)本地磁盘卷存储物理介质远程文件层(NAS)对象存储设备(OSD) 图 1.13复杂存储系统的层次结构

事实上每一层都对于上层屏蔽底层的信息,从逻辑上每层都是一个逻辑存储设备,具有独立的存储空间(可以是命名空间,也可以是线性块地址空间)。多个相同抽象层可以通过横向的存储空间合并和操作集集成起来形成一个更大规模的存储系统。这也是存储系统扩展和虚拟化的一般方法。

SNIA提出的网络存储系统的逻辑参考模型,它首先明确软件部件所应该具有的功能,及其在整体系统中的位置;然后说明这些软件部件和硬件部件的关系。在如图 1.14所示的第一个版本,它把存储系统分为三个层次,分别为应用层、文件/记录层和块接口层,这和我们前面对于存储系统的接口描述是一致的;而在物理层面,主机通过网络和设备相连,主机具有较高的数据抽象(文件或者记录),而设备主要提供块设备语义。在第二个版本中,在文件接口层和块接口层引入了存储系统虚拟化模块。并通过SMI-S等管理协议对于整个存

储系统进行统一的管理,进而明确描述了管理的要求,如设备发现机制、审计和备份等。

图 1.14 SNIA提出的网络存储系统的逻辑参考模型

1.5.6 存储虚拟化

事实上,使用存储空间组织和管理的方式,能够很容易把多个存储设备或者子系统统一成为一个逻辑设备或者系统进行管理和存取。而这一个实现方式在逻辑上称为存储虚拟化。存储虚拟化就是在物理存储的基础上建立一个抽象的逻辑存储系统,现在被广泛应用于存储功能栈各层。从存储空间合并的角度看,存储虚拟化就是整合不同存储设备和子系统的存储空间为用户实现一个统一的全局存储空间。存储虚拟化将物理的存储实体与逻辑的存储实体分离开来。它在物理存储设备与访问存储设备的客户端之间加上一个抽象层,抽象层隐藏了存储设备的复杂性,提供给客户端一个简单、通用的存储池。

存储虚拟化实现了数据存储的位置无关性。虚拟化系统把用户对于数据存储逻辑空间的

存取映射到实际的物理存储设备之上。

网络级存储虚拟化是由加入到存储网络中的专用装置(Appliance)实现的,它是装有存储虚拟化管理和应用软件的服务器平台,它能够对存储网络进行管理和配置{Elizabeth, 2003 #220}。称这个对存储网络进行管理的平台为Manager(管理器、存储虚拟化控制器)。Manager的实现方式分为两种:(1)对称(Symmetric)或带内方式下的(In-band)存储虚拟化;(2)非对称(Asymmetric)或带外方式下的(out-of-band)存储虚拟化。

图 1.15对称和非对称方式的存储虚拟化

图 1.15显示了对称和非对称方式下存储虚拟化的结构。这两种实现方式的根本区别在于数据流和命令流的是否经过Manager(管理器、存储虚拟化控制器)转发。在对称结构中,数据流和命令流都要经过Manager(管理器、存储虚拟化控制器)转发。在非对称结构中,命令流经过Manager转发,而数据流在服务器和存储设备之间进行传输。

实际的映射行为依赖于实现方法。在一个SAN存储系统中,逻辑卷虚拟化的工作可以在三个层次做,第一个是在底层磁盘阵列控制器中进行;第二个是在光纤通道交换机这一层使用逻辑LUN映射到多个物理LUN上;第三个可以在服务器的HBA或者卷管理器中实现多个逻辑卷的集成。虚拟化软件或者设备维护虚拟设备的映射信息一致性,这些映射信息构成的映射表是一种元数据。

虚拟化软件或者设备使用元数据去重定向I/O。它把收到的输入请求(地址信息是逻辑存储空间的地址)转换为对于物理存储设备的请求。

1.6 设计方法

设计和优化存储系统是一个非常复杂的任务,存储系统是包含多个软硬部件的计算机系统,正是这些部件协调工作保证数据存取过程的高效和可靠。首先设计者必须努力理解系统整体结构和各个软硬件部件运行的细节,必须综合考虑软硬件部件设计和全局优化两个层面的问题。在这一过程之中,需要使用一系列方法和工具对于存储系统功能和性能进行研究和分析。

在对一个存储系统进行优化和设计的过程中,需要测试手段发现现有系统或者部件的性能瓶颈或者其他的不足之处;在此基础之上提出新的机制或者优化方法改善存储系统整体或者局部性能;之后设计与优化方案需要合理的测试方法加以评估。在这一设计循环中,测试

工具、方法和技术显然占据了重要的地位。

在讨论如何测试和评价存储系统性能之后,接下来将探讨设计和分析存储系统性能的指导原则。

1.6.1 测试方法

测试是对于存储系统的性能和功能进行评价必不可少的环节。测试发现存储系统的性能瓶颈,然后加以解决,这一研究模式一直有效推动存储技术的发展。因此本节主要讨论性能测试方法和工具。

正如前面已经讨论过,存储系统和部件最为重要的性能指标就是吞吐率和请求的响应时间。但这两个指标又极其依赖于用户的请求行为模式。事实上按照请求发生的方式可以把现有的测试工具分为三类:合成I/O测试、基准测试集和基于trace的测试。

文献{Traeger, 2008 #34}从最近9年内106篇论文中调查了415个文件系统和存储测试工具,发现没有一种测试工具能够全面的反映存储系统的实际性能。 1. 合成测试程序:

合成测试程序的I/O产生器依赖于存取模式的定义。一些研究往往能够统计真实负载的发生规律,例如请求的读写比例、大小、频率和分布等信息,在此基础之上建立相应的存取模型。然后在测试时,产生符合存取模型的I/O请求序列,通过合成测试程序产生实际的负载发送给存储系统,并统计执行情况。

这类典型程序包括IOmeter、IOzone、IOGen和Bonnie++等。

IOmeter由Intel于1998年开发用于评价I/O子系统性能的测试工具,基于客户/服务器模式,在2001年IOmeter被移交给开源实验室(Open-Source Development Lab)维护。它使用一个图形界面显示和管理多个Worker(代表一个独立的测试进程)的配置和运行。IOmeter可以定义存取模式,包括请求块大小、随机和顺序请求的分布、读写比例和突发模式等。事实上IOmeter现在也可以用于集群存储系统的测试。

FileBench是Sun Microsystems开发的使用脚本言语进行配置的测试工具。通过脚本,它能够生成模拟应用程序行为的负载,包括模拟NFS邮件服务器,文件服务器,数据库服务和web服务器等。 2. 基准测试集:

使用基准测试集测试计算机系统的性能一直是有效和精确的评价方法。针对存储系统的测试研究也大量使用基准测试集。基准测试集能够模拟应用程序的行为,相对于合成测试能够更好的反映用户的行为特征。

事务处理性能委员会(TPC, Transaction Processing Performance Council)提出了一系列基准测试集用于评价计算机系统进行事物处理的能力,包括若干测试集,TPC-App,TPC-C, TPC-E, TPC-H等。其中TPC-C是一个联机事务处理的测试集被广泛应用于测试存储系统对于基于数据库应用(银行,航空订票业务等)的支持能力,它通过每秒事务数来描述系统的性能。TPC-C定义于1992年,是一个数据密集型基准测试集,其数据仓库包括股票、订单和付款等。数据库包括9种类型的表,具有不同的记录数和大小。它的评价指标是每分钟执行的事务数。

而Postmark则是模拟大量短生成周期、小文件处理的过程,代表了包括电子邮件、新闻组和基于web的商务应用等业务对于服务器的I/O需求。Postmark产生于1997年,是一个单线程合成测试程序。Postmark可以配置文件和子目录的数量,文件大小范围和事务的个数。开始运行时,它首先按照定义的范围和大小生成一个随机文本文件池,然后执行事务操作。每个Postmark事务有两个部分,一个是文件的生成或者删除操作,另一个是文件读或者更新操作,这两个部分的比例是可以配置的。由于Postmark仅仅大致模拟文件系统的

行为,并没有真实运行实际的程序,其CPU占用率效应实际系统的处理需求。

另一个广泛使用的基准测试就是面向编译过程的测试,包括编译内核,Apache等。考虑到编译过程一直是CPU和I/O密集型应用,而且是一种典型的应用类型。因此能够通过运行编译程序,观察和分析存储系统的行为。但这个测试方法依赖于实际的系统配置,包括编译器及其参数的选择。

标准性能评价公司(Standard Performance Evaluation Corporation,SPEC)成立于1988,现在有超过60家公司参与,目标是建立标准和实际的性能测试集。在这些测试集中,SFS(SPEC SFS)测量NFSv2和NFSv3服务器的性能,包括吞吐率和响应时间。它在客户端上运行事先定义的负载脚本产生各种实际的文件和目录操作,然后统计单位时间内完成的操作数量来评价NFS的性能。

存储性能委员会(Storage Performance Council,SPC)为存储系统开发了基准测试集。目标是更多设备提供商使用工业标准的测试,并且以标准的方式发布其结果。这个测试集包括SPC-1和SPC-2。SPC-1执行典型的就有OLTP特征的商业关键应用,它包括三个测试。第一个测试成为主测试,包含三个阶段,第一个阶段在具有持续稳定吞吐率的系统稳定状态运行三个小时,第二个阶段测试10分钟使得系统保持最大吞吐率,第三个阶段执行50分钟,在不同的负载水平下,测试吞吐率和响应时间的关系,以决定在轻负载情况下系统的平均响应时间。第二个测试再次执行具有最大I/O吞吐率的负载,确认这是可重复的。第三个测试通过在存储空间随机位置写随机数据,来测量所有存储空间是否稳定和一直。相对于SPC-1的随机任务,SPC-2关注于具有大数据顺序负载的商业关键应用。

其他的标准测试集还包括NetNews,Netbench等。 3. 基于Trace的测试:

基准测试集虽然很大程度上能够模拟典型应用程序的行为,但是一些大型存储系统往往需要同时运行多应用程序,或者支持成千上万用户对于存储系统的并发访问,而基准测试集很难反映这种混合行为。

针对这种情况,一些研究者在真实系统的文件系统或者块设备层搜集所有的I/O请求信息,并按照一定格式记录在trace文件中,一般包括请求时间、请求类型和请求大小等。在测试时,重播程序按照trace文件中的记录向存储系统发出I/O请求。

从服务器中获取大量复杂的存储活动的trace,是一个非常有挑战性的任务。公开这些trace更加增加了它的难度。事实上trace是不容易获得,因为系统管理员不愿意为了跟踪记录计算机行为,而增加很多额外开销;还有就是,企业出于安全或是私人的原因而不公开他们的服务器的trace信息,所以公开有用的trace比较难以得到。

在过去近20年中,各种各样服务器的I/O的trace被收集和公开:最早1992时从加州伯克利大学在Snake文件服务器中,收集了4个月的磁盘块级trace。而HP实验室一直在其研究部门的服务器上搜集大量的trace。在Internet迅猛发展之后,大量web服务器、搜索服务器或者文件服务器的关于存储的trace被收集起来应用于研究。

从2007年开始,Microsoft公司开始利用ETW等工具跟踪、记录公司研发的系列服务器产品在各种负载下的trace,并在SINA网站中公开发布。用来支持公司内部和外部的硬件开发人员和软件开发人员的研究。例如 Windows服务器可以通过命令行或是WMI(Windows Management Infrastructure )calls选择性的增加一些扩展性的工具收集trace,一般是5-24个小时,主要包括的是文件和磁盘I/O事件,最终的目的是自动获取、核对、分析存取行为,对于trace数据模糊处理。从单个trace中提取出来各种各样的参数,对于确定识别和分析负载的一般I/O行为是至关重要的。

重播trace并不是一个容易的过程。事实上在大多数情况下,在重播前必须修改trace数据,例如遗失操作并没有记录在trace数据中,但需要在重播时猜测执行。并且,由于重

播测试自己的加入可能增加了CPU或者存储负载,使得一个存取密集型trace也许在重播系统中无法执行,因此在重播时必须仔细考虑其执行速度。

在使用trace进行测试时,还必须考虑trace的失效性,因为10年前的trace显然反映当前应用的实际运行情况。

1.6.2 系统仿真

此外,由于存储系统的复杂性,包含大量软件部件,如果在真实系统上验证和优化方案显然是一个成本很高的工作,使得设计者必须花费大量精力掌握各种系统和部件的实现细节,难以集中关注自己的主要设计目标;另一方面,也会延长设计周期;同时,原型系统特别是大规模系统的购置和维护成本也是非常高的,并不是所有的研究工作都能配置真实环境的。因此,通过软件仿真存储系统的运行就成为一种高效的研究手段。

DiskSim是一种高效、精确和可配置的磁盘系统仿真工具,由卡内基梅隆大学并行数据实验室开发的,目前已成为存储领域最为流行的仿真工具。它包括所有的第二级存储部件,包括设备驱动、总线、控制器、磁盘驱动器等。并且能够支持外部满足格式基于trace的I/O发生器和内部的合成负载,目前也能支持大规模存储系统的仿真。由于DiskSim是一个开源的项目,因此很多设计者把自己的优化设计方案在DiskSim中实现,并通过运行DiskSim来评价其设计方案。

而NS(Network Simulator)是一个开源的基于离散时间的网络仿真器,被广泛用于网络领域的研究,可以模拟各种协议和网络的数据传输过程。NS建立在C++基础之上,通过OTcl和Tcl提供仿真接口。用户可以使用OTcl脚本描述网络的拓扑结构,并可以设置特定的参数。NS于1989年开发出来是REAL网络仿真器的变种。从1995年开始NS获得了DARPA的支持,并在多个研究者和机构合作下共同开发。

事实上,大规模存储系统总是基于网络的,因此使用NS2可以模拟网络存储系统中网络运行情况、发掘和研究网络对于存储系统整体性能的影响。

1.6.3 优化方法

对于数据存储系统的优化一直是一个重要的工作。无论作为设计者构建新的存储技术或者系统,还是系统管理员维护系统的正常运行都需要对于系统进行优化。当然优化目标往往基于不同的应用需求,其衡量的方法和指标也是不同的。但提高系统的运行性能一直是优化的主要目标,存储系统的性能主要体现对于负载的平均响应时间以及系统的吞吐率。

数据存储系统的性能改善一般从三个方面入手,一个是部件的物理性能增加,二是系统结构的设计和优化,包括物理结构和逻辑结构,例如RAID5技术就可以提高系统的性能。三是针对特定应用程序的I/O负载进行优化,提高特定存储模式下的存取性能。

对于数据密集型应用如科学计算等需要存储系统有很高的性能。I/O优化是提高存储系统性能的重要手段{Meenakshi A. Kandaswamy, 2002 #13}。

一些常用提供存储系统性能的原则包括: ? 加快经常性事件,针对经常性行为优化系统设计; ? 增加新语义信息优化调度; ? 使用冗余的方法提高可靠性; ? 使用cache和预取优化存储系统性能; ? 使用异步I/O替代同步I/O; ? 通过并发性提供系统吞吐量; 下面列举几种常用的I/O优化方法。

1. 数据缓存和预取

缓存技术(cache)是一种最常用的提高计算机系统性能的有效方法{Hu, 2002 #15}。在存储系统中,利用数据的空间局域性和时间局域性设计cache机制,能够提高数据存取性能,事实上在存储系统的每一层都大量使用cache技术,例如文件系统就有很大的buffer用于缓存底层存储设备的数据{Hu, 2002 #17};而通过在客户端设置缓存可能减小客户端和网络存储设备的实际数据交换次数。也可以利用不同存储设备性能容量之间差异使用上层高速存储部件作为下层低速存储部件的数据缓存,例如使用磁盘作为磁带库的cache,构建虚拟磁带库。但缓存方式也有其负面影响,例如多级的缓存会产生数据不一致的情况。同时缓存机制的有效性也严重依赖于负载的行为特征。

对于存取模式表现出规则的程序,可以通过算法预测其后续的I/O请求,通过预取机制充分利用系统带宽,仅仅用在有额外的带宽情况下,提前读取数据到缓存中,可以极大的提高I/O性能{Xin Chen, 2003 #20}。大部分采用预取的程序都使用异步I/O从文件系统中读数据{Yan Solihin, 2003 #23}。

这种方法严重依赖于对存取模式的预测,如果存取模式不匹配,不但不会提高性能,还会因为多余的I/O开销增加请求的响应时间,同时由于占用缓冲区可能会导致请求的命中率下降,从而降低整体性能。

2. 针对设备存取特性优化

除了提高单个存储设备的物理性能外,根据存储介质物理存取特点,优化存取过程也是提高存取性能的有效方法。

例如文献{Jiri Schindler, 2003 #11}介绍了一种在磁盘的磁道边界内定位和存取数据技术,系统避免大部分传统的延迟和跨磁道的延迟。通过这种方法对于中等数据大小(100-500KB)提高了50%的性能。可以根据磁盘外道的数据传输率比内道高的特点,把热点数据放到外道,提供这些数据的响应时间。

3. 理解上层操作语义

标准接口和操作语义往往会过滤掉上层I/O行为的有用信息,造成产生不必要的负载和延迟。例如应用程序仅仅需要读取某一文件的头1KB信息,那就没有必要等待整个文件被读进内存。

文献{Muthian Sivathanu, 2003 #12}提出了一种理解语义的磁盘系统(semantically-smart disk system,SDS)。也就是磁盘系统能够理解上层文件系统的数据结构和操作行为,从而根据这些信息优化磁盘系统性能。

4. 合并顺序小I/O

无论I/O的大小,它们往往都需要对于请求本身的处理过程,因此处理大I/O比小I/O对存储系统而言能更好的发挥其吞吐率。

Collective I/O{MTara M. Madhyastha, 2002 #14}通常使用在多处理器系统中,其基本思想是使用一个处理器代表其它处理器批量执行I/O。这种技术通常用在数据的逻辑分布不同于物理分布的情况。这种方法必须在I/O完成后,把相应的数据发送给对应的处理器,所以也称为两阶段I/O。

Del Rosario首先提出了这种方法,每个处理器读具有最小开销磁盘上的数据,然后通过网络进行数据交换。虽然这种方法增加了通讯开销,但它通过合并多个I/O到一个较大的I/O,从而减少I/O请求个数,提高I/O效率。Collective I/O已经在PASSION库和MPI-IO中实现。

这种思想也在普通文件系统I/O调度中使用,如常用的电梯调度算法,通过调度程序把多个分离的I/O合并成一个大的顺序I/O,从而提供I/O性能。

5. 数据布局的优化

海量存储系统中具有不同性能的软硬件部件,而不同数据的访问热度也各不相同{Ng W.T., 2001 #24}。因此系统能够根据数据的访问情况结合各个部件的存取特征,合理在各存储层次组织数据就会有更好的整体性能。

存储层次的横向方面,把热点数据放到高性能设备上面。例如本地磁盘一般比远程存储磁盘有更短的I/O路径,因此有较快的响应时间;而在RAID系统中,RAID1一般比RAID5有更好的性能,因此在包含多种RAID阵列的存储系统中可以把高频访问数据放到RAID1,HP公司在其AutoRAID技术中就是采用这种思想。

在存储层次的纵向方面,把热点数据放到离处理器更近的地方。可以通过编译器或者其它的优化工具。它尤其适合大数据量、重复数据执行的应用,如多媒体中的热门电影。这种方法采用的是一种系统全局Cache思想。这表现在存储系统内设备性能是分层的,如Cache或者内存相对于磁盘而言具有更好的性能,但容量相对很小;特别是在网络存储环境,不同的存储设备及其在系统中所处的位置不同有不同的性能和容量。合理的文件布局使得数据更接近处理设备从而提供整体性能{E., 2002 #26} {Tanenbaum, 2002 #27}。

6. 负载平衡和I/O并发性

平衡I/O是把I/O请求在多个存储设备中均匀分布,从而减少因为一个存储设备负载过重,影响系统的整体性能。同时,可以进一步通过存储设备的并行提高系统的吞吐率。RAID0就是一种很好的平衡I/O和I/O并发方法。

尤其在固态盘中,存储空间实际上由多个芯片组成,固态盘控制器把数据尽量均匀的分配到所有芯片上,通过每个芯片的并发传输提高系统的整体吞吐率。而且考虑到flash擦除次数有限的特性,尽量分散负载还能起到损耗平衡的作用{Euiseong Seo, 2008 #69}。

7. 减少不比要的数据传输

在数据存储系统中往往包含一个数据块的多个拷贝,包括在多个节点之间以及内存和磁盘之间。为了比较两个数据块或者文件的一致性时需要读取整个数据块或者文件。现在可以通过Hash数据块的内容来建立数据块的索引或者比较数据块的差异,从而有效的减少实际的存储带宽占用。这需要使用一个很少冲突的Hash函数,才能保证数据块的Hash值是唯一的,因此称这个Hash值为数据块的指纹(fingerprint)。许多研究使用加密算法实现这种Hash算法,例如使用NIST(US National Institute for Standards and Technology,NIST) {Technology, May 2001 #28}的sha1算法作为Hash函数。它在安全系统中是一个著名的加密算法,很少产生冲突。sha1算法的输出是20个字节,在Pentium III 700MHZ的处理器上计算8KB的数据块需要130ms,每秒大约60MB。可以满足像备份系统这样的实际存储需要。从另一个方面,因为这种方法减少了实际的存储带宽占用,因此提高了如快照或者备份等存储系统的性能。

还有其它很多方法提高存储系统的性能,而且很多提高性能的方法往往交叉在一起使用。

1.7 本章小结

数据容量和重要性的日益增加对于存储系统提出了巨大的挑战。设计大容量、高性能、可扩展和高可用的存储系统,特别是高性价比的海量网络存储系统受到研究界和工业界更大的重视。

本章首先对于存储系统的整体概念进行了介绍,然后讨论了针对存储系统的评价指标和功能需要。为了进一步理解存储系统运行,讨论了存取路径和存取接口的分析方法;为了理

解海量网络存储系统和内部多个存储子系统的关系,我们提出了存储空间的概念,并分析其组织和管理原理;最后简单介绍了针对存储系统的设计方法,包括常用的测试工具、仿真工具以及优化方法。

本文来源:https://www.bwwdw.com/article/zx3g.html

Top