HOW TO PRESENT A PAPER

Leslie Lamport

4 August 1979

原址

1.  WHAT TO SAY(说什么

    – Don’t give your paper; the audience can’t take it.  If someone
      can understand in thirty minutes what it took you weeks to
      develop, then you’re in the wrong business.

不要和别人谈论你的论文,别人不可能在短时间内理解的。如果别人能在三十分钟内理解你花了几个星期才写出的成果,那只能说明你的成果并不是很有价值。

另外分析一个句子If someone can understand in thirty minutes what it took you weeks to develop, then you’re in the wrong business.,这是一个同位语从句,what 是understand 的宾语,同时也是后面的句子的同位语。

    – Do advertise your paper.  The purpose of an automobile ad is
      to get potential customers to the showroom, not to give technical
      specifications.  The purpose of your talk is to get people who
      might be interested in your work to read the paper, not to save
      them the trouble of reading it.

要为你的文章打广告,汽车广告的目的是将潜在的客户吸引到它的showroom,而不是给出技术细节。你演讲的目的是使得可能对你论文感兴趣的文章的人去阅读你的文章,而不是节省他们阅读文章的困难。

    – Giving a good presentation is an art, requiring both practice
      and talent.  No rules can turn you into an artist, but the
      following suggestions might be helpful.

        1.  Describe simple examples rather than general results. 
            Try to make the examples much too simple — you will not
            succeed.

        2.  Don’t use formalism.  If your results cannot be described
            simply and informally, then there is no reason why anyone
            should be interested in them.

        3.  It is better to be inaccurate than incomprehensible.  The
            place for accuracy is in the paper.  (However, false
            advertising is unethical.)

2.  HOW TO SAY IT

    – Slides are effective.  Here are some suggestions for their proper
      use.
     
              1.  Don’t put too much on a slide — a picture of a thousand
            words is worthless.  For 8 x 11 slides, all letters should
            be at least 3/8 inch high, with plenty of blank space. 
            People in the back row have to read them too.

        2.  Slides should be neat and legible.  The listener isn’t
            your secretary; it’s not his job to decipher your
            handwriting.

        3.  A rapid sequence of slides has a hypnotic effect.  Unless
            you are a licensed hypnotist, don’t use more than one slide
            per minute.
           
        – Time your talk.  Running over your allotted time is a mark of
      incompetence, and displaying your incompetence is a poor way
      to get someone to read your paper.  Remember that talking to
      an audience takes longer than talking to a mirror.

3.  DA CAPO

    – You are now thinking:  “All those dull speakers I’ve listened
      to should use these rules, but I don’t need them because my talks
      are interesting.”  All those dull speakers are now thinking exactly the
      same thing.  Read the rules again with the proper humility.  They
      apply to everyone.

        “The only wisdom we can hope to acquire
        Is the wisdom of humility:  humility is endless.”

4.  CODA – For Session Chairmen

– Be utterly ruthless about enforcing time limits.  Warn the
      speaker when he has 10 minutes left and when he has 5 minutes
      left, and stop him in midsentence when his time is up. 
      The audience will be grateful.  (A loud alarm clock works quite
      well if you don’t turn it off until the speaker has finished
      talking.)
     
       – Protect the speaker and the audience from inappropriate
      questions.  Questions should be allowed during the talk only
      if the audience is small and the question is a simple request
      for clarification.  After the talk, you must be prepared
      to silence the following two kinds of questioner.

        1.  One who leads the speaker into a long discussion of an
            obscure detail which is of no interest to most of the audience.
           
               2.  One who monopolizes the time arguing with the speaker over
            unresolvable philosophical issues.

      Remember that silencing one person enables the rest of the
      audience to ask questions.

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

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