MSST 2012

IEEE Conference on Massive Data Storage (MSST 2012) 4 月 16-20 日。实验室曾老师中一篇short paper。

Flash 1

Parallel Object and Failure

Short Papers 1

Deduplication

Short Papers 2

Flash 2

 

快读paper 的几个技巧(欢迎补充)

  1. 首先看摘要,知道文章大体背景和概述。
  2. 如果Introduction 最后两段如果不是“section 2 将会讲……,section 3 讲……”,那么将会提到文章最核心,最创新的部分。有时候会直接给出“Our contributions/works are:……”
  3. 看conclusion ,看看作者通过自己的idea 和实验得出了什么结论。
  4. 看图表,简单直接知道实验内容。(有时图表和实验内容联系紧密,看图表看不出什么)。
  5. 最后还有时间穿插地瞄瞄Related works 和Our works(如果有的话)。说不定相关工作有你熟悉的内容。
  6. 另外能先看论文的PPT 也是非常好的方法。

微软云存储架构(Azure Cloud Storage)

原文:Windows Azure Storage: A Highly Available Cloud Storage Service with Strong Consistency

 

IDEA

A cloud storage system that provides customers the ability to store seemingly limitless amounts of data with high availablity and strong consistency. 为用户提供高可用、高一致性并近乎无限空间的云存储。

 

System characteristics 系统特点:

  1. High availablity and strong consistency 高可用性和强一致性
  2. Global and scalable namespace/storage 全局可扩展的名字空间、存储
  3. Multiple data abstractions from a single stack 支持多种类型的数据
  4. Automatic load balancing 自动负载均衡
  5. Range Partition vs Hashing 使用动态区域划分,而没采用哈希
  6. Append-only system 存储系统只有append 操作。
  7. End-to-end checksum 端到端的校验和
  8. Separate log file per RangePartition 日志文件粒度为RangePartition

高可用通过多副本策略实现(默认三个),数据写入的原子性操作保证强一致性。Azure 支持blob(数据块)、Table(structured storage)和Queues(消息队列)三类数据。所有数据都是以添加的方式写入的。

继续阅读

Differentiated Storage Services(差异化存储服务)

原文地址

  • Main idea

文章提出一个分类结构减少计算机系统和存储系统的日益扩大的语义差距。(我的理解文章做的工作就是将文件分级,按等级进行缓存提高效率)

We propose an I/O classification architecture to close the widening semantic gap between computer systems and storage systems.

 

  • 实验用例(Workload)

Filesystem prototypes and a database proof-of-concept that classify all disk I/O—with very little modification to the filesystem, database, and operation system.

 

  • 存在问题(Problems)

Block-based storage interface makes it difficult for computer systems to optimize for increasingly complex storage storage system internals, and storage systems do not have the semantic information to optimize independently. 块设备较稳定,但是问题就是带来存储没有上层语义信息进行存储优化。

 

  • 现有的解决方法(existing solutions)
    1. obtain more knowledge of storage system internals and use this information to guide block allocation. 计算机系统获取更多存储系统信息
    2. discover more about on-disk data structures and optimize I/O accesses to these structures. 对磁盘上不同数据结构进行I/O 优化
    3. I/O interface can evolve and become more expressive; object-based storage(天啊,我想到了老板) and type-safe disks fall into this category 增强型I/O 接口

这些解决方法也对应的遇到问题:1.计算机很难稳定地获得存储系统的内部信息;2.增加了计算机系统复杂度;3.受到块设备的限制。

另外还提到的一个解决方法也是我在之前考虑过的:通过预测模型加上预取提高I/O 性能,但这样不仅预测模型很难获取,而且很可能适得其反。

 

  • 文中提出的解决方法(solution provided by the paper)

We modify the OS block layer so that every I/O request carries a classifier. In this way, a storage system can provide block-level differentiated services—and do so on a class-by-class basis.

 

  • OS/FS/APP requirements(操作系统、文件系统、应用需求)
    1. In UNIX and Windows, we add a classification field to the OS data structure for block I/O (the Linux “BIO” and the Windows “IRP”) and we copy this field into the actual I/O command (SCSI or ATA)before it is sent to the storage system.
    2. FS have a classification scheme fot its I/O and assigns a policy to each class.
    3. Differentiated Storage services is a stateless protocol  ……(有点不懂既然每次读写都带了classificator,和存储设备就应该没有关系了,难道是因为分类在实现上是写到了不同存储介质,期望以后block 位置都不改变了,而其他情况可能改变block 的分配?)
    4. 在读写的时候添加分类符:classificator
  • Classifications(分类)

