NILFS2文件系统试用笔记

今天蚊子在网上看到了ibm的这么一篇文章《从 NILFS2 看 Log-Structure 文件系统》,主要讲的是新的一个文件系统—NILFS2

NILFS2 的特性

NILFS2 是一种 Linux 文件系统,人们称它为 New Implementation Log-Structure File System。我一时之间也不知道如何将 Log-Structure 翻译为中文。如果说 Log 是日志,那么可能会和 Ext3 等日志文件系统有所混淆。因此还是直接使用 Log-Structure File System 这个称呼吧。

进入 NILFS2 的细节之前,我想应该先从使用的角度来认识它。文件系统主要的功能是管理文件,NILFS2 也不例外。将 NILFS2 和其他形形色色的文件系统区别开的是它所有的一些独一无二的特性。

不间断的快照(continuously snapshot)

不间断快照应该是 NILFS2 最吸引人的特性。它使得 NILFS2 用户能够方便地恢复被误删除的文件,或者将被误修改的文件恢复到修改之前的内容。

其他一些文件系统也支持 snapshot,但往往需要人工干预,即用户须使用 FS 自带的命令来创建快照。然而,误操作往往不可预料,不可能在误操作之前恰好创建一个快照,所以在其他文件系统中,恢复文件需要非常专业的人员和工具。

NILFS2 的用户则幸运地多,因为系统能自动备份对文件的所有操作。因此 NILFS2 不仅能及时恢复被删除的文件,还能恢复任意修改之前的文件内容。甚至可以说,在 NILFS2 文件系统中,用户不再需要专门的版本管理工具来管理文件的不同版本。而且这一切还是自动的!

对于系统管理员,NILFS2 的不间断快照功能使得 Online backup 等日常操作更加方便,无需再学习复杂的备份和恢复命令,进而从这些繁杂的日常事务中解脱出来。

高效的错误恢复

长期以来,文件系统设计人员最关注的问题之一便是尽量减少系统崩溃后文件系统的检查和恢复时间。无论哪一种文件系统,当系统硬件崩溃时,文件系统便很可能处于不一致状态。因此 reboot 之后,便需要运行 fsck。

Ext3 和其他许多 Linux 文件系统采用日志技术减少 fsck 时间。NILFS2 是一种 Log-Structure 文件系统,其 fsck 时间更短,而且无论磁盘有多大,文件有多少,NILFS2 的 fsck 时间都是一定的。

快速 fsck 有什么意义呢? ChunkFS 的设计者 Valerie Aurora 曾描述过这样一件事情,有一次,Linux Archive 服务器遭遇意外,硬件 reboot 后,执行 fsck 花费了 1 个星期的时间,在这一周内,网站都无法提供访问,人们想,即使用备份来重新恢复数据也没有这么慢吧。在文件系统容量越来越大的时代,快速 fsck 这个特性非常有吸引力。

文件访问效率高

许多研究表明,文件系统的整体效率主要由写操作的效率决定。因为文件系统读操作的效率由 cache 设计的好坏决定。在 Linux 中,cache 由 VFS 统一管理,因此提高写操作的效率能提高整体文件系统的效率。

具体细节可以去看ibm的那篇文章

从 2.6.30 开始,NILFS2 已经合并入内核。假如您希望在较老的内核下尝试 NILFS2 也非常简单。NILFS2 是一个内核模块,您只需编译后加载模块文件就可以使用它了,无需对内核进行 patch 和重新编译。

对于2.6.30以前的内核需要手动安装文件,以centos5为例

http://www.nilfs.org/pub/centos/5/RPMS/i386/
http://www.nilfs.org/pub/centos/5/RPMS/i686/

在这两个地址下载对应的rpm包进行安装,可以使用以下命令对nilfs2文件系统进行使用

modprobe nilfs
mkfs.nilfs2 /dev/VolGroup00/test
mount –t nilfs2 /dev/VolGroup00/test /mnt/nilfs

对于这个文件系统,蚊子自己也做了一个小测试,具体性能还请 各位看官进行评判吧

测试环境:

cpu:AMD 巴顿2500+
内存:2G
硬盘:SATA1代 160G
分区:/dev/VolGroup00/test  10G  nilfs2文件系统   挂载到/mnt/nilfs
            /dev/VolGroup00/test2  10G  ext3文件系统   挂载到/mnt/ext3
测试使用工具:dd和time两个命令

测试1、分别在两个分区上创建1G的文件,观察时间和写入速度

NILFS2分区:

# time dd if=/dev/zero of=/mnt/nilfs/data bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 28.8544 seconds, 36.3 MB/s

real    0m28.872s
user    0m0.008s
sys     0m7.488s

# time dd if=/dev/zero of=/mnt/nilfs/data bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 28.7111 seconds, 36.5 MB/s

real    0m31.212s
user    0m0.004s
sys     0m9.961s

EXT3分区

# time dd if=/dev/zero of=/mnt/ext3/data bs=10M count=100    
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 8.19291 seconds, 128 MB/s

real    0m8.217s
user    0m0.000s
sys     0m4.424s

# time dd if=/dev/zero of=/mnt/ext3/data bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 8.17914 seconds, 128 MB/s

real    0m14.791s
user    0m0.000s
sys     0m4.840s

结论:ext3的写入性能明显高于nilfs2的写入性能

测试2、读取创建的1G文件,观察时间和读取速度

NILFS分区

# time dd if=/mnt/nilfs/data of=/dev/null bs=10M count=100             
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 23.266 seconds, 45.1 MB/s

real    0m23.286s
user    0m0.000s
sys     0m1.472s

# time dd if=/mnt/nilfs/data of=/dev/null bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 11.147 seconds, 94.1 MB/s

