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