Class ID 从1-18,0 分别对应的是Ext3 superblock,group descriptor,bitmap,inode,directoryentry,journal entry,File<=4KB,File<=16KB ……File>1GB,unclassified 19个类,对应的优先级是0,0,0,0,0,0,0,1到12(0 最高)。

 

  • Evaluation(实验评估)

Workload: fileserver(文件服务器)、e-mail server(邮件服务器)and PostgreSQL database

Method: in-house, file-based workload generator for file and e-mail server workloads. Record the number of files written/read per second. Compare the performance of three storage configurations: no SSD cache, an LRU cache, and an enhanced LRU cache(LRU-S) that uses selective allocation and selective eviction.

Result: LRU-S caches much more smile file and metadata, so all results accord with it.

 

文章提出了减少存储系统和计算机系统语义差距的一个方法,即在读写时添加标识符,对操作的文件根据其属性进行分级,提高系统性能,但缺点也是显而易见的,需要对从应用程序,操作系统,存储系统甚至存储设备进行修改,虽然文章强调对每个部分的修改都是很少的;其次测试中选了了10GB SSD 进行缓存,更多容量的缓存得出怎么的结果并没有给出,能不能适用于现在的缓存还很难说,对于像momentus MX 这样的混合硬盘可能比较合适;最后不管怎么说,文章给块设备(或者说文件)添加了一个属性,不也就是对象的思想么?既然块设备转变为面向对象的存储有难度,可以像本文所提到的做一个简单的对象存储,这或许是个好的思路。

SSD 综述

写在文章之前

从传统的观点来看,SSD 分为两大类:基于Flash 的SSD 和基于DRAM 的SSD ,DRAM 为易失性存储介质,所以需要外接电源;主流基于Flash 的SSD 又分为NOR Flash 的SSD 和NAND Flash 的SSD。

NOR Flash 和NAND Flash 的物理存储单元都是浮栅晶体管(floating-gate transistors),Intel 在1988 率先发明了NOR Flash,价格昂贵,数据线和地址线分开,所以芯片内cell 电路复杂(容量也没有做到很大);而东芝toshiba 在1989 年发明了NAND Flash,价格较便宜,将数据线和地址线合并,芯片电路得以简化。NOR Flash 最大的特点就是程序可以在Flash 中执行而不用读取到RAM 中,其读速度要比NAND Flash 快些,两者在写入前大都需要擦除,写入和擦除NAND Flash 比NOR Flash 快。接下我们谈到的都是NAND Flash SSD。

另外在看SSD 论文的时候会提到program 这个单词,指的是SSD 的写入,单指一个cell 写入0或者1 的这种情况,对应的单词是earse (擦除)。

SSD 的组成

SSD 物理上主要由控制器(controller)、缓存(DRAM)、总线(BUS) 和NAND Flash 芯片组成。

  • 控制器:和HDD 中控制器类似,负责和主机通信,进行读写控制。
  • 缓存:缓存从Flash 中读出的数据,另外FTL 的转换表也保存在这里。
  • 存储芯片:真正保存数据的地方,也是SSD 区别于HDD 的主要地方。
  • 总线和接口:包括数据线、控制线(channel 等)和传输接口(SATA,PCI-e,SAS 等)。

逻辑组成可以按照SSD 各部分的逻辑功能来划分:Host Interface 是主机接口、FTL 是逻辑地址到物理地址的转换层、RAM 用于缓存数据、Multiple Parallel Elements 持久化存储数据(为什么是Parallel 后面会讲到),结构如图:

picture_11

