...making Linux just a little more fun!

<-- prev | next -->

Benchmarking Filesystems Part II

By Justin Piszcz

Introduction

After the last article was published, I have received more than a dozen requests for a second filesystem benchmark using the 2.6 kernel. Since that time, I have converted entirely to XFS for every Linux machine I use, so I may be a bit bias regarding the XFS filesystem. I tried to keep the hardware roughly the same. Instead of a Western Digital 250GB and Promise ATA/100 controller, I am now am using a Seagate 400GB and Maxtor ATA/133 Promise controller. The physical machine remains the same, there is an additional 664MB of swap and I am now running Debian Etch. In the previous article, I was running Slackware 9.1 with custom compiled filesystem utilities. I've added a small section in the beginning that shows the filesystem creation and mount time, I've also added a graph showing these new benchmarks. After the first round of benchmarks, I received a sleuth of e-mails asking for the raw numbers. The numbers are now included in tables at the end of this e-mail for both the last and current set of benchmarks.

What's new?

1) Unify the graphs so all but one are the same type.
2) Run tests with a recent distribution and the 2.6.14.4 kernel.
3) Included the ReiserFS Version 4 benchmarks.
4) Included the raw data in matrix form at the bottom of this page.
5) Included three additional graphs:
   a) Creation time to make the actual filesystem.
   b) Time it takes to mount the filesystem.
   c) The amount of space available after formatting with the default options.

Specifications

Hardware

    COMPUTER: Dell Optiplex GX1
         CPU: Pentium III 500MHZ
         RAM:  768MB
        SWAP: 2200MB
  CONTROLLER: Maxtor Promise ATA/133 TX2 - IN PCI SLOT #1 
 DRIVES USED: 1] Seagate 400GB ATA/100 8MB CACHE 7200RPM
              2] Maxtor 61.4GB ATA/66 2MB CACHE 5400RPM
DRIVE TESTED: The Seagate 400GB.

Software

 LIBC VERSION: 2.3.5
       KERNEL: linux-2.6.14.4
COMPILER USED: gcc-4.0.3
         EXT2: e2fsprogs-1.38/sbin/mkfs.EXT2
         EXT3: e2fsprogs-1.38/sbin/mkfs.EXT3
          JFS: jfsutils-1.1.8/sbin/mkfs.jfs 
   REISERFSv3: reiserfsprogs-3.6.19/sbin/mkreiserfs
   REISERFSv4: reiser4progs-1.0.5/sbin/
               (Used patch reiser4-for-2.6.14-1.patch w/ libaal-1.0.5 + reiser4progs-1.0.5)
          XFS: xfsprogs-2.6.36/sbin/mkfs.xfs

Tests Performed

001] Create 10,000 files with touch in a directory.
002] Run 'find' on that directory.
003] Remove the directory.
004] Create 10,000 directories with mkdir in a directory.
005] Run 'find' on that directory.
006] Remove the directory containing the 10,000 directories.
007] Copy kernel tarball from other disk to test disk.
008] Copy kernel tarball from test disk to other disk.
009] Untar kernel tarball on the same disk.
010] Tar kernel tarball on the same disk.
011] Remove kernel source tree.
012] Copy kernel tarball 10 times.
013] Create 1GB file from /dev/zero.
014] Copy the 1GB file on the same disk.
015] Split a 10MB file into 1000/1024/2048/4096/8192 byte pieces.
016] Copy kernel source tree on the same disk.
017] Cat a 1GB file to /dev/null.

NOTE1: Between each test run, a 'sync' and 10 second sleep   
       were performed.
NOTE2: Each file system was tested on a cleanly made file
       System.
NOTE3: All file systems were created using default options.
NOTE4: All tests were performed with the cron daemon killed   
       and with 1 user logged in.
NOTE5: All tests were run 3 times and the average was taken,  
       if any tests were questionable, they were re-run and 
       checked with the previous average for consistency.

Creating the Filesystems

EXT2

p500:~# mkfs.EXT2 /dev/hde1
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
48840704 inodes, 97677200 blocks
4883860 blocks (5.00%) reserved for the super user
First data block=0
2981 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
p500:~#

EXT3

p500:~# mkfs.EXT3 /dev/hde1
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
48840704 inodes, 97677200 blocks
4883860 blocks (5.00%) reserved for the super user
First data block=0
2981 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
p500:~#

JFS

p500:~# mkfs.jfs -q /dev/hde1
mkfs.jfs version 1.1.8, 03-May-2005
   \

Format completed successfully.

