FAST10、FAST11和FAST12 字频统计

FAST10、FAST11和FAST12 字频统计

  • 操作系统
    1. linux      408
    2. nfs         231
    3. zfs          201
    4. lustre     134
    5. windows 128 (许多文章来自Microsoft 公司)
    6. MAC       8
  • 文件系统
    1. ext3        425
    2. ext2        264
    3. hdfs        87
    4. ntfs         27
  • 领域/方向
    1. file system 4964
    2. storage   3839 (从前两项就可以看出这会议是FAST 了)
    3. flash 1681 + SSD 1002 (2683) (这两年NAND flash 已经明显超过了disk 的关注)
    4. disk        2399 (2011 年有个专题就叫做:Disk is not dead)
    5. memory  1829
    6. cache     1516
    7. workload 1173
    8. metadata 954
    9. deduplication 737
    10. algorithm  373
  • 性能/对比
    1. write        2283 (在写性能方面做的工作比读更多,可见写性能更收到关注)
    2. read        1610
    3. size         1363(容量>价格>延时>吞吐量)
    4. throughput 598
    5. latency     744
    6. price         841

Python线程,网络

最近写了些测试程序,python 的一些网络和线程总结如下:

  • Server/Client
  1. 创建socket 对象
  2. 绑定socket 到指定地址
  3. socket 的listen 方法接受连接
  4. 处理
  5. socket.close 关闭连接
  • 创建监听服务器方法:

创建一个类继承BaseRequestHandler(import SocketServer)

class Myserver(SocketServer.BaseRequestHandler):

这个服务器将在收到一个连接后创建一个线程,线程code 在handle里

def handle(self):

  • 全局变量&类变量

能不用全局变量就不用全局变量是个好习惯

即使在handle 内定义了全局变量 global param 也只是局部变量,该变量在线程死亡后被清理

可以使用类变量达到全局变量的效果

Extracting Flexible, Replayable Models from Large Block Traces

原文

文章看了三天都没有看出所以然来。

今天重新看了yangsuli 博客,发现原来文章所谈的就是我读的那么回事。至于为什么我没有看出东西来,是因为我不知道这篇文章是要干嘛的,难道只是对trace进行了压缩么?

Main idea: take standard trace, then divide them into chunks, define feature function to turn traces into a muliti-demention diagrame, to trade accuracy for size reduction.

将标准的trace 按照时间点(文章谈到了在trace可能出现的误差点或不精确点chunk 作为分隔点)或者块大小分隔大小,然后根据特征(读、写、偏移)函数将traces 转化为多维度的图,然后通过重复数据删除和benchmark plugin对数据进行压缩,以减少精确度换取size 的缩小。

我的点点想法:

  1. 重复数据删除在算法优劣的评价下并没有一个数据集合,一方面是如果真的有这个数据集合也会是非常非常大的,它的存在价值不大;另一方面更需要一个精简的方法来衡量算法的优劣,这个方法甚至可以自己创造一个数据集合对重复数据删除算法进行评估。重复数据算法实际上就是压缩算法,比较压缩算法的优劣也没有固定的数据集合,但可以通过压缩率来衡量,有人要说压缩率对不同的数据集的压缩率也是不一样的,好在就在于压缩算法更容易用数学来进行考察。这样有一个方式就是通过比较重复数据删除和固定压缩算法的压缩比,但问题又来了还是需要数据集。而且数据集合取得不好的话,可能这两者之比相差非常大,比如讲一个word 文档复制后重命名,重复数据删除这两个文档几乎没有压缩,而压缩算法对这种情况却十分有利。
  2. chrome 客户端写一个插件可以保存指点图片/链接(右键该图片/链接)、保存指定文字(选中该文字)、保存页面(页面上右键)到远程服务器(可以考虑ustor 哦)。在本地桌面安装一个快捷方式可以随时查看以上保存的文件。有人要质疑这样做的好处了,本地不都是可以做这些的么?但没有感觉本地在保存图片和页面的步骤繁琐,还需选文件夹,chrome 还要卡卡的以下,能够让远程服务器(云端)做这样的事情,我们只是单击下邮件或者按下快捷键是多么惬意的事情啊?有一个小小的问题就是如何认证所在的用户并保存它的数据到他的远程文件夹(显然是要先注册的)。

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 文件系统)。

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

Design Implications for Enterprise Storage Systems via Multi-Dimensional Trace Analysis

文章结构

1.Introduction 引言

2.Motivation and Background 动机和背景

2.1 need for insight at different layer在不同的层次上了解