下面详细介绍下Flash 芯片的组成,我们将从小到大的顺序介绍:cell,page(页),block(块),plane(区域),chip。

  • cell:Flash 存储原理是浮栅场效应晶体管存储电子能力来保存数据的,SSD 0/1 位数据物理存储单元称为cell。根据cell 存储位数的不同可以分为SLC(single-level cell)、MLC(Multi-level cell)和TLC,SLC 在每个cell 中保存一位数据,MLC 在每个cell 中保存两位数据。NAND Cell2a
  • page:cells 组成page 页,每个page 有4KB-8KB 左右大小(会多出一些容量保存ECC 校验等信息)。Page也是Flash芯片读写I/O的最小单位,大容量的SSD 会采用更大的存储页,比如 256Gb 或者更大容量的存储页就是 8KiB 而非 128Gb(以及 64Gb、32Gb)的 4KiB。
  • block:pages 页组成block 块,每个块由128/256 个页组成,大小为512KB-1MB 左右。cell、page 和block 的关系见如下图。SSD 按块进行擦除。

9

  • plane:blocks 块组成plane 区域,每个区域有几千个块组成,大小达到GB。
  • die:planes 区域组成die ,die 也被称为LUN(逻辑单元)。下图是4 个planes 组成两个dies,两个dies组成一个chip。die_380_0

各种制程:1323315355_b3dbd0e5

256GB-世界最大单chip 容量

1323315362_ab477d79

  • chip:(也就是上图中手指上的东西),而我们平时看到的是封装好的package(感觉封装好了就是package,package 是里面可能有一个或者两个chip 被封装)。

ocz-vertex-3-pro-board-img1

多通道

我们已经知道了一块SSD 盘中会有多个Flash chips(每个chip 又包含两个dies,每个die 又有两个planes,每个plane 包含很多个blocks ……),每一个芯片的读速度可达40MB/S,写可达10MB/S,为了提高读写性能,SSD 实际上在内部对芯片做了一个RAID 0 ,也称为多通道技术。

前面谈到了die 也被称为LUN,这是因为die 是控制器(FBC=Flash Bus Controller)地址线寻址的最小单位,下图是一个四通道的例子,每个通道称为一个channel,一般包含了一个数据线和多个地址线。在一个channel 上的LUNs 之间串行的,但在不同channel 上的LUNs 之间并行的。

ONFI_multichannel

 

这就是之前为什么使用 Multiple Parallel Elements 描述Flash 存储体。

写放大(write amplification)

谈到写放大首先应该了解SSD 的写过程,写放大是因为每次重写都要擦除整块的数据再重新写入,如果这个块里面还有其他数据,还要涉及到数据的迁移。我们通过写放大率来衡量写放大:

写放大率=写入flash memory 的数据量/主机写入的数据量

垃圾回收和TRIM

垃圾回收和TRIM 是为了解决两个问题:

  1. Flash 长久使用后,可用空间碎片越来越多,影响I/O性能。
  2. 热点块I/O次数过大,影响SSD 寿命。

垃圾回收(Garbage collection)出现的原因是因为在一些块中,一些页保存着active 文件,而一些页被标记为“未使用”(SSD 中并不真正的删除文件),那么这些标记为“未使用”的页实际上被浪费了(garbage),因为这些页并不能被写入任何数据。可以想象SSD 在这样运行时间长了的情况下,垃圾空间越来越多,直至最后“没有空间”存储数据,一旦写入数据会出现大量的数据擦除和移动。

垃圾回收实际上是个进程,它会在负载轻的时候对这些有垃圾空间的块进行复制和擦除,整理出可用的空间给新写入的数据。

TRIM 是一个SATA 命令,它允许OS 通知SSD 哪些块不再被使用了,可以擦除了,使用这个命令可以动态的优化对SSD 的写操作,使得磁盘I/O 分散到整个SSD。window 7 和Linux 2.6.33 之后版本开始支持TRIM。

SSD 和HDD

SSD 和HDD 一个明显区别就是后者为机械设备,读写操作有机械的寻道延时和旋转延时(共计5-10 ms),因此IOPS 较低(<200),而SSD IOPS 能上万(随机访问时间<0.1ms),随机读写性能优于HDD,对应的延时也较小;现在SSD 的throughput 也要优于HDD ,数据传输率可以高达500MB/S,另外SSD 在功耗和抗震动也要胜HDD 一筹。但HDD 在容量、使用寿命(几乎无限)和价格上就要比SSD 更加有优势。

SSD 和存储卡(SD,microSD,CF 等)

wiki 中提到了一个有意思的话题:comparison of SSD with memory cards,SSD 和存储卡(其实还有我们使用的u 盘)在介质上使用的都是NAND Flash 芯片,但是它们都是为各自应用环境进行优化后的结果,各自考虑方面有能耗,性能,大小和可靠性。

SSD 存在是为了作为primary storage 设备,所以应该high throughput,low latency,能耗和大小就不太关注;而存储卡是为了能够方便的应用在数码产品上,必须足够的小,低能耗,而相应的速度就比SSD 要慢3X-4X,造成速度差异还是因为单通道和多通道。

Reference

  1. http://en.wikipedia.org/wiki/SSD(有问题找wiki 还是很方便的)
  2. http://www.qdpma.com/Storage/SSD.html
  3. http://baike.baidu.com/view/2741245.htm(NOR Flash 百科)
  4. http://pc.pcinlife.com/Storage/20111115/95.html#7(中文中算讲的很详细的啦)
  5. http://static.usenix.org/event/usenix09/tech/full_papers/rajimwale/rajimwale_html/
  6. http://pc.pcinlife.com/Storage/20111115/95.html#2_1(选购和测评信息)
  7. http://www.google.com/ncr
  8. http://wccftech.com/article/solid-state-drive-primer/(卡通版介绍,休闲娱乐专属)
  9. http://www.condusiv.com/blog/post/2010/12/31/Inside-SSDs.aspx(看着挺舒服的)
  10. http://www.blog.solidstatediskshop.com/2012/how-does-an-ssd-write/(SSD 写傻瓜教程)
  11. http://www.blog.solidstatediskshop.com/2012/how-does-an-ssd-write-part-2/(楼上续集)
  12. http://www.modoy.com.cn/2009/0716/5408.html(用SDHC 做RAID 0 蛋疼!)
  13. http://bbs.evolife.cn/thread-415-1-1.html(基础知识普及)
  14. http://www.youtube.com/watch?v=EhihfJHIu0I (不错的视频,需proxy)

A File is Not a File: Understanding the I/O Behavior of Apple Desktop Applications

原文

 

摘要

文章分析了iBench 的I/O 行为,揭示了iBench 和一般文件系统在组织文件、顺序读写、异步与原子性操作等方面的差别。文章为下一代的本地文件系统和基于云的存储系统给出了意见。(这里ramification 不懂什么意思)

引言

分析包括两个Apple 软件套件:iWork(Pages,Numbers 和keynote)和iLife(iPhoto,iTune和iMovie)。为了分析iBench 套件的I/O 行为,建立了一个称为DTrace 的框架并开发了一个基于Apple-script 的应用。得出以下结论:

  1. A file is not a file.用户看来的一个文件实际上也是由多个小文件组成的。
  2. Sequential access is not sequential.顺序访问也不是真正的顺序访问
  3. Auxiliary files dominate.辅助文件占据主导地位
  4. Writes are often forced.写操作是被强迫了,许多程序定期的会使用fsync 刷到磁盘里
  5. Renaming is popular.重命名是十分常见的(一致性)
  6. Multiple threads perform I/O.有些应用会起上百个线程来进行I/O ,所以存储/文件系统应该是可感知线程的,这样才能够合理的分配带宽。
  7. Frameworks influence I/O.开发框架影响I/O ,里面举例了在引用cocoa.h 头文件时会从689个文件中包含112047行代码。

文章的主要贡献:

  1. tracing framework
  2. 解构iBench I/O 行为
  3. 描述了哪些性质上的变化影响了I/O
  4. present the 34 traces from the iBench task suite

Case Study

通过创建一个文档,接着插入15 幅JPEG 图(每个2.5MB)并保存文档为一个Microsoft .doc 文档格式。观察这个过程中十个线程对六类文档进行的I/O 解释了引言中的七个结论。

IBENCH TASK SUITE

这个section 用前面提到的iWork 和iLife 作为workload 进行了iBench 的测试。系统调用的traces 是通过DTrace 收集(The system call traces were gathered using DTrace)。

ANALYSIS OF IBENCH TASKS

一开始就提出了四个问题:

  1. 访问了哪些文件,以及这些文件的大小?
  2. 读和写文件时如何访问的?是顺序的?还是预留空间(预取)的?
  3. 什么是事务性(transactional)属性?写是通过fsck 命令写入还是自动执行的?
  4. 多线程的应用是如何把I/O 分担到各个线程中的?