390708801 kilobytes total disk space.
0.03user 1.01system 0:02.62elapsed 40%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+224minor)pagefaults 0swaps
p500:~#

REISERFS V3

p500:~# mkreiserfs -q /dev/hde1
mkreiserfs 3.6.19 (2003 www.namesys.com)

A pair of credits:
Continuing core development of ReiserFS is  mostly paid for by Hans Reiser from
money made selling licenses  in addition to the GPL to companies who don't want
it known that they use ReiserFS  as a foundation for their proprietary product.
And my lawyer asked 'People pay you money for this?'. Yup. Life is good. If you
buy ReiserFS, you can focus on your value add rather than reinventing an entire
FS.

Chris Mason wrote the journaling code for V3,  which was enormously more useful
to users than just waiting until  we could create a wandering log filesystem as
Hans would have unwisely done without him.
Jeff Mahoney optimized the bitmap  scanning code for V3,  and performed the big
endian cleanups. 
p500:~# 

REISERFS V4

p500:~# mkfs.reiser4 -y /dev/hde1
p500:~# 

XFS

p500:~# mkfs.xfs -f /dev/hde1
meta-data=/dev/hde1              isize=256    agcount=16, agsize=6104825 blks
         =                       sectsz=512  
data     =                       bsize=4096   blocks=97677200, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal log           bsize=4096   blocks=32768, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=65536  blocks=0, rtextents=0
p500:~# 

Benchmark Set 1 of 4


Both extended filesystem revisions take a backseat to their counterparts.


ReiserFS takes a VERY long time to mount the filesystem. I included this test because I found it actually takes minutes to hours mounting a ReiserFS filesystem on a large RAID volume.


People always complain about how hard drive manufacturers equate 1000 kilobytes as a megabyte, well the filesystem is also part of the problem!

Benchmark Set 2 of 4


In the first test, ReiserFSv3 continues to lead the pack, with ReiserFSv4 and JFS not far behind.


ReiserFSv4 is now the slowest filesystem to search for files, previously, it had been XFS.


XFS is no longer the slowest filesystem for removing many files. However, EXT2 and EXT3 still win by far.


Similar to the first test, EXT2 and EXT3 lag behind the other journaling filesystems.


Contrary to the first set of benchmarks I ran, it appears XFS has slightly improved, ReiserFSv4 is now the slowest with ReiserFSv3 behind it. Also in the previous test, EXT3 had suffered a huge performance hit in this area, it is now comparable to EXT2.


It appears ReiserFS v3 and v4 have some serious issues deleting large numbers of directories.


In the first benchmark test, EXT2 won the test, now XFS is the new leader.


This benchmark represents how fast the tar ball can be read from each file system. Surprisingly, XFS now exceeds EXT3.


ReiserFSv3 won the last benchmarking round; however, EXT2 and EXT3 now dominate this test.


The best journaling file system here used to be ReiserFSv3; however, JFS now wins the benchmark.


ReiserFSv3 used to be the winner, it is now ousted by EXT2 and EXT3.


The biggest difference here is most of the filesystems have evened out compared to the first benchmarking test.


This test has remained relatively the same.


Once again, mostly the same; however, it is important to note that the performance of EXT2 and EXT3 are much closer this time.


EXT2 and EXT3 take the biggest hit up to about 4096 bytes which is surprising.


EXT2 and EXT3 now outperform ReiserFSv3. In most of these benchmarks thus far, ReiserFSv4 is the slowest; however, here we see that V4 is about 12 seconds faster than V3.


JFS continues to lead this test with EXT2 and EXT3 not far behind.


The following represents the combined test times.

Benchmark Set 3 of 4


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


The following is the CPU utilization for this test.


Here is a line chart of representing all of the test times.

Benchmark Set 4 of 4


Here is a composite of the total test time for all tests.

File Benchmark II Data

