On Jul 9, 2009, at 4:22 AM, Jim Klimov <no-re...@opensolaris.org> wrote:
To tell the truth, I expected zvols to be faster than filesystem
datasets. They seem
to have less overhead without inodes, posix, acls and so on. So I'm
puzzled by test
results.
I'm now considering the dd i/o block size, and it means a lot
indeed, especially if
compared to zvol results with small blocks like 64k.
I ran a number of tests with a zvol recreated by commands before
each run (this
may however cause varying fragmentation impacting results of
different runs):
# zfs destroy -r pond/test; zfs create -V 30G pond/test; zfs set
compression=off pond/test; sync; dd if=/dev/zero of=/dev/zvol/rdsk/
pond/test count=1000 bs=512; sync
and tests going like
# time dd if=/dev/zero of=/dev/zvol/rdsk/pond/test count=1024 bs=1048576
1024+0 records in
1024+0 records out
real 0m42.442s
user 0m0.006s
sys 0m4.292s
The test progresses were quite jumpy (with "zpool iostat pond 1"
values varying
from 30 to 70 MBps, reads coming in sometimes).
So I'd stick to overall result - the rounded wallclock time it takes
to write 1024
records of varying size and resulting average end-user MBps. I also
write "sys"
time since that's what is consumed by the kernel and the disk
subsystem, after all.
I don't write zpool iostat speeds, since they vary too much and I
don't bother
with a spreadsheen right now. But the reported values stay about
halfway between
"wallclock MBps" ans "sys MBps" calculations, on the perceived
average, peaking
at about 350MBps for large block sizes (>4MB).
1 MB (bs=1048576): 42s (4s), 24MBps
4 MB (bs=4194304): 42s (15s), 96MBps
16MB (bs=16777216): 129s-148s (62-64s), 127-110MBps
32MB (bs=33554432, 40Gb zvol): 303s (127s), 108MBps
Similar results for writing a file to a filesystem; "zpool iostat"
values again
jumped anywhere between single MBps to GBps. Simple cleanups used
like:
# rm /pool/test30g; sync; time dd if=/dev/zero of=/pool/test30g
count=1024 bs=33554432
Values remain somewhat consistent (in the same league, at least):
1 MB (bs=1048576, 10240 blocks): 20-21s (7-8s), 512-487MBps
1 MB (bs=1048576): 2.3s (0.6s), 445MBps
4 MB (bs=4194304): 8s (3s), 512MBps
16MB (bs=16777216): 37s (15s), 442MBps
32MB (bs=33554432): 74-103s (32-42s), 442-318MBps
64Kb (bs=65536, 545664 blocks): 94s (47s), 362MBps
All in all, to make more precise results these tests should be made
in greater
numbers and averaged. But here we got some figures to think about...
On a side note, now I'll pay more attention to tuning suggestions
which involve
multi-megabyte buffers for network sockets, etc. They can actually
cause an
impact to performance many times over!
On another note,
For some reason I occasionally got results like this:
write: File too large
1+0 records in
1+0 records out
I think the zvol was not considered created by that time. In about
10-15 sec I was
able to commence the test run. Perhaps it helped that I
"initialized" the zvol by a
small write after creation, then:
# dd if=/dev/zero of=/dev/zvol/rdsk/pond/test count=1000 bs=512
Strange...
When running throughput tests the block sizes to be concerned about
are: 4k, 8k, 16k and 64k. These are the sizes that most file systems
an databases use.
If you get 4k to perform well chances are the others will fall into
line.
-Ross
_______________________________________________
zfs-discuss mailing list
zfs-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/zfs-discuss