File system blocks alignment

Pieter de Goeje pieter at degoeje.nl
Fri Jan 1 20:54:06 UTC 2010


On Friday 01 January 2010 12:26:10 Poul-Henning Kamp wrote:
> In message <200912311712.18347.pieter at degoeje.nl>, Pieter de Goeje writes:
> >Ok, as Miroslav wrote, it does not report 4k sectors:
>
> If you care to, and have the time, try the following:
>
>
> for N in (0...7)
> 	for M in (0..2)
> 		create partition starting at byte offset N*512
> 		newfs -f 4096 -b 32768 /dev/foo
> 		mount /dev/foo /mnt
> 		time restore(8) a filesystem into it.
> 		unmount /mnt
> 		time fsck_ffs /dev/foo
> 		mount /dev/foo /mnt
> 		time tar cf /dev/null  /mnt
> 		unmount /mnt

That yielded some pretty spectacular results. When the partition is not 
correctly aligned, performance is not so good ;-).

About the benchmark:
- Test was conducted in single user mode, while running gstat and systat to 
monitor the system.
- OS and dump archive were located on a different harddisk.
- Partition size was 10GB, dump archive ~550MB (dump of /). The archive easily 
fitted in main memory (8GB).
- I observed L(q) sizes over 600 and ms/w times over 30sec during unaligned 
restore.
- CPU load was very low during entire test.

Performance for restore was abysmal in the unaligned case, easily being 10 
times slower than aligned restore. Newfs was about 5 times as slow.

I also tested various combinations of soft-updates, mounting async and 
block/fragment size. Some helped mildly as one might expect, but nothing 
significant was gained. 
It was somewhat surprising to see restore being faster than tar in the aligned 
case though. Mounting async or using soft updates resulted in a 6sec restore, 
while tar took about 8sec.

Raw results (and benchmark script) below. Offset is the number of (512byte) 
sectors. The partition is aligned at offset 40. The test begins at offset 34 
because that is the first free sector for GPT partitions.

--------------- results ---------------
==> offset: 34 iter: 1
newfs
        0.98 real         0.00 user         0.00 sys
restore
      117.76 real         0.12 user         0.98 sys
fsck_ffs
        1.83 real         0.02 user         0.00 sys
tar
        9.83 real         0.06 user         0.34 sys
==> offset: 34 iter: 2
newfs
        0.98 real         0.00 user         0.00 sys
restore
      149.68 real         0.15 user         1.02 sys
fsck_ffs
        1.75 real         0.02 user         0.00 sys
tar
        9.56 real         0.02 user         0.37 sys
==> offset: 35 iter: 1
newfs
        0.95 real         0.00 user         0.00 sys
restore
      135.31 real         0.11 user         1.07 sys
fsck_ffs
        1.82 real         0.02 user         0.00 sys
tar
        9.74 real         0.04 user         0.35 sys
==> offset: 35 iter: 2
newfs
        1.21 real         0.00 user         0.00 sys
restore
      154.59 real         0.13 user         1.05 sys
fsck_ffs
        1.91 real         0.02 user         0.00 sys
tar
        9.58 real         0.04 user         0.35 sys
==> offset: 36 iter: 1
newfs
        0.98 real         0.00 user         0.00 sys
restore
      151.36 real         0.11 user         1.08 sys
fsck_ffs
        1.77 real         0.02 user         0.00 sys
tar
        9.86 real         0.07 user         0.32 sys
==> offset: 36 iter: 2
newfs
        0.95 real         0.00 user         0.00 sys
restore
      153.71 real         0.14 user         1.05 sys
fsck_ffs
        1.90 real         0.02 user         0.00 sys
tar
       10.02 real         0.03 user         0.37 sys
==> offset: 37 iter: 1
newfs
        0.98 real         0.00 user         0.00 sys
restore
      128.90 real         0.08 user         1.10 sys
