zfs的双buffer设计问题

来源:互联网 发布:js cookie 代码 编辑:程序博客网 时间:2024/06/05 16:37
 
   zfs是有两个缓冲区的。首先是dmu buffer,如果dmu buffer中没有数据再找arc buffer,如果找到了,那么就直接调用回调函数,将arc buffer的内容传给dmu buffer。如果再找不到就找磁盘。
具体的实现细节如下:
  dbuf_read 首先会看 dmu buffer的状态,如果是UNCACHED。
就会调用 dbuf_read_impl函数。
dbuf_read_impl函数会调用dsl_read,进而从arcbuffer中找数据。找的方法是根据db的db_blkptr来查找。

点击(此处)折叠或打开

  1. (void) dsl_read(zio, spa, db->db_blkptr, pbuf,
  2.      dbuf_read_done, db, ZIO_PRIORITY_SYNC_READ,
  3.      (*flags & DB_RF_CANFAIL) ? ZIO_FLAG_CANFAIL : ZIO_FLAG_MUSTSUCCEED,
  4.      &aflags, &zb);
然后调用arc_read函数,从arcbuffer中找。

真正的函数在这里可以看到 buf_hash_find根据blkptr,来映射到hash表中,经过hash查找,结果返回hdr。

点击(此处)折叠或打开

  1. hdr = buf_hash_find(guid, BP_IDENTITY(bp), BP_PHYSICAL_BIRTH(bp),
  2.      &hash_lock);
如果找到了,hdr->buf中含有的db想要的数据,说明arc buffer命中。然后调用回调函数返回。如果没找到,那么就向磁盘发请求。


这种双buffer的设计不得不让zfs在写的时候也得考虑arc buffer,也就是在同步dmu buffer的时候,sync_leaf函数会调用arc_write函数,在这个函数当中会给zio设置回调函数,在回调函数当中,将zio的数据传送到arc buffer上(插入算法为HASH算法)。
阅读(157) | 评论(0) | 转发(0) |
0

上一篇:zfs的zio代码部分学习

下一篇:zfs如何进入内核态

相关热门文章
  • 笔试准备 --- 子字符串查找程...
  • 笔试准备 ---约瑟夫环...
  • 事务隔离而取不到insert数据...
  • system用户远程登录em管理错误...
  • 素材全国新钝设想师环保主题计...
  • 双机热备Oracle数据库服务器操...
  • 双机热备Oracle数据库服务器操...
  • 双机热备Oracle数据库服务器操...
  • 缘聚湘西南 武冈深圳同乡会 欢...
  • 虚拟磁带库 变革数据保护流程(...
  • 这样配置的服务器能够承受8k并...
  • vm里的系统能够ping到nfs,但...
  • bind是否随机从两台master中读...
  • 在win7下用cygwin搭建hadoop,...
  • Mysql的binglog日志能否分库备...
给主人留下些什么吧!~~
原创粉丝点击