阿弥陀佛
发布时间:2013-01-13 20:53:21
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来查找。 点击(此处)折叠或打开(voi......【阅读全文】
发布时间:2013-01-11 16:55:22
在对zfs的介绍当中,会提到他会对读写请求排序,然后再合并相邻的请求。这也是可以理解的。通过阅读代码发现,实际上对请求的排序工作都是在avl树当中进行的。 点击(此处)折叠或打开struct vdev_queue {????avl_tree_t????vq_deadline_tree;????avl_tree_t????vq_read_tree;????avl_tree_t??......【阅读全文】
发布时间:2013-01-11 14:12:28
http://www.makelinux.net/books/lkd2/ch11lev1sec5vmalloc 函数常常和kmalloc作为内核申请内存的主要函数,vmalloc申请的内存是内存的虚拟地址是连续的,而kmalloc申请的内存的物理地址是连续的。而内核大多采用kmalloc,主要的原因是由于kmalloc申请的内存是物理上连续的,效率高,而vmalloc申请的内存虚拟地址连续,但是使用的时候需要经过一个页表转换,有开销,效率低。而且某些硬件设备是不经过内存管理单元的。vmalloc的使用场合是内核模块动态的加载进内核的时候,使用vmalloc,而不是使用kmalloc,或者是需要......【阅读全文】
发布时间:2013-01-08 19:32:51
zfs的写性能很差,zfs on linux 上的写性能个人感觉更差。 而且这种差很难修改,原因是由于在linux内核当中,在zfs当中,对于一个4k块大小的块设备,如果你要重写一个2k的块,你可以发现大量的读操作从内核的上层发起。操作如下$dd if=/dev/zero of=/dev/zd0 bs=2k count=10000造成大量的读的原因很简单 由于你要2k,2k的写,而真正的zfs 的块设备块大小为4k,所以他会发起一个读取整个块的操作,从磁盘上读一个4k上来,然后将2k的数据写入这个块上,然后将这个新的4k,封装好bio,以request的形式往底层传递......【阅读全文】