文章比对了iPhoto, iTunes, iMovie, Pages, Numbers, Keynote 在iBench 测试操作(start,Dup 等)时获取文件类型的个数和比率,以及指定类型文件的个数和比率,这里需要提出的是文章把访问的文件类型分为了multimedia,productivity(像doc,xls等),plist,sqlite,strings,other 六个类型。接着将文件大小分别对文件个数和操作文件总大小取加权。对应的得出四个表:

  1. 访问某类型(六个中一个)文件个数占所有访问类型文件个数的比率
  2. 访问某类型文件总大小占所有访问文件大小的比率
  3. 访问某大小文件(<4KB, <64KB, <1MB, <10MB, >10MB)个数占所有文件个数的比率
  4. 访问某大小文件的总大小占所有文件大小的比率

从1,2 两个图可以看出iPhoto,iTunes 和iMovie 访问multimedia 类型文件的个数和大小都比较大,从文件大小的个数来看,访问<4KB 文件个数占访问所有文件个数的比率都比较高,特别是Pages,Numbers 和Keynote 应用超过60% 访问文件的格式是<4KB 文件。很有意思的是,虽然访问4KB 文件数目很多,但由于这些文件很小所以占所有文件大小的比率很小,我想如果对访问这些文件的耗时进行下分析,可能会对系统性能提高有更好说服力。

下面一部分是关于sequentiality 的分析,我又回头看了下对这些workload 的操作:start 打开对应的应用程序,open 是打开媒体或文档等文件,imp 是将media 等导入到媒体库library 中,new 是创建新的文件并保存。

首先看这些操作读的连续性,所有workload 中start 操作读的连续性超过了75%,可见这些程序在开启的时候大部分I/O 是连续的(这点其实可以拆分来看,虽然连续读操作在容量上占了大部分,但是时间上可能还是随机写所占的时间更长,可以考虑在这方面做工作)。iPhoto 和iTunes 中Imp 操作类似于一个copy 操作,所以连续性较好;有点不理解iTunes 中PlayS (播放10 首歌曲)全部是近似读操作,而PlayM (播放三分钟电影)几乎就没有连续的操作(WHY)。

接着说了预取在除了copy 之外的操作上基本没有什么用!大部分操作也没有过多的采用预取。

Writes typically involve a trade-off between performance and durability.

写操作往往是在性能和持久性之前做了一个权衡。这部分是对sync 命令的分析:

The graph further subdivides the source of the fsync activity into six categories. SQLite indicates that the SQLite database engine is responsible for calling fsync; Archiving indicates an archiving library frequently used when accessing ZIP formats; Pref Sync is the Preferences Synchronize function call from the Cocoa library; writeToFile is the Cocoa call writeToFile with the atomically flag set; and finally, Flush-Fork is the Carbon FSFlushFork routine.

fsync 被具体分类六类:SQLite 是SQLite 数据库调用fsync,archiving 为在访问ZIP 格式文档的时候产生,Pref Sync 是cocoa 库中一个函数调用的fsync ,writeToFile同上,Flush-Fork 是Carbon 库调用的。图看的眼花了~~

中间插一段atomic write(原子性写),即写操作要么失败,回滚到写之前状态,要么成功               – Step W1: Acquire “write lock” on the existing file. (this is usually part of your app semantics, so you might not need any Win32 APIs here)
– Step W2: Copy the old file in a new temporary file. (copy Foo.txt Foo.Tmp.txt)
– Step W3: Apply the writes to the new file (Foo.Tmp.txt).
– Step W4: Flush all the writes (for example those being remaining in the cache manager).
– Step W5: Rename the old file in an Alternate form (ren Foo.txt Foo.Alt.txt)
– Step W6: Rename the new file into the old file (ren Foo.Tmp.txt Foo.txt)
– Step W7: Delete the old Alternate file (del Foo.Alt.txt)
– Step W8: Release “write lock” on the existing file.

这是对应的流程图:

write

这样实际上,为了保证写的原子性,会有大量的重命名操作,可见为保证写的原子性系统I/O付出了较大代价。

