Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Dec 2009 12:58:07 +0200
From:      Alexander Motin <mav@FreeBSD.org>
To:        freebsd-arch@freebsd.org,  FreeBSD-Current <freebsd-current@freebsd.org>
Subject:   File system blocks alignment
Message-ID:  <4B349ABF.2070800@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
Hi.

Recently WD released first series of ATA disks with increased physical
sector size. It makes writes not matching with 4K blocks inefficient
there. So I propose to get back to the question of optimal FS block
alignment. This topic is also important for most of RAIDs having striped
nature, such as RAID0/3/5/... and flash drives with simple controller
(such as MMC/SD cards).

As I have no one of those WD disks yet, I have made series of tests with
RAID0, made by geom_stripe, to check general idea. I've tested the most
describing case: 2-disk RAID0 with 16K stripe, 16K FS block and many 16K
random I/Os (reads in this test, to avoid FS locking). Same load pattern
 but with writes I had on my busy disk-bound MySQL servers, so it is
quite real.

Test one, default partitioning.

%gstripe label -s 16384 data /dev/ada1 /dev/ada2
%fdisk -I /dev/stripe/data
%disklabel -w /dev/stripe/datas1
%disklabel /dev/stripe/datas1

# /dev/stripe/datas1:

8 partitions:

#        size   offset    fstype   [fsize bsize bps/cpg]

  a: 1250274611       16    unused        0     0

  c: 1250274627        0    unused        0     0         # "raw" part,
don't edit
%diskinfo -v /dev/stripe/datas1a

/dev/stripe/datas1a

        512             # sectorsize

        640140600832    # mediasize in bytes (596G)

        1250274611      # mediasize in sectors

        16384           # stripesize

        7680            # stripeoffset

        77825           # Cylinders according to firmware.

        255             # Heads according to firmware.

        63              # Sectors according to firmware.

As you can see, fdisk aligned partition to the "track length" of 63
sectors and disklabel added offset of 16 sectors. As result, file system
will start at quite odd place of the RAID stripe.
I've created UFS file system, pre-wrote 4GB file and run tests (raidtest
was patched to generate only 16K requests):
%raidtest test -d /mnt/qqq -n 1
Requests per second: 112
%raidtest test -d /mnt/qqq -n 64
Requests per second: 314
Before each test FS was unmounted to flush caches.

Test two, FS manually aligned with disklabel.
%disklabel /dev/stripe/datas1
# /dev/stripe/datas1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a: 1250274578       33    unused        0     0
  c: 1250274627        0    unused        0     0         # "raw" part,
don't edit
%diskinfo -v /dev/stripe/datas1a
/dev/stripe/datas1a
        512             # sectorsize
        640140583936    # mediasize in bytes (596G)
        1250274578      # mediasize in sectors
        16384           # stripesize
        0               # stripeoffset
        77825           # Cylinders according to firmware.
        255             # Heads according to firmware.
        63              # Sectors according to firmware.
File system aligned with stripe.
%raidtest test -d /mnt/qqq -n 1

Requests per second: 133

%raidtest test -d /mnt/qqq -n 64

Requests per second: 594


The difference is quite significant. Unaligned RAID0 access causes two
disks involved in it's handling, while aligned one leaves one of disks
free for another request, doubling performance.

As we have now mechanism for reporting stripe size and offset for any
partition to user-level, it should be easy to make disk partitioning and
file system creation tools to use it automatically.

Stripe size/offset reporting now supported by ada and mmcsd disk drivers
and most of GEOM modules. It would be nice to fetch that info from
hardware RAIDs also, where possible.

-- 
Alexander Motin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4B349ABF.2070800>