Linux内核收到系统调用的软中断,通过参数检查后,会调用虚拟文件系统(Virtual File System,VFS),虚拟文件系统会根据信息把相应的处理交给具体的文件系统,如ext2/3/4等文件系统,接着相应的文件I/O命令会转化成bio命令进入通用的块设备层,把针对文件的基于offset的读/写转化成基于逻辑区块地址(Logical Block Address,LBA)的读/写,并最终翻译成每个设备对应的可识别的地址,通过Linux的设备驱动对物理设备,如硬盘驱动器(Harddisk Drive,HDD)或固态硬盘进行相关的读/写。

我们知道支持OLTP的数据库对事务的支持有很强的要求,如那些没被正常提交的事务(Transaction)需要进行回滚。为了满足这一需求,数据库引入WAL(Write Ahead Log)机制,即任何写磁盘操作必须先写日志。

Die/LUN是接收和执行Flash命令的基本单元,不同的Die可以同时接收和执行不同的命令,但在一个Die中一次只能执行一个命令,不能对其中的某个页在写的同时又对其他页进行读访问。

每次NAND制程的升级都能将NAND存储密度提升到一个新的高度,但是NAND闪存的制程工艺是一把双刃剑,容量提升、成本降低的同时可靠性及性能都在下降,因为工艺越先进,NAND的氧化层越薄,可靠性也越差,厂商就需要采取额外的手段来弥补,但这又会提高成本,以至于达到某个点之后制程工艺已经无法带来优势了。

在3D XPoint中,内存单元和选择器被存储总线交叉叠加在一起,每一层的总线又会被导线连接。这又该怎么理解呢?按原来的方式,内存单元之间访问就像两个住在楼梯房的好朋友,每次去其中一家串门都需要走过道爬楼梯。而3D XPoint则是相当于为他们设置了一个直达电梯,每次串门“叮”的一声就到了。这样一来,数据访问效率就会高很多。

NVMe或称NVMHCIS(Non-Volatile Memory Host Controller Interface Specification,非易失性存储主机控制器接口标准)最早是由英特尔公司于2007年提出的。英特尔公司领衔成立了NVMHCIS工作组,成员包括三星、美光等公司,致力于使将来的存储产品从AHCI中解放出来。

关于NVMe-oF,目前有两种类型的传输正在开发,使用RDMA的NVMe-oF和使用FC-NVMe的NVMe-oF。这里的RDMA包括了InfiniBand、RoCE(RDMA over Converged Ethernet)和iWARP(internet Wide Area RDMA Protocol),RDMA支持在不涉及处理器的情况下将数据传输到两台计算机的内存,并提供低延迟和快速的数据传输。从逻辑架构上看,与NVMe over PCIe相比,NVMe over RDMA在软件开销上的增加很小,可以近似地认为跨网络访问和本地访问的延迟几乎是一样的。

宽泛一点来说,Linux存储系统包括两个部分:第一部分是站在用户的角度提供读/写的接口,数据以流为表现形式;第二部分是站在存储设备的角度提供读/写接口,数据以块为表现形式。文件系统位于两者中间起到承上启下的作用。

Direct I/O最主要的优点就是通过减少内核缓冲区和用户空间的数据复制次数,降低文件读/写时所带来的CPU负载能力及内存带宽的占用率。如果传输的数据量很大,使用Direct I/O的方式将会大大提高性能。然而,不经过内核缓冲区直接进行磁盘的读/写,必然会引起阻塞,因此通常Direct I/O与AIO(异步I/O)一起使用。

超线程技术(Hyperthreading)是指操作系统将每个物理核识别为两个可以并行工作的逻辑核,它们有自己独立的寄存器,但是共用主要的执行单元。这得益于超标量(Superscaler)技术,软件可以通过CPU同时分发多条指令到空闲的执行单元,最大限度地利用CPU的计算资源。

如前所述,virtio后端设备用于具体响应Guest的命令请求。例如,对virtio-scsi设备来讲,该virtio后端负责SCSI命令的响应,QEMU负责模拟该PCI设备,把该SCSI命令响应的模块在QEMU进程之外实现的方案称为vhost。这里同样分为两种实现方式,在Linux内核中实现的叫作vhost-kernel,而在用户态实现的叫作vhost-user。

条带化就是一种能够自动将I/O负载均衡到多个物理磁盘上的技术。通过将一块连续的数据分成多个相同大小的部分,并把它们分别存储到不同的磁盘上,条带化技术能使多个进程同时访问数据的不同部分而不会造成磁盘冲突,而且能够获得最大限度上的I/O并行能力。

一致性哈希算法的过程由如下几个步骤组成。 · 计算每个对象名称的哈希值并将它们均匀地分布到一个虚拟空间上,一般用232标识该虚拟空间。 · 假设有2m个存储节点,那么将虚拟空间均匀分成2m份,每一份长度为2(32-m)。 · 假设一个对象名称哈希之后的结果是n,那么该对象对应的存储节点即为n/2(32-m),转换为二进制位移操作,就是将哈希之后的结果向右位移(32-m)位。

目前OCI主要有两个标准文档:容器运行时标准(Runtime Spec)和容器镜像标准。如图9-2所示,这两个协议通过OCI Runtime filesystem bundle的标准格式连接在一起,OCI镜像可以通过工具转换成bundle,然后OCI容器引擎通过识别这个bundle来运行容器。