IO协议栈前沿技术研究动态(2015存储峰会分享)
2015-12-14 冬瓜哥 (微信公众号:大话存储)
冬瓜哥:《大话存储》系列图书作者,现任PMC-Sierra存储系统架构师。
大话存储
冬瓜哥在由 DOIT 传媒举办的 12月10日的中国存储峰会上做了一次有关 IO 协议栈前沿技术和动态的技术分享,以下是演讲的精华内容。IO协议栈的概念
首先冬瓜哥向大家介绍了协议、栈和IO的概念。IO协议栈是操作系统里的一系列软件模块,让你的应用要读盘的时候,比如读一个U盘,U盘插上以后,点一个复制粘贴,复制粘贴是一个程序,并不是某个菜单,你点的这个菜单,激发了这么一个进程,后面起了一个进程,比如Linux下的做运维的都知道有一个dd的程序,这个程序会调用系统提供的一些代码。当然先得打开,然后做一个准备工作,然后才读写。这些代码都是OS提供的,你只需要调用就可以了。这些代码会被映射到用户空间里面。你把IO下发给这些代码以后,你把这些参数传给他,要读写哪个文件,哪个路径,哪个设备,怎么度,怎么写?把所有的参数告诉它。
它下一步实现一个操作叫陷入内核,中断到内核里面,这一步操作开始非常大,因为牵涉到权限的转换,开销是很大的。进入内核以后,先到一个VFS的层,这是一大块的代码,这个层就是目录层,比如C:/,Linux下/某个字母,再写一些字母。谁来维护目录和底层的存储的实体的映射关系呢?由VFS层维护,你访问的是一个网络盘的路径,还是一个本地盘的路径,是一个文件,串口,终端,其实都是符号,由VFS把IO下发给底下对应的承载者,底下画了四个承载者。还有跨设备的各种设备,还有网络的系统,还有内存里面的数据结构,比如/PROC,有一些运维的时候用的一些命令,把它从零改成一,触发了某一个逻辑,这都是内存里面的数据结构,也在这个符合下限。
这层再往下,如果访问块设备,直接下到块层,块层是最终对存储设备的集中访问点,在这个层里面,有一些附加功能,比如多路径,加密这种分层,缓存,很多的开源的这些产品,其实都是基本上在块层这个功能上面做二次开发做出来的。块层下面就是一个IO的队列,在这儿做一下IO的优化,合并,存盘这些事情。在这儿会有一个瓶颈,就是IO这个里头的队列是一个瓶颈,上层把IO往这个队列里面放,下层不断把IO拿走。俗话说的SCSI协议栈,包括三层,一个是上层的协议驱动,指磁盘驱动,磁带驱动,如果有其他的设备,比如打印机之类的,SCSI打印机和扫描仪也有,很早的时候,这块就是驱动设备了。SCSI Middle 层就是管SCSI指令,下发下来都是在内存里的数据结构,每个OS都不一样,但是如果发到磁盘,发到外面的交换机,必须把它弄成标准化的,因为外面有很多厂商做硬件,你不标准,就没法做了这个硬件,你不能说为每个OS都做一个硬件。这层除了翻译成SCSI指令,这边有SCSI语义,还有管真正的SCSI的处理,比如超时了怎么办这些事情,这是中间层。
底下这层是HBA层,首先要有驱动,在HBA上有设备发现的这么一层库,因为传统的SCSI几十年前,那时候只有SCSI这么一种物理硬件,大家可能有人见过,很粗很笨的线缆,后来出现了FC,SAS这些,更快速的、高效的物理链路类型。SCSI