Seconds Elapsed
Test Task EXT2 EXT3 JFS REISERv3 REISERv4 XFS
001 Touch 10,000 Files 48.25 48.25 34.59 33.59 34.08 37.47
002 Find 10,000 Files 0.03 0.03 0.03 0.03 0.07 0.04
003 Remove 10,000 Files 0.16 0.16 1.64 1.84 2.98 2.51
004 Make 10,000 Directories 49.76 49.87 34.32 33.74 34.68 37.17
005 Find 10,000 Directories 0.65 0.65 0.63 1.07 1.46 0.72
006 Remove 10,000 Directories 1.66 1.67 3.58 43.48 119.42 5.39
007 Copy Tarball from Other to Current Disk 5.17 5.15 5.74 5.12 7.34 4.26
008 Copy Tarball from Current to Other Disk 6.96 7.00 6.97 6.89 8.21 6.69
009 UnTAR Kernel 2.6.14.4 Tarball 14.92 15.19 27.64 26.92 21.45 40.81
010 TAR Kernel 2.6.14.4 Source Tree 14.05 14.08 13.05 33.49 25.82 36.19
011 Remove Kernel 2.6.14.4 Source Tree 2.47 2.64 6.17 5.65 10.15 9.10
012 Copy 2.6.14.4 Tarball 10 Times 39.48 38.29 39.13 45.15 62.16 46.34
013 Create a 1GB File 15.02 15.02 15.12 15.96 25.40 15.87
014 Copy a 1GB File 36.87 36.51 38.54 47.60 50.63 41.25
015 Split 10M File into 1000 Byte Pieces 57.26 57.77 2.99 4.35 2.95 4.87
016 Split 10M File into 1024 Byte Pieces 28.73 28.97 2.24 4.04 2.61 4.01
017 Split 10M File into 2048 Byte Pieces 7.02 6.98 1.39 2.26 1.55 1.95
018 Split 10M File into 4096 Byte Pieces 1.85 1.83 0.67 1.05 0.99 0.98
019 Split 10M File into 8192 Byte Pieces 0.58 0.58 0.36 0.56 0.62 0.57
020 Copy 2.6.14.4 Kernel Source Tree 10.02 10.06 35.76 31.64 20.17 43.42
021 CAT 1GB File to /dev/null 18.90 18.59 18.00 37.33 21.37 18.70
CPU Utilization
Test Task EXT2 EXT3 JFS REISERv3 REISERv4 XFS
001 Touch 10,000 Files 99.00 99.00 99.00 99.00 99.33 99.00
002 Find 10,000 Files 94.00 93.00 94.00 95.00 97.00 95.66
003 Remove 10,000 Files 98.00 98.66 73.66 99.00 99.00 91.66
004 Make 10,000 Directories 98.00 97.33 99.00 99.00 99.66 99.00
005 Find 10,000 Directories 99.00 99.00 99.00 99.00 99.00 99.00
006 Remove 10,000 Directories 99.00 99.00 88.66 99.00 99.00 97.00
007 Copy Tarball from Other to Current Disk 74.66 74.66 76.00 74.66 61.33 92.33
008 Copy Tarball from Current to Other Disk 60.00 59.33 59.33 62.00 86.00 62.66
009 UnTAR Kernel 2.6.14.4 Tarball 42.33 41.33 27.33 53.00 80.00 26.00
010 TAR Kernel 2.6.14.4 Source Tree 44.00 43.66 51.33 26.66 48.66 21.00
011 Remove Kernel 2.6.14.4 Source Tree 39.66 36.66 33.00 89.33 88.33 63.66
012 Copy 2.6.14.4 Tarball 10 Times 79.33 80.66 93.33 74.33 73.00 90.33
013 Create a 1GB File 56.00 55.66 67.33 57.00 50.00 64.33
014 Copy a 1GB File 42.00 42.00 47.00 37.33 52.00 49.33
015 Split 10M File into 1000 Byte Pieces 99.00 99.00 64.33 96.33 98.00 86.33
016 Split 10M File into 1024 Byte Pieces 99.00 99.00 77.33 97.66 99.00 97.00
017 Split 10M File into 2048 Byte Pieces 99.00 99.00 64.00 96.66 99.00 97.33
018 Split 10M File into 4096 Byte Pieces 99.00 99.00 69.33 99.00 99.00 97.33
019 Split 10M File into 8192 Byte Pieces 99.00 99.00 87.00 89.66 99.00 97.66
020 Copy 2.6.14.4 Kernel Source Tree 65.33 65.00 21.33 41.33 70.33 25.33
021 CAT 1GB File to /dev/null 26.33 27.00 27.33 36.66 46.33 30.00

File Benchmark I Data

Conclusion

With the second round of filesystem benchmarks, I hope everyone is now satisfied with the benchmarks using the 2.6 kernel. What I gleam from these benchmarks is both EXT2 and EXT3 are now roughly the same speeds in the majority of the tests. It also appears the XFS has improved in the majority of the tests. ReiserFSv3 has slowed in many of the tests with ReiserFSv4 being the slowest in most of the tests. It is important to note that JFS has improved in some of the tests. Personally, I still choose XFS for filesystem performance and scalability.

