I was wondering whether FUSE was being a bottleneck in my various ZFS-FUSE [1] tests [2] or whether the performance issues at present are just that ZFS is very young code on Linux and that the fact that Riccardo hasn’t yet started on optimisation.
As a quick reminder, here’s what JFS can do on a software RAID 1 array on this desktop:
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
inside 2G 39388 11 24979 5 53968 6 255.4 1
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 9032 24 +++++ +++ 8642 33 2621 18 +++++ +++ 993 5
inside,2G,,,39388,11,24979,5,,,53968,6,255.4,1,16,9032,24,+++++,+++,8642,33,2621,18,+++++,+++,993,5
real 4m0.982s
user 0m0.292s
sys 0m17.201s
…and here is how ZFS-FUSE compares…
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
inside 2G 18148 4 9957 3 28767 3 164.4 0
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 3093 6 6201 8 3090 4 2906 5 8592 9 4165 6
inside,2G,,,18148,4,9957,3,,,28767,3,164.4,0,16,3093,6,6201,8,3090,4,2906,5,8592,9,4165,6
real 7m59.385s
user 0m1.140s
sys 0m16.201s
That’s of the order of half the speed. So, how does NTFS-3G compare ? Here are the results:
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
inside 2G 31222 6 14076 4 30118 2 137.5 0
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 1780 4 15379 10 4521 8 3276 7 16683 14 4429 5
inside,2G,,,31222,6,14076,4,,,30118,2,137.5,0,16,1780,4,15379,10,4521,8,3276,7,16683,14,4429,5
real 6m14.292s
user 0m1.032s
sys 0m14.173s
So at first blush it looks somewhere between the two with a 6+ minute run time, but the disk write & re-write speeds are substantially better than ZFS.
But where it gets really interesting is comparing NTFS-3G with my XFS results, below:
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
inside 2G 31444 9 15949 4 30409 4 261.3 1
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 3291 21 +++++ +++ 2720 14 3286 22 +++++ +++ 874 7
inside,2G,,,31444,9,15949,4,,,30409,4,261.3,1,16,3291,21,+++++,+++,2720,14,3286,22,+++++,+++,874,7
real 5m38.876s
user 0m0.380s
sys 0m19.645s
Here’s a table of results comparing the write, rewrite and read speeds of each.
| Write | Rewrite | Read | |
|---|---|---|---|
| JFS (kernel) | 39 | 25 | 54 |
| XFS (kernel) | 31 | 16 | 30 |
| NTFS-3G (FUSE) | 31 | 14 | 30 |
| ZFS (FUSE) | 18 | 10 | 28 |
So that’s pretty conclusive, we have a FUSE filesystem (which also claims to not be optimised [3]) which can pretty much match an in-kernel filesystem.