fsck_ffs
        1.76 real         0.03 user         0.00 sys
tar
        9.76 real         0.08 user         0.31 sys
==> offset: 37 iter: 2
newfs
        0.98 real         0.00 user         0.00 sys
restore
      147.45 real         0.13 user         1.05 sys
fsck_ffs
        1.83 real         0.02 user         0.00 sys
tar
        9.75 real         0.06 user         0.33 sys
==> offset: 38 iter: 1
newfs
        0.95 real         0.00 user         0.00 sys
restore
      150.35 real         0.15 user         1.04 sys
fsck_ffs
        2.04 real         0.02 user         0.01 sys
tar
        9.42 real         0.04 user         0.35 sys
==> offset: 38 iter: 2
newfs
        0.94 real         0.00 user         0.00 sys
restore
      125.40 real         0.16 user         1.02 sys
fsck_ffs
        1.69 real         0.02 user         0.00 sys
tar
        9.74 real         0.09 user         0.30 sys
==> offset: 39 iter: 1
newfs
        0.95 real         0.01 user         0.00 sys
restore
      135.23 real         0.11 user         1.09 sys
fsck_ffs
        1.93 real         0.02 user         0.01 sys
tar
        9.82 real         0.05 user         0.35 sys
==> offset: 39 iter: 2
newfs
        0.93 real         0.01 user         0.00 sys
restore
      150.30 real         0.07 user         1.12 sys
fsck_ffs
        1.86 real         0.02 user         0.01 sys
tar
        9.61 real         0.08 user         0.32 sys
==> offset: 40 iter: 1
newfs
        0.22 real         0.00 user         0.00 sys
restore
       11.05 real         0.10 user         1.08 sys
fsck_ffs
        1.97 real         0.02 user         0.00 sys
tar
        7.86 real         0.05 user         0.34 sys
==> offset: 40 iter: 2
newfs
        0.17 real         0.00 user         0.00 sys
restore
        8.83 real         0.09 user         1.09 sys
fsck_ffs
        1.67 real         0.01 user         0.01 sys
tar
        7.86 real         0.08 user         0.31 sys
==> offset: 41 iter: 1
newfs
        0.95 real         0.01 user         0.00 sys
restore
      133.37 real         0.16 user         1.04 sys
fsck_ffs
        1.71 real         0.02 user         0.00 sys
tar
        9.43 real         0.07 user         0.31 sys
==> offset: 41 iter: 2
newfs
        1.09 real         0.00 user         0.01 sys
restore
      150.71 real         0.09 user         1.10 sys
fsck_ffs
        2.01 real         0.01 user         0.01 sys
tar
        9.25 real         0.06 user         0.33 sys


------------------- bench.sh ----------------
disk=/dev/ada0
fsarchive=/usr/home/pyotr/rootdump
results=/usr/home/pyotr/bench-results

bench() {
	offset=$((34 + $1))
	echo "==> offset: $offset iter: $2" >> $results
	dd if=/dev/zero of=$disk bs=1m count=1 2> /dev/null
	gpart create -s gpt $disk
	gpart add -b $offset -s 10G -t freebsd-ufs $disk
	partition=${disk}p1
	echo "newfs" >> $results
	time -ao $results newfs -f 4096 -b 32768 $partition || exit 1
	mount $partition /mnt
	cd /mnt
	echo "restore" >> $results
	time -ao $results restore -rf $fsarchive || exit 1
	cd /
	umount /mnt
	echo "fsck_ffs" >> $results
	time -ao $results fsck_ffs $partition || exit 1
	mount $partition /mnt
	echo "tar" >> $results
	time -ao $results tar -cf /dev/null /mnt || exit 1
	umount /mnt
}

true > $results
umount /mnt

for N in `jot 8 0`; do
	for M in `jot 2`; do
		bench $N $M
	done
done

--
Pieter de Goeje


More information about the freebsd-current mailing list