服务器与存储
文章平均质量分 74
shenyanxxxy
这个作者很懒,什么都没留下…
展开
-
zfs on linux 开启debug模式
本人尝试开启zfs on linux的开关,但是始终都打不开,经过我反复的尝试,我向zfs on linux的作者发邮件,才得到debug的方法。下面分享如下: install spl:点击(此处)折叠或打开$ ./configure --enable-debug(进入spl的src目录当中) make make installinstall原创 2013-08-06 10:55:13 · 1219 阅读 · 0 评论 -
存储自测答案总结
今天参加了有关存储的测试,没看到是多选,好些概念不是很清楚,但是经过一番思想 将一些基础概念弄明白了。 RAID 5 为一块冗余盘,RAID6为两块冗余盘。 云计算的三大模型: IaaS,PaaS,SaaS (这个概念有点太大,个人感觉知不知道都没关系) FCoE为聚合网络协议 FC,Iscsi,FCoE都SAS原创 2013-08-06 10:55:57 · 781 阅读 · 0 评论 -
zfs脏记录分析
zvol 共32个线程,一起来完成处理request的操作。从bio当中向dbuf中写入数据。 根据request中的offset 和 length。zvol调用dbuf_hold 来查找该dbuf,如果没有就创建dbuf。 下面要写dbuf了。 共有两种情况:1.全块写 2.部分写 对于全块写,dbuf先从arc 的cache当中申请原创 2013-08-06 10:56:01 · 1176 阅读 · 0 评论 -
在linux中安装zfs的方法
今天由于要测试自己的代码,需要在其他机器上安装zfsonlinux。安装报错,现总结如下。安装的是zfs-0.6.11版本需要安装zlib库以及uuidapt-get install zlib1g-dev uuid-dev。然后在编译的时候遇到一个错误就是dmu_send.c 386 line报错386: error: integer constant is too large原创 2013-08-06 10:56:04 · 2199 阅读 · 0 评论 -
zfs的同步机制深究(zio层面)
zfs同步机制 到了zio之后,就很难从代码上进行跟踪了。今天解决了困扰自己数月的问题。对于间接块而言,必须要先同步叶子节点,即该间接块的叶子节点必须申请完新写入的空间,才可以同步他自己。当间接块的zio开始进入zio_write_bp_init流水线的时候,会发现这个时候叶子节点还没有进入zio_ready状态。那么通过函数 点击(此处)折叠或打开原创 2013-08-06 10:56:17 · 2016 阅读 · 0 评论 -
zfs编译之后,内核模块没更新的解决方案
今天遇到的一个问题就是编译zfs的时候,按照正常的方法:makemake installreboot然后开机重新创建zvol的时候发现系统使用的内核模块根本就不是我新安装的zfs.ko。这个是什么原因我不知道,我通过make uninstall 和make clean的办法尝试清除项目文件,但仍然无济于事。我找到了这其中的原因,原因是make install的时候,系统原创 2013-08-06 10:56:21 · 1732 阅读 · 0 评论 -
吐槽zfsonlinux的缺点
自己用zfsonlinux已经一段时间了,其中有非常多的感受难以言表。1.zfsonlinux加入了一个spl层。本身是借助spl 层,spl默默的为zfs提供了很多的函数调用支持,所以你只是了解zfs的源代码是不够的,还必须要对spl层有足够的了解才行。2.内核模块的限制。运行在linux上的zfs是以内核模块的形式运行于linux上的。而作为一个庞大的复杂的文件系统内核模块需要依赖原创 2013-08-06 10:56:33 · 4690 阅读 · 0 评论 -
向内核传递参数的方法
一种动态的方法向内核传递参数。方法与solaris系统不同。solaris系统上的传递方法是修改/etc/system,而对于linux系统,却并非如此。我的系统是Ubuntu系统,比如修改zfs内核模块的参数的方法是, 点击(此处)折叠或打开 $echo 64 > /sys/module/zfs/parameter原创 2013-08-06 10:56:35 · 1104 阅读 · 0 评论 -
调试内核的方法总结
使用kern.log 日志文件来调试内核,应用的场景真的非常的少,而且如果printk语句打印过多就会容易发生死机。另外还有两种方法可以调试内核,第一通过kdump方法,第二种方法是使用sysrq。首先介绍sysrq,在2.1.x系列,就已经有sysrq了。所以他的历史还是比较久远,而且比较稳定。第一步,看看内核是否支持sysrq。 点击(此处)折叠或原创 2013-08-06 10:56:37 · 694 阅读 · 0 评论 -
使用kdump追踪系统死机问题
1.将crash文件解压缩到~/tmp目录里面apport-unpack /var/crash/linux-image-2.6.32-33-generic.0.crash ~/tmp可以看到在tmp目录下有好多文件。2.系统需要安装dbgsym 因为原有内核的调试信息太少了,无法满足需要的。在这里下载并安装 相应的版本号的dbgsym调试信息,http://ddebs.ub原创 2013-08-06 10:56:42 · 1677 阅读 · 0 评论 -
spinlock自旋锁分析
读了这个http://blog.csdn.net/qinzhonghello/article/details/3557055,对自旋锁有了更深的理解。自旋锁可以使用在中断处理程序中(此处不能使用信号量,因为它会导致睡眠)。在中断处理程序中使用自旋锁时,一定要在获取锁之前,首先禁本地中断(在当前处理器上的中断请求),否则,中断处理程序就会打断正持有锁的内核代码,有可能会试图去争用这个已经被持有的原创 2013-08-06 10:56:45 · 1066 阅读 · 0 评论 -
spinlock造成死锁的原因
看了这个网址,对自选锁造成的死锁有了更深刻对理解。http://blog.csdn.net/zhanglei4214/article/details/6837697spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。 举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),原创 2013-08-06 10:56:47 · 3061 阅读 · 0 评论 -
内核线程创建与销毁
查看内核线程的方法:ps -aux 可以查看系统中的所有线程,其中带有[ ]的表示是内核线程。内核线程创建方法:thread = kthread_create(taskq_thread, tqt, "%s/%d", name, i);wake_up_process(thread);其中taskq_thread为该内核函数需要做的事情。内核线程的销毁函数如下:kthr原创 2013-08-06 10:56:53 · 901 阅读 · 0 评论 -
块设备设备号的概念
在kernel目录树的documentation/devices.txt文件,里面详细的描述了块设备驱动的设备号的信息。在创建一个块设备的时候需要指定dev_t这个结构,该结构通过宏MKDEV()实现。而这个宏MKDEV(major,minor) 也就是通过指定一个主设备号,和次设备号,主设备号相同说明使用相同的设备驱动程序。在/dev/目录下 ll发现:rw-rw----原创 2013-08-06 10:56:56 · 1447 阅读 · 0 评论 -
合并IO代码分析
在这里梳理一下zfs合并请求的代码部分。如果fio 不等于lio,说明可以合并临近的IO请求。 if (fio != lio) { uint64_t size = IO_SPAN(fio, lio); 找到IO之间的差值作为新的zio 的size。 ASSERT(size <= zfs_vdev_aggregation_limit); ASSERT(vi原创 2013-08-06 10:55:55 · 1010 阅读 · 0 评论 -
zfs中的锁的使用
在dmu buffer当中,最为常见的是互斥锁,但是有一个问题随之而来,如何使用互斥锁,而且怎么样来规定mutex锁所保护的范围呢? /* db_mtx protects the members below */ kmutex_t db_mtx; /* * Current state of the buffer */ dbuf_states_t db_sta原创 2013-08-06 10:55:48 · 877 阅读 · 0 评论 -
zfs如何进入内核态
有些时候,在zfs当中,你加入printk语句,发现无法加,会编译报错,而很奇怪的是有些地方可以加printk,而有些地方不能加。 根据我的观察发现,只要加入宏定义就可以了。 方法如下:#ifdef __KERNEL printk("HELLO WORLD\n");#endif 管理原创 2013-08-06 10:55:44 · 983 阅读 · 0 评论 -
ZFS中的RAIDZ对RAID5的改进。
RAIDZ尽管和RAID5有很多地方类似,但是RAIDZ并不是RAID5.RAID5最显著的缺点就是"write hole",因为他无法提供任何安全的机制保证写校验码的时候不出现故障。而如果此时断电,那么将造成parity是错误的,当然后期利用这个错误的parity更新的新的数据块将更是错误的。而此时用户并不知道。而RAIDZ具有两个特点。特点一:避免了读旧数据-修改parity-写数据的RAID原创 2013-08-06 10:55:15 · 5600 阅读 · 0 评论 -
jiffies内核变量解析
这个变量经常会让人弄混,很多人只是知道它是一个与时间有关的变量。它的真正的意义是从开机以来所经历的tick数。HZ表示此时系统的频率。在X86体系当中该值是100。但是在其他的体系结构当中结果是不同的。2*HZ /* 2 seconds in jiffies */HZ /* 1 second in jiffies */foo * HZ /* foo second原创 2013-08-06 10:56:49 · 780 阅读 · 0 评论 -
脚本备份
生成一个fio.cfg文件。这个配置文件时fio的配置文件的格式,主要是为了测试100个zvol而设置的配置文件。#!/bin/bashfor i in {1..100}doitx=`expr $i - 1`;itx=`expr $itx \* 16`;cat >conftest.a[test$itx]filename=/dev/zd$itxbs=512ki原创 2013-08-06 10:56:51 · 888 阅读 · 0 评论 -
理解1024叉树方式的文件组织形式
在ZFS当中用一种类似于1024叉树的方法组织一个文件(dnode)。所有的叶子节点存真正的数据,而间接块存放的是元数据。元数据存放的是数据在磁盘上的位置。可以看到这个是一个倒挂的树,当要查找某个叶子节点的时候。DBUF_HOLD(level,blkid)1.通过hash查找,看是否在内存当中存在,如果存在直接返回该dbuf中的数据。2.如果查找不到,那么说明在磁盘上,原创 2013-08-06 10:57:12 · 924 阅读 · 0 评论 -
调试内核的方法总结2-NMI watchdog原理分析
上一次改zfs代码导致系统死机,sysrq尝试过,由于键盘已经不能用了,所以sysrq用不上了,然后又尝试了Kdump工具,结果仍然是失败了,系统依然死机,而且也没看到发生一次内核转储。所以打算采用以下的NMI watchdog的方法检测死机问题,强制内核转储。 NMI(Not Maskable Interrupt)的意思是:不可屏蔽中断的意思。最开始用在内存校验错误的时候通知CPU原创 2013-08-06 10:57:41 · 3577 阅读 · 0 评论 -
剖析zfs的写磁盘的操作
很少有和zfs相关的代码分析,中文的材料基本没有,我来剖析一下zfs的写磁盘的底层的实现吧。在zio 的流水线当中,有一个流水线的名称为vdev_disk_io_start。在vdev_disk_io_start(zio *zio)函数中,做了如下的事情:1.判断zio的请求类型(zio->io_type)2.根据类型,将zio 传递给__vdev_disk_physio(vd->vd_bdev,原创 2013-08-06 10:55:09 · 2060 阅读 · 0 评论 -
zfs异步写分析(一)
作者:沈岩转载请注明出处。我发现国内研究zfs的同学非常少,如果你也跟我有相同的爱好,研究zfs,请告诉我,相互学习。商业文件系统zfs是文件系统当中相当出色的一个了,由sun公司开发。spa_sync函数负责同步spa中所有的内容到磁盘。然后会同步dsl,之后就是同步dbuf,将dmu buffer中的内容同步到磁盘上。dbuf_sync_list 负责同步的主要工作,他是一个递归函数,同步两种原创 2013-08-06 10:55:11 · 1412 阅读 · 0 评论 -
zfs当中的事务处理研究与探索
对于zfs而言,每一层都会有事务处理的痕迹。zio,metaslab,spa,dmu 每层基本上都少不了transaction group。transaction group的更新主要是在txg的两个线程中完成的,使用最多的是spa 和dmu 层。transaction group 总共分三组:open 刚开始的写的请求分配一个open txg。quiesce 等待同步的写请求原创 2013-08-06 10:55:24 · 2109 阅读 · 0 评论 -
zfs当中的事务处理(二)
当写buffer的操作完成之后,在dbuf_dirty函数当中,会创建一个dr,dr所属的txg 为 open txg 的 txg id。然后 他会插入到dnode的dn_dirty_records当中。为了以后同步的时候使用,所以 根据txgoff=txg & TXG_MASK,算出相应的txgoff,然后插入进去。当open txg 变成 sync txg的时候,sync thread会调用函原创 2013-08-06 10:55:28 · 1290 阅读 · 0 评论 -
Linux,zfs耗内存的原因剖析
有些时候大家可能觉得Linux系统刚刚启动的时候没什么操作,为什么这么耗内存。最最常见的回答就是Linux会将很多的东西cache到内存当中。这么说是笼统的。 linux的cache有很多种,linux之所以这么消耗内存,主要是内核的设计即使如此。 我总结了一下,主要有两个大类: 1.slab会先从内存当中申请一些内存,以备内核申请一个核心数据结构的时候能够快速得到满足,提高内核原创 2013-08-06 10:55:31 · 5297 阅读 · 0 评论 -
zfs的块设备写操作很慢的原因分析
zfs的写性能很差,zfs on linux 上的写性能个人感觉更差。 而且这种差很难修改,原因是由于在linux内核当中,在zfs当中,对于一个4k块大小的块设备,如果你要重写一个2k的块,你可以发现大量的读操作从内核的上层发起。操作如下$dd if=/dev/zero of=/dev/zd0 bs=2k count=10000造成大量的读的原因很简单 由于你要2k,2k的写,而真正的zfs 的原创 2013-08-06 10:55:33 · 4321 阅读 · 0 评论 -
zfs的双buffer设计问题
zfs是有两个缓冲区的。首先是dmu buffer,如果dmu buffer中没有数据再找arc buffer,如果找到了,那么就直接调用回调函数,将arc buffer的内容传给dmu buffer。如果再找不到就找磁盘。具体的实现细节如下: dbuf_read 首先会看 dmu buffer的状态,如果是UNCACHED。就会调用 dbuf_read_impl函数。dbuf_read_imp原创 2013-08-06 10:55:42 · 1550 阅读 · 0 评论 -
算法导论-计算时间复杂度主定理
递归式与分治方法是紧密相关的,因为使用递归式可以清晰的刻画分治算法的运行时间。主方法如下:T(n) = aT(n/b) + f(n)a>=1 b>1 f(n) 是给定的函数。这种形式的递归式很常见。刻画了一个分治算法。生成a个子问题。每个子问题是原来的1/b。分解和合并步骤共消耗f(n)主方法是计算时间复杂度的时候用的。利用上面的这个定理就可以计算递归式的时间复杂度了,原创 2013-08-06 10:57:16 · 2157 阅读 · 0 评论