Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Apr 2013 18:52:19 +0200
From:      Adam Nowacki <nowakpl@platinum.linux.pl>
To:        freebsd-fs@freebsd.org
Subject:   ZFS slow reads for unallocated blocks
Message-ID:  <5166EA43.7050700@platinum.linux.pl>

next in thread | raw e-mail | index | archive | help
This one is quite weird - reads from files that were created and resized 
with ftruncate (so no actual data on disk) are considerably slower and 
use more CPU time than files with data. If compression is enabled this 
will also affect files with long runs of zeroes as ZFS won't write any 
data to disk in this case. There is no I/O on the pool during the read 
tests - all fits into 10GB ARC.

FreeBSD storage 9.1-RELEASE FreeBSD 9.1-RELEASE #0: Sat Feb 23 15:51:26 
UTC 2013     root@storage:/usr/obj/usr/src/sys/GENERIC  amd64

Mem: 264M Active, 82M Inact, 12G Wired, 100M Cache, 13M Buf, 3279M Free
Swap: 5120M Total, 5120M Free

# zfs create -o atime=off -o recordsize=128k -o compression=off -o 
mountpoint=/home/testfs home/testfs

--- truncated file:

# time truncate -s 1G /home/testfs/trunc1g
0.000u 0.000s 0:00.00 0.0%      0+0k 0+0io 0pf+0w

# time dd if=/home/testfs/trunc1g of=/dev/null bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 0.434817 secs (2469410435 bytes/sec)
0.000u 0.435s 0:00.43 100.0%    26+2813k 0+0io 0pf+0w

# time dd if=/home/testfs/trunc1g of=/dev/null bs=16k
65536+0 records in
65536+0 records out
1073741824 bytes transferred in 3.809560 secs (281854564 bytes/sec)
0.000u 3.779s 0:03.81 98.9%     25+2755k 0+0io 0pf+0w

# time cat /home/testfs/trunc1g > /dev/null
0.070u 14.031s 0:14.19 99.3%    15+2755k 0+0io 0pf+0w
        ^^^^^^^ 14 seconds compared to 1 second for random data

--- file filled with zeroes:

# time dd if=/dev/zero of=/home/testfs/zero1g bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 2.375426 secs (452020732 bytes/sec)
0.000u 0.525s 0:02.37 21.9%     23+2533k 1+1io 0pf+0w

# time dd if=/home/testfs/zero1g of=/dev/null bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 0.199078 secs (5393571244 bytes/sec)
0.000u 0.200s 0:00.20 100.0%    26+2808k 0+0io 0pf+0w

# time dd if=/home/testfs/zero1g of=/dev/null bs=16k
65536+0 records in
65536+0 records out
1073741824 bytes transferred in 0.436472 secs (2460046434 bytes/sec)
0.015u 0.421s 0:00.43 100.0%    26+2813k 0+0io 0pf+0w

# time cat /home/testfs/zero1g > /dev/null
0.023u 1.156s 0:01.18 99.1%     15+2779k 0+0io 0pf+0w

--- file filled with random bytes:

# time dd if=/dev/random of=/home/testfs/random1g bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 16.116569 secs (66623474 bytes/sec)
0.000u 13.214s 0:16.11 81.9%    25+2750k 0+1io 0pf+0w

# time dd if=/home/testfs/random1g of=/dev/null bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 0.207115 secs (5184280044 bytes/sec)
0.000u 0.208s 0:00.20 100.0%    26+2808k 0+0io 0pf+0w

# time dd if=/home/testfs/random1g of=/dev/null bs=16k
65536+0 records in
65536+0 records out
1073741824 bytes transferred in 0.432518 secs (2482536705 bytes/sec)
0.023u 0.409s 0:00.43 97.6%     26+2828k 0+0io 0pf+0w

# time cat /home/testfs/random1g > /dev/null
0.031u 1.053s 0:01.08 100.0%    15+2770k 0+0io 0pf+0w

--- compression on:

# zfs create -o atime=off -o recordsize=128k -o compression=lzjb -o 
mountpoint=/home/testfs home/testfs

--- file filled with zeroes:

# time dd if=/dev/zero of=/home/testfs/zero1g bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 1.007765 secs (1065468404 bytes/sec)
0.000u 0.458s 0:01.01 44.5%     26+2880k 1+1io 0pf+0w

# time dd if=/home/testfs/zero1g of=/dev/null bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 0.630737 secs (1702360431 bytes/sec)
0.000u 0.630s 0:00.63 100.0%    25+2742k 0+0io 0pf+0w

# time dd if=/home/testfs/zero1g of=/dev/null bs=16k
65536+0 records in
65536+0 records out
1073741824 bytes transferred in 4.089175 secs (262581530 bytes/sec)
0.015u 4.036s 0:04.09 98.7%     25+2758k 0+0io 0pf+0w

# time cat /home/testfs/zero1g > /dev/null
0.031u 15.863s 0:15.95 99.6%    15+2754k 0+0io 0pf+0w
        ^^^^^^^

--- it appears recordsize has a huge effect on this (recordsize=32k):

# zfs create -o atime=off -o recordsize=32k -o compression=off -o 
mountpoint=/home/testfs home/testfs

# time truncate -s 1G testfs/trunc1g
0.000u 0.000s 0:00.01 0.0%      0+0k 1+0io 0pf+0w

# time cat /home/testfs/trunc1g > /dev/null
0.047u 5.842s 0:05.93 99.1%     15+2761k 0+0io 0pf+0w
        ^^^^^^

--- recordsize=4k:

# zfs create -o atime=off -o recordsize=4k -o compression=off -o 
mountpoint=/home/testfs home/testfs

# time truncate -s 1G testfs/trunc1g
0.000u 0.000s 0:00.00 0.0%      0+0k 0+0io 0pf+0w

# time cat /home/testfs/trunc1g > /dev/null
0.047u 1.441s 0:01.52 97.3%     15+2768k 0+0io 0pf+0w
        ^^^^^^



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5166EA43.7050700>