存储技术原理分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 存储I/O通道

要讨论存储I/O通道,必须先了解计算机总线。计算机总线是计算机的互连子系统,在计算机内部的各个组件之间,或者在不同的计算机之间进行数据传输的公共通路。计算机总线通常在争用资源的基础上工作,实现计算机系统内部和之间的地址、数据和控制信息的交换。

最初的计算机系统只有一条总线,CPU、内存、I/O设备全部挂接到这条总线上,所有设备都被限制在一个时钟频率下工作,整个系统的速度被系统中最慢的设备所限制,整体性能无法提高。现代计算机都采用特殊的桥接设备将低速设备和高速设备隔离开来,让它们处于不同的总线上面。从而形成了不同的计算机体系架构。

图1-59给出了Intel北桥/南桥架构的示意图。随着技术的发展,计算机体系也呈现新的趋势,例如将北桥集成到CPU之中。但大体来说,总线可分为以下类型:

图1-59 Intel北桥/南桥架构

• 内部总线:CPU内部连接各寄存器及运算器部件之间的总线;

• 系统内存总线:又称内存总线或前端总线,连接CPU和北桥芯片;

• 主机I/O总线:从北桥芯片引出,连接计算机系统中其他高速功能部件,包括南桥芯片SCSI适配器、网络适配器等;

• 存储I/O总线:即连接中低速I/O存储设备的总线,包括从SCSI适配器引出的SCSI总线、通过南桥桥接的IDE或USB总线等;

• 网络I/O总线:多个计算机之间相互连接的通信线路,例如连接计算机的以太网电缆。

虽然有其他形式,但本书中所讨论的主机I/O总线、存储I/O总线和网络I/O总线分别是指PCI、SCSI,以及基于以太网的。

1.4.1 存储I/O物理通道

为了讨论数据I/O路径,我们首先从有形的硬件开始,存储网络有以下六个硬件直接与I/O传输相联系,如图1-60所示。

图1-60 应用服务器的存储I/O物理通道

• 系统内存总线

• 主机I/O总线

• I/O控制器或网络适配器

• 存储I/O总线或网络I/O总线

• 存储设备和子系统

• 存储介质

I/O路径的第一个组成部分是系统内存总线。物理上,系统内存总线通常用来互连CPU和系统内存,以及高速缓存。外部设备,如I/O控制器、网络适配器等,数据访问速度比较慢,出于系统性能的考虑,通常使用桥接芯片将慢速的I/O设备和CPU等分开。慢速的I/O设备运行在主机I/O总线上,常见的主机I/O总线有PCI总线。

通过主机I/O总线后,沿着物理I/O路径的下一站便是I/O控制器或网络适配器,也就是常说的主机适配器(Host Bus Adapter,HBA),它既可以是主机I/O总线上插槽中的插卡,也可以是集成在系统主板上的一个集成芯片。常见的有以太网卡、SCSI适配卡和集成在南桥上的IDE控制器等。对于网络适配器,I/O路径的下一步就是网络I/O,常见的有以太网电缆。对于I/O控制器,则是存储I/O总线,例如对于SCSI适配卡,是并行的SCSI总线;而对于IDE控制器,则是最常见的ATA总线。

如果到达存储I/O总线,数据I/O路径的下一站是存储设备和存储子系统,它们处于存储I/O总线的另一端(或者叫目标器端)。存储设备,常见的有磁盘驱动器和磁带驱动器。而存储子系统,则是一组存储设备的集合,存储子系统的典型例子是RAID系统和磁带库。从微观上讲,存储设备和存储子系统并不是I/O路径的最后一站。通过存储设备和存储子系统,I/O很快到达了其最终目的地,即存储介质,如盘碟、磁带、CD或者其他介质。

如果I/O是发往其他应用服务器或存储系统的,则会通过网络I/O总线到达对方应用服务器的网络适配器,并且在对方内部经过类似的路径。先由主机I/O总线到达系统内存总线,进而又经主机I/O总线到达I/O控制器,在存储I/O总线上找到存储设备或存储子系统,被后者最终写到存储介质上,如图1-61所示。

图1-61 网络存储子系统的存储I/O物理通道

1.4.2 存储I/O逻辑通道

在简单描述了数据I/O路径的物理成分后,我们来探讨一下更有趣的软件成分,或者称为I/O路径的逻辑通道。我们专注于Linux操作系统来探讨存储I/O逻辑通道。Linux是一个分层的系统,下层对某些实现进行一定的封装,提供应用程序接口(API)供上层调用。但同时,Linux是又一个“松耦合”的系统,各个层次之间的依赖关系并不是非常严格的,这主要体现在:

• 下层会向上层注册某些回调函数供其调用,后面会看到非常多这样的例子,在此就不举例说明了;

• 下层也会调用上层提供的公共函数。一个很重要的例子就是SCSI子系统调用块I/O层的SCSI命令发送函数,发送INQUIRY等。

Linux存储I/O路径(包括网络I/O路径)如图1-62所示。在图中,左边部分为存储I/O所经历的各个层次,右边部分为网络I/O所经历的各个层次。

图1-62 存储I/O逻辑通道

大部分I/O开始于需要访问数据的应用,这里假设是系统调用。应用通常不管存储的细节,而是直接调用由操作系统提供的系统调用接口。提供数据的对象被看成是一个个的“文件”,由虚拟文件系统提供这种幻想。接下来,左边是存储I/O的执行过程,右边是网络I/O的执行过程。

存储I/O经过具体的文件系统到达块I/O子系统,经过通用块层、I/O调度层,最终到达块设备层。如果是虚拟块设备,又经过多次反复来到物理块设备,由它进入SCSI子系统。在其中经过高层驱动、公共层和低层驱动的处理,最终通过消息传递接口,被固件转换为硬件上的信号系列。

网络I/O则经过为各种网络协议栈提供一致接口的BSD套接口层,如果是TCP/IPv4报文,则从IPv4协议族层,经由TCP协议实现,到达网卡驱动层,同样,如果是虚拟网卡设备,又经过多次反复来到物理网卡设备,由物理网卡驱动通过消息传递接口,被固件转换为硬件上的信号系列。

本书的一个主要目的就是讲解I/O在路径的各个层次的处理细节。

1.4.3 虚拟机I/O逻辑通道

在虚拟机环境下,有来宾和宿主两个操作系统。在宿主操作系统和来宾操作系统中分别存在完整的存储栈,从而潜在有两种文件系统和一种映像格式。虚拟机技术的关键在于存储硬件(包括CPU、PCI子系统、SCSI子系统、I/O控制器、网络适配器等的仿真),在虚拟机上对文件的访问首先通过来宾机上的存储I/O逻辑通道,到达虚拟机映像文件,然后通过宿主机上存储I/O逻辑通道,最终被写到宿主机管理的存储介质上。这种虚拟机I/O逻辑通道的机理类似于栈结构,因此可称为虚拟机存储栈,如图1-63所示。

由于篇幅所限,尽管笔者对虚拟机设备仿真原理和虚拟机存储I/O路径也曾花费很大的时间和精力,却不能在本书尽述所得所感,只能期望在将来有机会出版本书的续篇时,弥补这一缺憾。所幸,本书对存储I/O逻辑通道的各个部分都做了详细的介绍,相信读者在阅读之后,将这些知识应用到对虚拟机原理的分析中,也必会有极大的帮助。

图1-63 虚拟机存储栈