Seconds Elapsed
Test Filesystem EXT2 EXT3 JFS REISER XFS
001 Touch 10,000 Files 34.14 40.98 24.50 23.03 27.13
002 Find 10,000 Files 0.02 0.02 0.02 0.02 0.04
003 Remove 10,000 Files 0.14 0.36 1.37 1.76 2.52
004 Make 10,000 Directories 73.53 148.46 24.11 23.42 29.19
005 Find 10,000 Directories 0.44 0.66 0.41 0.87 0.59
006 Remove 10,000 Directories 1.97 56.31 4.05 5.37 6.70
007 Copy Tarball from Other to Current Disk 3.26 5.70 4.62 6.08 4.12
008 Copy Tarball from Current to Other Disk 3.36 3.45 3.49 3.53 3.45
009 UnTAR Kernel 2.4.26 Tarball 24.49 31.73 34.64 12.36 23.79
010 TAR Kernel 2.4.26 Source Tree 17.86 23.40 27.06 22.81 24.85
011 Remove Kernel 2.4.26 Source Tree 4.24 7.26 10.86 3.18 4.48
012 Copy 2.4.26 Tarball 10 Times 18.28 46.68 38.17 49.16 26.22
013 Create a 1GB File 18.93 22.35 28.87 25.80 20.49
014 Copy a 1GB File 45.04 62.48 54.46 71.06 55.89
015 Split 10M File into 1000 Byte Pieces 53.35 62.70 8.11 4.15 4.34
016 Split 10M File into 1024 Byte Pieces 26.24 32.61 7.63 3.90 3.96
017 Split 10M File into 2048 Byte Pieces 6.40 7.94 2.83 2.22 1.95
018 Split 10M File into 4096 Byte Pieces 1.65 2.10 0.50 0.65 0.97
019 Split 10M File into 8192 byte Pieces 0.51 0.69 0.31 0.47 0.53
020 Copy 2.4.26 Kernel Source Tree 24.43 30.65 25.68 22.19 26.53
021 CAT 1GB File to /dev/null 21.70 23.52 20.40 23.28 21.13
CPU Utilization
Test Filesystem EXT2 EXT3 JFS REISER XFS
001 Touch 10,000 Files 97.66 96.66 92.66 97.66 97.00
002 Find 10,000 Files 98.33 107.33 109.66 85.66 80.66
003 Remove 10,000 Files 95.66 98.33 76.66 97.66 91.33
004 Make 10,000 Directories 63.00 33.00 96.00 97.66 90.66
005 Find 10,000 Directories 96.66 97.00 99.33 95.33 98.66
006 Remove 10,000 Directories 99.00 6.33 87.66 98.00 89.33
007 Copy Tarball from Other to Current Disk 74.66 79.00 79.33 90.33 81.66
008 Copy Tarball from Current to Other Disk 67.00 64.66 64.00 70.66 75.66
009 UnTAR Kernel 2.4.26 Tarball 16.00 18.66 15.33 78.33 31.66
010 TAR Kernel 2.4.26 Source Tree 21.66 22.66 17.00 32.00 18.33
011 Remove Kernel 2.4.26 Source Tree 11.00 18.33 9.00 96.66 77.33
012 Copy 2.4.26 Tarball 10 Times 96.66 67.33 66.33 96.00 92.00
013 Create a 1GB File 35.66 57.66 32.33 84.33 39.00
014 Copy a 1GB File 30.33 41.33 40.66 53.33 40.00
015 Split 10M File into 1000 Byte Pieces 97.66 96.66 22.33 89.33 92.33
016 Split 10M File into 1024 Byte Pieces 97.66 97.33 20.33 89.00 95.66
017 Split 10M File into 2048 Byte Pieces 95.33 97.33 26.00 88.66 95.66
018 Split 10M File into 4096 Byte Pieces 98.33 98.00 80.00 97.33 92.33
019 Split 10M File into 8192 Byte Pieces 99.33 98.33 87.00 96.00 94.66
020 Copy 2.4.26 Kernel Source Tree 19.33 17.33 18.00 44.33 25.00
021 CAT 1GB File to /dev/null 26.00 26.00 30.00 30.00 33.66

 


Copyright © 2006, Justin Piszcz. Released under the Open Publication license unless otherwise noted in the body of the article. Linux Gazette is not produced, sponsored, or endorsed by its prior host, SSC, Inc.

Published in Issue 122 of Linux Gazette, January 2006

<-- prev | next -->
Tux