real    0m11.217s
user    0m0.000s
sys     0m1.984s

EXT3分区

# time dd if=/mnt/ext3/data of=/dev/null bs=10M count=100              
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 2.65616 seconds, 395 MB/s

real    0m2.667s
user    0m0.000s
sys     0m2.652s

# time dd if=/mnt/ext3/data of=/dev/null bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 2.63553 seconds, 398 MB/s

real    0m2.639s
user    0m0.000s
sys     0m2.628s

结论:ext3的读取性能高于nilfs2,由于第二次读取可能经过缓存,所以nilfs2第二次读取速度明显高于第一次

测试3、创建1000个10k的文件的写入速度

NILFS分区

# time for i in echo {1..1000}; do dd if=/dev/zero of=/mnt/nilfs/data$i bs=10k count=1 &>/dev/null ;done

real    0m3.759s
user    0m0.628s
sys     0m2.700s

# time for i in echo {1..1000}; do dd if=/dev/zero of=/mnt/nilfs/data$i bs=10k count=1 &>/dev/null ;done

real    0m3.322s
user    0m0.528s
sys     0m2.792s

EXT3分区

# time for i in echo {1..1000}; do dd if=/dev/zero of=/mnt/ext3/data$i bs=10k count=1 &>/dev/null;done

real    0m3.886s
user    0m0.764s
sys     0m2.484s

# time for i in echo {1..1000}; do dd if=/dev/zero of=/mnt/ext3/data$i bs=10k count=1 &>/dev/null;done

real    0m3.332s
user    0m0.696s
sys     0m2.628s

结论:nilfs在1000个10k小文件的创建上稍稍领先ext3

测试4、对1000个10k文件的读取速度

NILFS分区

# time for i in echo {1..1000}; do dd if=/mnt/nilfs/data$i of=/dev/null bs=10k count=1 &>/dev/null ;done       

real    0m3.293s
user    0m0.676s
sys     0m2.616s

# time for i in echo {1..1000}; do dd if=/mnt/nilfs/data$i of=/dev/null bs=10k count=1 &>/dev/null ;done

real    0m3.264s
user    0m0.460s
sys     0m2.800s

EXT3分区

# time for i in echo {1..1000}; do dd if=/mnt/ext3/data$i of=/dev/null bs=10k count=1 &>/dev/null;done         

real    0m3.267s
user    0m0.528s
sys     0m2.736s

# time for i in echo {1..1000}; do dd if=/mnt/ext3/data$i of=/dev/null bs=10k count=1 &>/dev/null;done

real    0m3.310s
user    0m0.544s
sys     0m2.756s

结论:在小文件的读取上,两个文件系统没有太大差别

测试5、nilfs文件系统文件删除回复操作

先创建是个有内容的文件

# for i in echo {1..10}; do echo "abcdefg,test $i">$i; done

删除第5个文件,内容为:

# cat 5
abcdefg,test 5

# rm -f 5

回复操作

# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2009-11-21 18:52:27   cp    -         11          3
                   2  2009-11-21 19:16:52   cp    -     446377          4
                   3  2009-11-21 19:17:34   cp    -     449173          4
                   4  2009-11-21 19:28:14   cp    -     226149          4
                   5  2009-11-21 19:29:21   cp    -     448509          4
                   6  2009-11-21 19:36:59   cp    -       4233       1004
                   7  2009-11-21 19:38:51   cp    -       5248       1004
                   8  2009-11-21 19:49:40   cp    -       2105          3
                   9  2009-11-21 19:52:57   cp    -         26         13
                  10  2009-11-21 19:54:36   cp    -         15         12

我们创建文件的时间在19:52分左右,而我们假如在19:54分删除了5这个文件,所以我们现在应该在19:52分左右创建snapshot点

# chcp ss 9

# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2009-11-21 18:52:27   cp    -         11          3
                   2  2009-11-21 19:16:52   ss    -     446377          4
                   3  2009-11-21 19:17:34   cp    -     449173          4
                   4  2009-11-21 19:28:14   cp    -     226149          4
                   5  2009-11-21 19:29:21   cp    -     448509          4
                   6  2009-11-21 19:36:59   cp    -       4233       1004
                   7  2009-11-21 19:38:51   cp    -       5248       1004
                   8  2009-11-21 19:49:40   cp    -       2105          3
                   9  2009-11-21 19:52:57   ss    -         26         13
                  10  2009-11-21 19:54:36   cp    -         15         12

# mkdir /recovery
# mount –t nilfs2 -r -o cp=9 /dev/VolGroup00/test /recovery
# ll /recovery/
total 40
-rw-r–r– 1 root root 15 Nov 21 19:52 1
-rw-r–r– 1 root root 16 Nov 21 19:52 10
-rw-r–r– 1 root root 15 Nov 21 19:52 2
-rw-r–r– 1 root root 15 Nov 21 19:52 3
-rw-r–r– 1 root root 15 Nov 21 19:52 4
-rw-r–r– 1 root root 15 Nov 21 19:52 5
-rw-r–r– 1 root root 15 Nov 21 19:52 6
-rw-r–r– 1 root root 15 Nov 21 19:52 7
-rw-r–r– 1 root root 15 Nov 21 19:52 8
-rw-r–r– 1 root root 15 Nov 21 19:52 9

# cat /recovery/5
abcdefg,test 5

由此看到,我们刚刚删除过的5号文件又回来了

总体来讲nilfs2文件系统还是不错的,可能蚊子对于这个系统的测试方式有问题,还望大家多多测试。就恢复文件这个特性来讲,对于文件系统的强壮性还是很有帮助的。