Date: Fri, 12 Feb 2010 16:39:30 -0800 From: Matt Reimer <mattjreimer@gmail.com> To: Ivan Voras <ivoras@freebsd.org> Cc: freebsd-fs@freebsd.org Subject: Re: ZFS file storage info Message-ID: <f383264b1002121639w25b2b2f8k91aeb1994b53ec73@mail.gmail.com> In-Reply-To: <hl4pgv$l6l$1@ger.gmane.org> References: <hl4pgv$l6l$1@ger.gmane.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Feb 12, 2010 at 3:50 PM, Ivan Voras <ivoras@freebsd.org> wrote:
> Hi,
>
> Because of ZFS' interesting way of storing files, I'm wondering if there is
> a way to get information such as how fragmented a file is? I'm thinking
> about something like an utility that for a given file gives "file X is
> stored in Y fragments"?
>
[root@gandalf ~]# ls -li /usr/bin/vi
6987 -r-xr-xr-x 6 root wheel 337136 Nov 21 14:31 /usr/bin/vi
[root@gandalf ~]# zdb -ddddd glamdring/usr 6987
Dataset glamdring/usr [ZPL], ID 31, cr_txg 97, 1.59G, 77833 objects, rootbp
[L0 DMU objset] 400L/200P DVA[0]=<0:10800c33e00:600>
DVA[1]=<0:21000487800:600> fletcher4 lzjb LE contiguous birth=3345
fill=77833 cksum=1189b0387a:6d5fe773294:15d9bc7539ad2:2fb4ba66521d1e
ZIL header: claim_txg 0, seq 0
first block: [L0 ZIL intent log] 20000L/20000P DVA[0]=<0:1b9730000:30000>
zilog uncompressed LE contiguous birth=3233 fill=0
cksum=7fb9ac2ef6d387ee:edbcafeec75face4:1f:1
Block seqno 1, won't claim, [L0 ZIL intent log] 20000L/20000P
DVA[0]=<0:1b9730000:30000> zilog uncompressed LE contiguous birth=3233
fill=0 cksum=7fb9ac2ef6d387ee:edbcafeec75face4:1f:1
Object lvl iblk dblk lsize asize type
6987 2 16K 128K 384K 388K ZFS plain file
264 bonus ZFS znode
path /bin/ex
uid 0
gid 0
atime Sat Feb 13 07:37:52 2010
mtime Sat Nov 21 14:31:07 2009
ctime Fri Feb 12 05:52:32 2010
crtime Fri Feb 12 05:52:32 2010
gen 145
mode 100555
size 337136
parent 4
links 6
xattr 0
rdev 0x0000000000000000
Indirect blocks:
0 L1 0:10bef000:c00 4000L/400P F=3 B=145
0 L0 0:10bf0000:30000 20000L/20000P F=1 B=145
20000 L0 0:10c30000:30000 20000L/20000P F=1 B=145
40000 L0 0:10c70000:30000 20000L/20000P F=1 B=145
segment [0000000000000000, 0000000000060000) size 384K
You're interested in the "Indirect blocks" portion. Google raidzmap.tar.gz,
download and build it, then do the following. Note that you'll drop the
third portion of the zfs offset tuple (e.g. the "c00" in 0:10bef000:c00) and
use the physical size (the hex number next to the "P" in "400P"). The devidx
numbers correspond to the devices comprising the pool, zero-based.
The offset numbers are the hex offset in blocks from the beginning of the
disk.
In the list of physical blocks the parity blocks come first, then the data
blocks. Firstdatacol is the offset into the list of physical blocks where
the data blocks begin. For example, in the first raidzmap command below,
firstdatacol is 2 which corresponds to "devidx = 0, offset = 2ca7e00, size =
200".
IIRC, YMMV, etc.
[root@gandalf ~]# ./raidzmap glamdring:0:10bef000:400
Columns = 4, bigcols = 4, asize = c00, firstdatacol = 2
devidx = 4, offset = 2ca7c00, size = 200
devidx = 5, offset = 2ca7c00, size = 200
devidx = 0, offset = 2ca7e00, size = 200
devidx = 1, offset = 2ca7e00, size = 200
[root@gandalf ~]# ./raidzmap glamdring:0:10bf0000:20000
Columns = 6, bigcols = 0, asize = 30000, firstdatacol = 2
devidx = 0, offset = 2ca8000, size = 8000
devidx = 1, offset = 2ca8000, size = 8000
devidx = 2, offset = 2ca8000, size = 8000
devidx = 3, offset = 2ca8000, size = 8000
devidx = 4, offset = 2ca8000, size = 8000
devidx = 5, offset = 2ca8000, size = 8000
[root@gandalf ~]# ./raidzmap glamdring:0:10c30000:20000
Columns = 6, bigcols = 0, asize = 30000, firstdatacol = 2
devidx = 2, offset = 2cb2a00, size = 8000
devidx = 3, offset = 2cb2a00, size = 8000
devidx = 4, offset = 2cb2a00, size = 8000
devidx = 5, offset = 2cb2a00, size = 8000
devidx = 0, offset = 2cb2c00, size = 8000
devidx = 1, offset = 2cb2c00, size = 8000
[root@gandalf ~]# ./raidzmap glamdring:0:10c70000:20000
Columns = 6, bigcols = 0, asize = 30000, firstdatacol = 2
devidx = 4, offset = 2cbd400, size = 8000
devidx = 5, offset = 2cbd400, size = 8000
devidx = 0, offset = 2cbd600, size = 8000
devidx = 1, offset = 2cbd600, size = 8000
devidx = 2, offset = 2cbd600, size = 8000
devidx = 3, offset = 2cbd600, size = 8000
Matt
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?f383264b1002121639w25b2b2f8k91aeb1994b53ec73>
