git: sys/vfs/hammer: Don't try to reblock everything on volume-del
Tomohiro Kusumi
tkusumi at crater.dragonflybsd.org
Sat Aug 22 10:53:23 PDT 2015
commit 7ef2d7b30fef99b5d4821a94f0ccc129e03af494
Author: Tomohiro Kusumi <kusumi.tomohiro at gmail.com>
Date: Fri Aug 21 21:13:40 2015 +0900
sys/vfs/hammer: Don't try to reblock everything on volume-del
Add volume# option to reblock ioctl and use that on hammer
volume-del instead of trying to reblock every data/node that
the reblocker has faced.
This is only used internally by hammer volume-del ioctl when
it finds the volume-to-remove is not empty and needs to get
reblocked. hammer reblock command does not provide an option
to specify volume# since it shouldn't be necessary for users
in general.
This makes huge difference as it cuts extra and unnecessary
i/o from reblocking, especially when the volume to remove
only has small amount data in it. The following examples show
much of the time spent on reblocking on volume-del comes from
unnecessary i/o. Example1 spent most of the time moving data
in /dev/da1 which wasn't necessary.
Example 1 - before this commit
# newfs_hammer -L TEST /dev/da1 /dev/da2 /dev/da3 >/dev/null
# mount_hammer /dev/da1:/dev/da2:/dev/da3 /HAMMER
# dd if=/dev/zero of=/HAMMER/out bs=1000000 count=120000 >/dev/null 2>&1
# sync; sync; sync; sync
# df -Th /HAMMER
Filesystem Type Size Used Avail Capacity Mounted on
TEST hammer 334G 112G 222G 34% /HAMMER
# hammer -f /dev/da1:/dev/da2:/dev/da3 blockmap | grep -A2 layer1
layer1 4000000000000000 @2000000000800000 blocks-free 0
4000000000000000 zone=4 app=8388608 free=0
4000000000800000 zone=4 app=8388608 free=0
--
layer1 4010000000000000 @2010000000000000 blocks-free 14145
4010000000000000 zone=4 app=8388608 free=0
4010000000800000 zone=10 app=8388608 free=0
--
layer1 4020000000000000 @2020000000000000 blocks-free 14268
4020000000000000 zone=4 app=8388608 free=0
4020000000800000 zone=0 app=0 free=8388608
/* /dev/da1 is 100% used
/dev/da2 is partially used
/dev/da3 is 0% used */
# hammer volume-blkdevs /HAMMER
/dev/da1:/dev/da2:/dev/da3
# time hammer volume-del /dev/da2 /HAMMER
real 14m29.119s
user 0m0.000s
sys 7m14.388s
# hammer volume-blkdevs /HAMMER
/dev/da1:/dev/da3
Example 2 - with this commit
# newfs_hammer -L TEST /dev/da1 /dev/da2 /dev/da3 >/dev/null
# mount_hammer /dev/da1:/dev/da2:/dev/da3 /HAMMER
# dd if=/dev/zero of=/HAMMER/out bs=1000000 count=120000 >/dev/null 2>&1
# sync; sync; sync; sync
# df -Th /HAMMER
Filesystem Type Size Used Avail Capacity Mounted on
TEST hammer 334G 112G 222G 34% /HAMMER
# hammer -f /dev/da1:/dev/da2:/dev/da3 blockmap | grep -A2 layer1
layer1 4000000000000000 @2000000000800000 blocks-free 0
4000000000000000 zone=4 app=8388608 free=0
4000000000800000 zone=4 app=8388608 free=0
--
layer1 4010000000000000 @2010000000000000 blocks-free 14145
4010000000000000 zone=4 app=8388608 free=0
4010000000800000 zone=10 app=8388608 free=0
--
layer1 4020000000000000 @2020000000000000 blocks-free 14268
4020000000000000 zone=4 app=8388608 free=0
4020000000800000 zone=0 app=0 free=8388608
/* /dev/da1 is 100% used
/dev/da2 is partially used
/dev/da3 is 0% used */
# hammer volume-blkdevs /HAMMER
/dev/da1:/dev/da2:/dev/da3
# time hammer volume-del /dev/da2 /HAMMER
real 0m8.139s
user 0m0.000s
sys 0m4.177s
# hammer volume-blkdevs /HAMMER
/dev/da1:/dev/da3
Summary of changes:
sbin/hammer/cmd_reblock.c | 1 +
sys/vfs/hammer/hammer_ioctl.h | 3 ++-
sys/vfs/hammer/hammer_reblock.c | 18 ++++++++++++++++++
sys/vfs/hammer/hammer_volume.c | 5 +++++
4 files changed, 26 insertions(+), 1 deletion(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/7ef2d7b30fef99b5d4821a94f0ccc129e03af494
--
DragonFly BSD source repository
More information about the Commits
mailing list