ZFS and mdconfig -t vnode - Unexpected behavior
Dan Rue
drue at therub.org
Thu Mar 8 16:43:17 UTC 2012
I have discovered an unexpected behavior when using ZFS against a vnode.
When running mdconfig -d against a vnode, there is a long delay before
the blocks are fully written to the backing store file. Consider the
following test script:
#!/bin/sh
rm foo
dd if=/dev/zero of=foo bs=4096 count=0 seek=1955584
du -k foo
md=`mdconfig -a -t vnode -f foo`
dd if=/dev/random of=/dev/${md} bs=4096 count=100
mdconfig -d -u $md
while [ 1 ]; do
fsync foo
du -k foo
blocks=`du -k foo | awk '{print $1; }'`
if [ $blocks -gt 100 ]; then
exit
fi
sleep 1
done
A good run looks like this (UFS):
# time sh t.sh
0+0 records in
0+0 records out
0 bytes transferred in 0.000017 secs (0 bytes/sec)
48 foo
100+0 records in
100+0 records out
409600 bytes transferred in 0.179925 secs (2276505 bytes/sec)
464 foo
real 0m0.203s
user 0m0.001s
sys 0m0.018s
A bad run looks like this (ZFS):
# time sh t.sh
0+0 records in
0+0 records out
0 bytes transferred in 0.000015 secs (0 bytes/sec)
1 foo
100+0 records in
100+0 records out
409600 bytes transferred in 0.089111 secs (4596522 bytes/sec)
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
1 foo
515 foo
real 0m27.370s
user 0m0.009s
Under ZFS, it can take as long as 30 seconds before the block size as
reported by du -k has been updated. The fsync appears to be a noop.
Under UFS, du -k shows the correct block size every time, immediately
after mdconfig -d. This is the expected behavior.
This has been tested against ZFS on FreeBSD 8.1, 8.2, and 9 stable, in
several different environments.
Are there any ZFS tunables that could be related to this? What could be
the cause of this behavior?
Thanks,
drue
More information about the freebsd-fs
mailing list