Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4079808
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: 服务器与存储

2012-04-20 12:52:17

当你的系统发布时,你需要告诉用户如何去使用,通常你会写一份示例代码放在文档中,让用户能通过这个例子快速知道该如何使用,这个实例代码对用户会有多大影响呢?

TFS是淘宝的分布式文件系统,主要用于小对象的存储(如图片、交易快照等),在TFS的开源wiki上,也有一个简单的实例。具体的说,TFS客户端提供了基本的open、read、write、close接口,用户在读写前,需要先根据对应的模式open一下,然后调用read或write进行读写,最后用户调用close关闭文件,这个过程与linux标准文件系统的过程是类似的。另外,TFS客户端还提供了一个fstat的接口用于获取文件的基本信息(如大小、创建时间等)。

 

TFS的读文件的示例代码是这么写的:

fd = tfsclient.open(filename, ...);
tfsclient.fstat(fd, &stat);                 // 在调用read前,先调用stat获取文件大小
tfsclient.read(fd, buf, stat.size);    // 不调用stat直接read也是可以的
tfsclient.close(fd);


最近,内核组的同时通过在线上抓取日志进行分析,发现约80%的read前对该文件调用了stat,可以看出示例代码深深的影响到了用户的使用方式,写好example是非常重要的


针对上述现象,我们分析了stat、read对应的DS行为,并进行了优化:

  1. 客户端一次stat对应DS的行为:读文件的index,根据index读取block对应位置的文件元数据(FileInfo结构)。
  2. 客户端一次read对应DS的行为:读文件的index,根据index读取block对应位置文件的数据。
  3. 在block上文件数据紧接着文件的FileInfo信息存储。

由于80%的read前都会有对应文件的stat调用,也就是说当读取到文件的FileInfo,很有可能马上就会用到紧跟其后的文件数据,如果在stat时对文件数据进行预读,接下来调用read时,就不需要再到磁盘上读取文件数据,从而节省一次磁盘IO;通过线下的模拟测试,发现上述预读优化的确是有作用的。

阅读(2559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~