2.2 need for multi-dimensional insight 在多方面进行了解

3.Methodolgy 方法

3.1 trace analyzed trace 分析{1000 employees in marketing 500 employees in engining}

3.2 Access unit 进行存储访问的单元{sessions,applications,instances,会话,应用,实例}

3.3 Analyze process 分析过程

            step 1:trace collection trace 收集

            step 2:select layers/define features 选取层次/定义特征

            step 3:compute numerial feature value 计算特征的数值

            step 4:identify access patterns by k-means 通过k-means 的结果得出访问样式

            step 5:Interpret results 解析结果

            step 6:Design implications 给出适应于反馈结果的设计

        3.3.1 Selecting features for each unit<step2> 为每个层次单元选择特征

        3.3.2 Indentifying access patterns via k-means<step4>通过k-means 得出访问的样式

        3.3.3 Interpreting and generalizing the result<step5>解析并概括结果

    4.Analysis result&implicance 分析结果和含义

4.1 Client side access patterns 客户端访问样式
            4.1.1 Sessions 会话<观察结果1-3>
            4.1.2 Applications 应用<观察结果4-6>
        4.2 Server side access patterns 服务器端访问样式
            4.2.1 Files 文件<观察结果7-10>
            4.2.2 Deepest subtrees 最深子树<观察结果11、12>
        4.3 Access pattern evoluation over time 时间变化下访问样式的变化

    5. Architecture Implications 结果在系统结构上的提示

    6. Conclusion and feature work 结论和未来的工作

内容:

文章首先提到了先前文章的trace 分析存在的一些问题:

  • 带有经验主义的偏见
  • 单方面、单维度的分析
  • 分析的层面较为单一(文中从至少从Client session 和Server 等层面分析)

文章的实验样例有两块,一块客户端是拥有1000个雇员的商业市场公司,一块客户是拥有500个雇员的工程人员的公司。下面讲讲文章核心的12 个观察:

  1. <sessions>The sessions with IO sizes greater than 128KB are either read-only or write-only, except for the full-day work sessions. 除了全天的会话,超过128KB 会话的IO都是只读或者只写的。
  2. <sessions>The full-day work, content-viewing, and content-generating sessions all do ≈10MB of IO. 全天工作、内容查看和内容生成会话IO 约为10MB。
  3. <sessions>The number of human-generated sessions and supporting sessions peaks on Monday and decreases steadily to 80% of the peak on Friday. 人为产生的会话在星期一为顶峰,之后下滑,直至星期五下滑到峰值的80。
  4. <applications>The small content viewing application and content update application instances have <4KB total reads per file open and access a few unique files many times. 较小的内容查看程序和内容更新程序实例在每次打开文件的时候都会有<4KB的读并多次访问一些特殊文件。(理解的不知道是否正确)
  5. <applications>We see >50% sequential read and write ratio for the content update applications instances (corporate)and the content viewing applications instances for human generated content (both corporate and engineering). 内容更新程序和查看人为内容的查看程序有超过50%的读或者写。
  6. <applications>Engineering applications with >50% sequential reads and >50% sequential writes are doing code compile tasks. 工程应用有超过50%的顺序读和顺序写是在编译代码。
  7. <files>For files with >70% sequential reads or sequential writes, the repeated read and overwrite ratios are close to zero. 那么>70% 顺序读或者顺序写的文件,再次被读写的概率几乎为0。
  8. <files>In the engineering trace, only the edit code and compile output files have a high % of repeated reads. 在工程客户得出的trace 中,只有编写代码和编译输出文件才会有高比率的重读操作。
  9. <files>Almost all files are active (have opens, IO, and metadata access) for only 1-2 hours over the entire trace period, as indicated by the typical opens/read/write activity of all access patterns. 几乎所有的文件在整个会话(trace 追踪的是会话)周期只有1-2个小时是活跃的。
  10. <files>All files have either all random access or >70% sequential access. 所有文件要么都是随机访问,要么就是超过了70% 的顺序访问。
  11. <deepest subtree(我的理解是只包含叶子节点的目录)>Directories with sequentially accessed files almost always contain randomly accessed files also. 目录中有顺序访问的文件就也会包含随机访问的文件。反过来,一个subtree 却可以只有随机访问的文件。
  12. <deepest subtree>The client cacheable subtrees and temporary subtrees aggregate files with repeated reads or overwrites. 客户端缓存的文件会被反复的读和重写。反复读写往往来自一个客户端。

文中针对这12 个观察结果给出了相应的提示,具体参见原文