再就是多线程和异步,家用电脑为了提高交互性能及减少对用户的延迟,常常采用异步写策略。实验得出的结论却是异步读写在所实验的内容中很少采用,但一旦采用了操作中异步I/O比率占用较高。另外iBench 中任务为了会使用很多线程进行I/O 减少对用户的延时(有些可能是上百个线程)。

相关工作

关键字:研究的对象,学术和工程环境,个人应用程序行为,多媒体应用程序,动态workloads,元数据特征,静态存储,长期存储

讨论和结论

有一段话非常有意思:

The iBench tasks also illustrate that file systems are now being treated as repositories of highly-structured “databases” managed by the applications themselves. In some cases, data is stored in a literal database (e.g., iPhoto uses SQLite), but in most cases, data is organized in complex directory hierarchies or within a single file (e.g., a .doc file is basically a mini-FAT file system).

文件系统现在越来越被当作为应用程序管理的高度结构化“数据库”。在一些情况下,数据保存在字母顺序的数据库中,大部分情况下,数据通过复杂目录层次结构组织起来,或者只是一个文件(比如.doc文件实际上就是一个mini-FAT 文件系统)。

完了完了~~~这篇看的还是太慢!

Consistency Without Ordering

1 Introduction:

The current state of the art in file-system crash consistency as follews.

At one extreme is a lazy, optimistic approach that writes blocks to disks in any order;

At the other extreme are eager, pessimistic approaches that carefully order disk writes;

2 Background

File system consistency: Metadata/Data/Version

Teches for consistency: File system check/Journaling/Soft updates(检查内存元数据块之间的依赖关系,然后顺序地写入到磁盘)/Copy-on-write

3 Design

里面解释了什么是数据的consistency 觉得挺有道理的:Data consistency provides the guarantee that all the data accessed by a file belongs to that file; it may not be garbage data or belong to another file.

文章的idea 之一就是Backpointers ,就是在所有的目录和文件的后面添加一个指向父节点的指针(这点代价我看来是很小的,因为每次文件、目录访问都是要访问其父节点才会访问孩子节点)。通过其来进行一致性验证,文中提到了:This checking happens both at the file level and the data block level.这里能够进行块一级的校验有点不明白,为什么块一级也可以呢,这个backpointers 不是只在文件一级的么?

还有一个idea 是non-persistent allocation structures。

backpointer

4 Implementation

Backpointer 有三种: Block backpointer{inode, block offset}数据块回溯到所在的inode 的指针,Directory backpointer{directory block backpointer}目录块回溯到所在inode,Backlinks{parent inode}当前inode 回溯到之前的父inode 。(注:这里我有个小疑问,Directory backpointer 实际上就是当前目录的指针,这个在原有的文件系统中不是就有么,用一个黑点’.’代替的么?)。

接下来就讲了在create ,read ,write 等操作的时候这些指针的变化,以及在crash 的时候如何使用backpointer 进行恢复。

Non-persistent allocation structure 是ext2 中bitmaps 和组描述符的替代,不同的是它不在硬盘上持久化存储,而是启动的时候根据backpointers 生成的。(这点和hdfs 以及很多分布式文件系统的元数据管理很类似,1.hdfs 中文件->块的映射是开机时产生的,所以和本文NoFS 同样有冷启动问题。2.hdfs 中目录树结构永久性存储在硬盘上fsImage,但是开机会加载到内存)。

文中提到了,元数据(inode)和数据的扫描都是顺序扫描而不是按目录结构,这样就速度更快。

5 Evaluation评估

这部分分为可靠性测试和性能测试,可靠性测试使用了伪磁盘驱动器进行了错误注入,并查看NoFS 和ext2 文件系统的检测和纠错机制;性能测试比对了NoFS 和ext2、ext3 读写和IOPS 等性能(感觉性能测试接近于ext2 是因为作者就是根据ext2 来改的,做的唯一冗余就是添加了backpointer ,所以结果略差接近于ext2 也是显而易见的,这点感觉是想说明在性能没有损失的前提下可靠性强)。后面关于scan 性能的没怎么看。

6 Discusion

ext2 没有提供强数据一致性,ext3 通过日志记录保证数据一致性,NoFS 提供了强一致性且没有数据上的冗余,性能上也优于ext3 ,唯一的问题就是启动问题。