* Writing to /dev/null with fio
@ 2010-02-02 7:38 Bart Van Assche
2010-02-02 7:41 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: Bart Van Assche @ 2010-02-02 7:38 UTC (permalink / raw)
To: Jens Axboe; +Cc: fio
Hello Jens,
I noticed that writing with fio to /dev/null takes much more time (220
times more for the test below) than with dd. Did I specify the correct
arguments to fio ? If so, is this known behavior of fio ?
$ dd if=/dev/zero of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.121485 s, 8.8 GB/s
$ fio --bs=1M --size=1G --buffered=1 --rw=write --verify=0
--name=dev-null /dev/null
dev-null: (g=0): rw=write, bs=1M-1M/1M-1M, ioengine=sync, iodepth=1
Starting 1 process
Jobs: 1 (f=1): [W] [100.0% done] [0K/0K /s] [0/0 iops] [eta 00m:00s]
dev-null: (groupid=0, jobs=1): err= 0: pid=15859
write: io=1,024MB, bw=39,214KB/s, iops=38, runt= 26740msec
clat (usec): min=547, max=1,708K, avg=25927.47, stdev=124258.62
bw (KB/s) : min= 1167, max=732000, per=125.95%, avg=49387.11,
stdev=119413.97
cpu : usr=0.01%, sys=4.72%, ctx=780, majf=0, minf=138
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued r/w: total=0/1024, short=0/0
lat (usec): 750=47.95%, 1000=39.26%
lat (msec): 2=4.10%, 4=0.49%, 10=0.88%, 20=0.10%, 100=0.29%
lat (msec): 250=3.12%, 500=2.34%, 750=0.68%, 1000=0.49%, 2000=0.29%
Run status group 0 (all jobs):
WRITE: io=1,024MB, aggrb=39,213KB/s, minb=40,154KB/s,
maxb=40,154KB/s, mint=26740msec, maxt=26740msec
Bart.
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: Writing to /dev/null with fio 2010-02-02 7:38 Writing to /dev/null with fio Bart Van Assche @ 2010-02-02 7:41 ` Jens Axboe 2010-02-02 8:01 ` Bart Van Assche 0 siblings, 1 reply; 9+ messages in thread From: Jens Axboe @ 2010-02-02 7:41 UTC (permalink / raw) To: Bart Van Assche; +Cc: fio On Tue, Feb 02 2010, Bart Van Assche wrote: > Hello Jens, > > I noticed that writing with fio to /dev/null takes much more time (220 > times more for the test below) than with dd. Did I specify the correct > arguments to fio ? If so, is this known behavior of fio ? > > $ dd if=/dev/zero of=/dev/null bs=1M count=1024 > 1024+0 records in > 1024+0 records out > 1073741824 bytes (1.1 GB) copied, 0.121485 s, 8.8 GB/s > > $ fio --bs=1M --size=1G --buffered=1 --rw=write --verify=0 > --name=dev-null /dev/null You are writing to a file named dev-null and /dev/null is being ignored as an argument. You want a --filename=/dev/null at the end instead. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 7:41 ` Jens Axboe @ 2010-02-02 8:01 ` Bart Van Assche 2010-02-02 8:19 ` Jens Axboe 0 siblings, 1 reply; 9+ messages in thread From: Bart Van Assche @ 2010-02-02 8:01 UTC (permalink / raw) To: Jens Axboe; +Cc: fio On Tue, Feb 2, 2010 at 8:41 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > On Tue, Feb 02 2010, Bart Van Assche wrote: >> I noticed that writing with fio to /dev/null takes much more time (220 >> times more for the test below) than with dd. Did I specify the correct >> arguments to fio ? If so, is this known behavior of fio ? >> >> $ dd if=/dev/zero of=/dev/null bs=1M count=1024 >> 1024+0 records in >> 1024+0 records out >> 1073741824 bytes (1.1 GB) copied, 0.121485 s, 8.8 GB/s >> >> $ fio --bs=1M --size=1G --buffered=1 --rw=write --verify=0 >> --name=dev-null /dev/null > > You are writing to a file named dev-null and /dev/null is being ignored > as an argument. You want a --filename=/dev/null at the end instead. Sorry for this mistake. The reason I started running such silly tests is because I noticed that tests with dd and a small block size complete in a shorter time than tests with fio for a fast storage device (e.g. remote RAM disk accessed via SRP or iSER). Do the two tests below trigger similar system calls ? The ratio of fio time / dd time is about 1.50 for block size 512 and about 1.15 for block size 4096. $ dd if=/dev/zero of=/dev/null bs=512 count=$((2**34/512)) 33554432+0 records in 33554432+0 records out 17179869184 bytes (17 GB) copied, 22.1956 s, 774 MB/s $ fio --bs=512 --size=$((2**34)) --buffered=1 --rw=write --verify=0 --name=dev-null --filename=/dev/null dev-null: (g=0): rw=write, bs=512-512/512-512, ioengine=sync, iodepth=1 Starting 1 process Jobs: 1 (f=1): [W] [100.0% done] [0K/496M /s] [0/992K iops] [eta 00m:00s] dev-null: (groupid=0, jobs=1): err= 0: pid=15978 write: io=16,384MB, bw=483MB/s, iops=989K, runt= 33931msec clat (usec): min=0, max=182, avg= 0.38, stdev= 0.50 bw (KB/s) : min=408342, max=496691, per=100.00%, avg=494450.67, stdev=10697.23 cpu : usr=62.81%, sys=37.15%, ctx=491, majf=0, minf=20 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued r/w: total=0/33554432, short=0/0 lat (usec): 2=99.96%, 4=0.04%, 10=0.01%, 20=0.01%, 50=0.01% lat (usec): 100=0.01%, 250=0.01% Run status group 0 (all jobs): WRITE: io=16,384MB, aggrb=483MB/s, minb=494MB/s, maxb=494MB/s, mint=33931msec, maxt=33931msec $ dd if=/dev/zero of=/dev/null bs=4096 count=$((2**34/4096)) 4194304+0 records in 4194304+0 records out 17179869184 bytes (17 GB) copied, 3.72608 s, 4.6 GB/s $ fio --bs=4096 --size=$((2**34)) --buffered=1 --rw=write --verify=0 --name=dev-null --filename=/dev/null dev-null: (g=0): rw=write, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1 Starting 1 process Jobs: 1 (f=1): [W] [100.0% done] [0K/4,005M /s] [0/1M iops] [eta 00m:00s] dev-null: (groupid=0, jobs=1): err= 0: pid=16600 write: io=16,384MB, bw=3,809MB/s, iops=975K, runt= 4301msec clat (usec): min=0, max=644, avg= 0.39, stdev= 0.60 bw (KB/s) : min=3146072, max=4002800, per=99.81%, avg=3893298.00, stdev=301949.65 cpu : usr=61.86%, sys=38.09%, ctx=121, majf=0, minf=20 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued r/w: total=0/4194304, short=0/0 lat (usec): 2=99.96%, 4=0.04%, 10=0.01%, 20=0.01%, 50=0.01% lat (usec): 100=0.01%, 250=0.01%, 750=0.01% Run status group 0 (all jobs): WRITE: io=16,384MB, aggrb=3,809MB/s, minb=3,901MB/s, maxb=3,901MB/s, mint=4301msec, maxt=4301msec Bart. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:01 ` Bart Van Assche @ 2010-02-02 8:19 ` Jens Axboe 2010-02-02 8:24 ` Bart Van Assche 0 siblings, 1 reply; 9+ messages in thread From: Jens Axboe @ 2010-02-02 8:19 UTC (permalink / raw) To: Bart Van Assche; +Cc: fio On Tue, Feb 02 2010, Bart Van Assche wrote: > On Tue, Feb 2, 2010 at 8:41 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > > On Tue, Feb 02 2010, Bart Van Assche wrote: > >> I noticed that writing with fio to /dev/null takes much more time (220 > >> times more for the test below) than with dd. Did I specify the correct > >> arguments to fio ? If so, is this known behavior of fio ? > >> > >> $ dd if=/dev/zero of=/dev/null bs=1M count=1024 > >> 1024+0 records in > >> 1024+0 records out > >> 1073741824 bytes (1.1 GB) copied, 0.121485 s, 8.8 GB/s > >> > >> $ fio --bs=1M --size=1G --buffered=1 --rw=write --verify=0 > >> --name=dev-null /dev/null > > > > You are writing to a file named dev-null and /dev/null is being ignored > > as an argument. You want a --filename=/dev/null at the end instead. > > Sorry for this mistake. > > The reason I started running such silly tests is because I noticed > that tests with dd and a small block size complete in a shorter time > than tests with fio for a fast storage device (e.g. remote RAM disk > accessed via SRP or iSER). Do the two tests below trigger similar > system calls ? The ratio of fio time / dd time is about 1.50 for block > size 512 and about 1.15 for block size 4096. Fio definitely has more overhead than a simple read() to buf, write buf to /dev/null. If you switch off the stat calculations, it'll drop somewhat (use --gtod_reduce=1). But even then it's going to be slower than dd. Fio is modular and supports different IO engines etc, so the IO path is going to be a lot longer than with dd. The flexibility of fio does come at a cost. If you time(1) fio and dd, you'll most likely see a lot more usr time in fio. That said, it is probably time to do some profiling and make sure that fio is as fast as it can be. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:19 ` Jens Axboe @ 2010-02-02 8:24 ` Bart Van Assche 2010-02-02 8:31 ` Jens Axboe 0 siblings, 1 reply; 9+ messages in thread From: Bart Van Assche @ 2010-02-02 8:24 UTC (permalink / raw) To: Jens Axboe; +Cc: fio On Tue, Feb 2, 2010 at 9:19 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > On Tue, Feb 02 2010, Bart Van Assche wrote: >> The reason I started running such silly tests is because I noticed >> that tests with dd and a small block size complete in a shorter time >> than tests with fio for a fast storage device (e.g. remote RAM disk >> accessed via SRP or iSER). Do the two tests below trigger similar >> system calls ? The ratio of fio time / dd time is about 1.50 for block >> size 512 and about 1.15 for block size 4096. > > Fio definitely has more overhead than a simple read() to buf, write buf > to /dev/null. If you switch off the stat calculations, it'll drop > somewhat (use --gtod_reduce=1). But even then it's going to be slower > than dd. Fio is modular and supports different IO engines etc, so the IO > path is going to be a lot longer than with dd. The flexibility of fio > does come at a cost. If you time(1) fio and dd, you'll most likely see a > lot more usr time in fio. > > That said, it is probably time to do some profiling and make sure that > fio is as fast as it can be. That would definitely be appreciated. I would like to switch from dd to fio for storage system benchmarking, something I can't do yet because of the different results reported by the two tools. Bart. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:24 ` Bart Van Assche @ 2010-02-02 8:31 ` Jens Axboe 2010-02-02 8:53 ` Jens Axboe 0 siblings, 1 reply; 9+ messages in thread From: Jens Axboe @ 2010-02-02 8:31 UTC (permalink / raw) To: Bart Van Assche; +Cc: fio On Tue, Feb 02 2010, Bart Van Assche wrote: > On Tue, Feb 2, 2010 at 9:19 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > > On Tue, Feb 02 2010, Bart Van Assche wrote: > >> The reason I started running such silly tests is because I noticed > >> that tests with dd and a small block size complete in a shorter time > >> than tests with fio for a fast storage device (e.g. remote RAM disk > >> accessed via SRP or iSER). Do the two tests below trigger similar > >> system calls ? The ratio of fio time / dd time is about 1.50 for block > >> size 512 and about 1.15 for block size 4096. > > > > Fio definitely has more overhead than a simple read() to buf, write buf > > to /dev/null. If you switch off the stat calculations, it'll drop > > somewhat (use --gtod_reduce=1). But even then it's going to be slower > > than dd. Fio is modular and supports different IO engines etc, so the IO > > path is going to be a lot longer than with dd. The flexibility of fio > > does come at a cost. If you time(1) fio and dd, you'll most likely see a > > lot more usr time in fio. > > > > That said, it is probably time to do some profiling and make sure that > > fio is as fast as it can be. > > That would definitely be appreciated. I would like to switch from dd > to fio for storage system benchmarking, something I can't do yet > because of the different results reported by the two tools. So the first thing I noticed is that you get an lseek() because fio doesn't track the sequential nature of that job. How close do you get for bs=512 with using --gtod_reduce=1 and commenting out the lseek() in engines/sync.c:fio_syncio_prep()? Alternatively, using --ioengine=psync would remove that overhead as well. But realize that fio will never be as fast as dd completely for plain sync and sequential IO, it's just not possible. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:31 ` Jens Axboe @ 2010-02-02 8:53 ` Jens Axboe 2010-02-02 9:06 ` Bart Van Assche 2010-02-02 9:08 ` Jens Axboe 0 siblings, 2 replies; 9+ messages in thread From: Jens Axboe @ 2010-02-02 8:53 UTC (permalink / raw) To: Bart Van Assche; +Cc: fio On Tue, Feb 02 2010, Jens Axboe wrote: > On Tue, Feb 02 2010, Bart Van Assche wrote: > > On Tue, Feb 2, 2010 at 9:19 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > > > On Tue, Feb 02 2010, Bart Van Assche wrote: > > >> The reason I started running such silly tests is because I noticed > > >> that tests with dd and a small block size complete in a shorter time > > >> than tests with fio for a fast storage device (e.g. remote RAM disk > > >> accessed via SRP or iSER). Do the two tests below trigger similar > > >> system calls ? The ratio of fio time / dd time is about 1.50 for block > > >> size 512 and about 1.15 for block size 4096. > > > > > > Fio definitely has more overhead than a simple read() to buf, write buf > > > to /dev/null. If you switch off the stat calculations, it'll drop > > > somewhat (use --gtod_reduce=1). But even then it's going to be slower > > > than dd. Fio is modular and supports different IO engines etc, so the IO > > > path is going to be a lot longer than with dd. The flexibility of fio > > > does come at a cost. If you time(1) fio and dd, you'll most likely see a > > > lot more usr time in fio. > > > > > > That said, it is probably time to do some profiling and make sure that > > > fio is as fast as it can be. > > > > That would definitely be appreciated. I would like to switch from dd > > to fio for storage system benchmarking, something I can't do yet > > because of the different results reported by the two tools. > > So the first thing I noticed is that you get an lseek() because fio > doesn't track the sequential nature of that job. How close do you get > for bs=512 with using --gtod_reduce=1 and commenting out the lseek() in > engines/sync.c:fio_syncio_prep()? I committed a fix for this, it'll do it automatically now if you use latest -git. A quick test here on my desktop machine: fio --bs=4k --size=64G --buffered=1 --rw=write --verify=0 --name=/dev/null --gtod_reduce=1 --disk_util=0 10378MB/s fio --bs=512 --size=8G --buffered=1 --rw=write --verify=0 --name=/dev/null --gtod_reduce=1 --disk_util=0 1306MB/s dd if=/dev/zero of=/dev/null bs=4k count=16M 68719476736 bytes (69 GB) copied, 9,71235 s, 7,1 GB/s dd if=/dev/zero of=/dev/null bs=512 count=8M 4294967296 bytes (4,3 GB) copied, 3,3574 s, 1,3 GB/s So the same for 512b buffers, fio is much quicker for 64k (must be due to proper aligning). I'll boot the big box and see what that says. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:53 ` Jens Axboe @ 2010-02-02 9:06 ` Bart Van Assche 2010-02-02 9:08 ` Jens Axboe 1 sibling, 0 replies; 9+ messages in thread From: Bart Van Assche @ 2010-02-02 9:06 UTC (permalink / raw) To: Jens Axboe; +Cc: fio On Tue, Feb 2, 2010 at 9:53 AM, Jens Axboe <jens.axboe@oracle.com> wrote: > I committed a fix for this, it'll do it automatically now if you use > latest -git. A quick test here on my desktop machine: > > fio --bs=4k --size=64G --buffered=1 --rw=write --verify=0 > --name=/dev/null --gtod_reduce=1 --disk_util=0 > > 10378MB/s > > fio --bs=512 --size=8G --buffered=1 --rw=write --verify=0 > --name=/dev/null --gtod_reduce=1 --disk_util=0 > > 1306MB/s > > dd if=/dev/zero of=/dev/null bs=4k count=16M > 68719476736 bytes (69 GB) copied, 9,71235 s, 7,1 GB/s > > dd if=/dev/zero of=/dev/null bs=512 count=8M > 4294967296 bytes (4,3 GB) copied, 3,3574 s, 1,3 GB/s > > So the same for 512b buffers, fio is much quicker for 64k (must be due > to proper aligning). I'll boot the big box and see what that says. Thanks, this helps: the ratio of fio to dd runtime is now reduced to 1.25 for a block size of 512 bytes and 0.96 for a block size of 4096 bytes. $ count=$((2**25)); for bs in 512 4096; do size=$((count*bs)); dd if=/dev/zero of=/dev/null bs=$bs count=$count 2>&1|grep copied; fio --bs=$bs --size=$size --buffered=1 --rw=write --verify=0 --name=dev-null --filename=/dev/null 2>&1|grep runt; done 17179869184 bytes (17 GB) copied, 22.1017 s, 777 MB/s write: io=16,384MB, bw=621MB/s, iops=1,272K, runt= 26381msec 137438953472 bytes (137 GB) copied, 27.5793 s, 5.0 GB/s write: io=128GB, bw=4,964MB/s, iops=1,271K, runt= 26407msec Bart. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Writing to /dev/null with fio 2010-02-02 8:53 ` Jens Axboe 2010-02-02 9:06 ` Bart Van Assche @ 2010-02-02 9:08 ` Jens Axboe 1 sibling, 0 replies; 9+ messages in thread From: Jens Axboe @ 2010-02-02 9:08 UTC (permalink / raw) To: Bart Van Assche; +Cc: fio On Tue, Feb 02 2010, Jens Axboe wrote: > So the same for 512b buffers, fio is much quicker for 64k (must be due > to proper aligning). I'll boot the big box and see what that says. Same set of tests, only this time using a box with a lot more CPUs and memory bandwidth. 'fio+' is fio with the fix for eliminating lseek(), 'fio' is without that fix. App bs bandwidth ----------------------------------------- dd 512 1.7GB/sec fio 512 1.2GB/sec fio+ 512 1.5GB/sec dd 4k 6.6GB/sec fio 4k 10.3GB/sec fio+ 4k 12.4GB/sec So dd is still faster for small blocks sizes, as expected. I don't think there's any low hanging fruit left for fixing that. At 4k and higher the impact should be neglible, so I don't think it's a huge problem. Most real world testing is 4k or above. -- Jens Axboe ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-02-02 9:08 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-02-02 7:38 Writing to /dev/null with fio Bart Van Assche 2010-02-02 7:41 ` Jens Axboe 2010-02-02 8:01 ` Bart Van Assche 2010-02-02 8:19 ` Jens Axboe 2010-02-02 8:24 ` Bart Van Assche 2010-02-02 8:31 ` Jens Axboe 2010-02-02 8:53 ` Jens Axboe 2010-02-02 9:06 ` Bart Van Assche 2010-02-02 9:08 ` Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox