Hardware
This is an
"Intel(R) Pentium(R) 4 CPU 3.40GHz" with HT enabled, 1GB of RAM, a SATA
controller with a "Maxtor 7Y250M0" attached. The system was running the
Linux Kernel version 2.6.20 with GLIBC version 2.3.6.
Software
Tests
performed using the March 23, 2007 FIO snapshot,
together with GUASI version 0.23:
FIO: http://brick.kernel.dk/snaps/
GUASI: http://www.xmailserver.org/guasi-lib.html
Notes
To get consistent results, it is better to not use the --runtime FIO option, and use the --size instead to limit the test
processing time. This because, for random RW tests, reads and writes
may statistically distribute differently over the test time, and
chopping it with --runtime
may give wrong results. All tests has been run using the Anticipatory
I/O Scheduler (AS), but the relative performance did not change when
using CFQ, Deadline or Noop.
Results
[iodepth = 100]
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=guasi --name=job1 --iodepth=100 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=guasi, iodepth=100
Starting 1 thread
Jobs: 1: [m] [99.5% done] [ 4165/ 0 kb/s] [eta 00m:01s]
job1: (groupid=0, jobs=1): err= 0: pid=26943
read : io=128MiB, bw=653KiB/s, iops=159, runt=204919msec
slat (msec): min= 0, max= 3, avg= 0.00, stdev= 0.07
clat (msec): min= 0, max=37299, avg=378.25, stdev=799.38
bw (KiB/s) : min= 10, max= 4857, per=126.97%, avg=829.08, stdev=633.74
write: io=129MiB, bw=818KiB/s, iops=199, runt=164940msec
slat (msec): min= 0, max= 3, avg= 0.00, stdev= 0.08
clat (msec): min= 0, max= 645, avg=245.75, stdev=96.78
bw (KiB/s) : min= 0, max= 2318, per=136.71%, avg=1118.29, stdev=831.44
cpu : usr=0.26%, sys=2.70%, ctx=391041
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=99.9%
lat (msec): 2=0.8%, 4=0.7%, 10=1.5%, 20=2.3%, 50=5.5%, 100=3.5%
lat (msec): 250=48.6%, 500=19.3%, 750=11.4%, 1000=4.6%, >=2000=1.8%
Run status group 0 (all jobs):
READ: io=128MiB, aggrb=653KiB/s, minb=653KiB/s, maxb=653KiB/s, mint=204919msec, maxt=204919msec
WRITE: io=129MiB, aggrb=818KiB/s, minb=818KiB/s, maxb=818KiB/s, mint=164940msec, maxt=164940msec
Disk stats (read/write):
sda: ios=30520/33054, merge=2155/63, ticks=10343188/157484, in_queue=10500680, util=99.70%
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=libaio --name=job1 --iodepth=100 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=100
Starting 1 thread
Jobs: 1: [m] [99.0% done] [ 3506/ 0 kb/s] [eta 00m:02s]
job1: (groupid=0, jobs=1): err= 0: pid=26933
read : io=128MiB, bw=645KiB/s, iops=157, runt=207316msec
slat (msec): min= 0, max= 608, avg= 0.15, stdev= 7.37
clat (msec): min= 0, max= 1945, avg=374.27, stdev=330.52
bw (KiB/s) : min= 17, max= 5116, per=114.01%, avg=735.38, stdev=653.86
write: io=129MiB, bw=761KiB/s, iops=185, runt=177050msec
slat (msec): min= 0, max= 588, avg= 0.19, stdev= 9.08
clat (msec): min= 0, max= 1347, avg=256.53, stdev=219.55
bw (KiB/s) : min= 0, max= 2965, per=112.11%, avg=853.16, stdev=732.91
cpu : usr=0.11%, sys=1.04%, ctx=77592
IO depths : 1=0.0%, 2=0.1%, 4=0.1%, 8=0.3%, 16=0.6%, 32=1.2%, >=64=97.7%
lat (msec): 2=0.4%, 4=0.3%, 10=2.6%, 20=3.8%, 50=10.8%, 100=11.4%
lat (msec): 250=22.6%, 500=24.8%, 750=13.3%, 1000=7.1%, >=2000=2.9%
Run status group 0 (all jobs):
READ: io=128MiB, aggrb=645KiB/s, minb=645KiB/s, maxb=645KiB/s, mint=207316msec, maxt=207316msec
WRITE: io=129MiB, aggrb=761KiB/s, minb=761KiB/s, maxb=761KiB/s, mint=177050msec, maxt=177050msec
Disk stats (read/write):
sda: ios=30646/31983, merge=2032/1075, ticks=11528816/8175408, in_queue=19704272, util=99.99%
[iodepth = 1000]
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=guasi --name=job1 --iodepth=1000 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=guasi, iodepth=1000
Starting 1 thread
Jobs: 1: [m] [100.0% done] [ 3275/ 0 kb/s] [eta 00m:00s]
job1: (groupid=0, jobs=1): err= 0: pid=25822
read : io=128MiB, bw=608KiB/s, iops=148, runt=220633msec
slat (msec): min= 0, max= 41, avg= 0.47, stdev= 3.91
clat (msec): min= 1, max= 7306, avg=3336.43, stdev=1318.26
bw (KiB/s) : min= 2, max= 3760, per=110.22%, avg=670.13, stdev=499.45
write: io=132MiB, bw=647KiB/s, iops=158, runt=213594msec
slat (msec): min= 0, max= 41, avg= 0.49, stdev= 3.98
clat (msec): min= 0, max= 6999, avg=3294.01, stdev=1007.12
bw (KiB/s) : min= 0, max= 2998, per=132.56%, avg=857.67, stdev=794.11
cpu : usr=0.24%, sys=2.45%, ctx=434627
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=99.9%
lat (msec): 2=0.1%, 4=0.0%, 10=0.1%, 20=0.2%, 50=0.2%, 100=0.1%
lat (msec): 250=0.3%, 500=0.5%, 750=0.5%, 1000=0.6%, >=2000=11.2%
Run status group 0 (all jobs):
READ: io=128MiB, aggrb=608KiB/s, minb=608KiB/s, maxb=608KiB/s, mint=220633msec, maxt=220633msec
WRITE: io=132MiB, aggrb=647KiB/s, minb=647KiB/s, maxb=647KiB/s, mint=213594msec, maxt=213594msec
Disk stats (read/write):
sda: ios=30413/33901, merge=2338/106, ticks=12581280/186340, in_queue=12768264, util=99.66%
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=libaio --name=job1 --iodepth=1000 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=1000
Starting 1 thread
Jobs: 1: [m] [97.7% done] [ 577/ 516 kb/s] [eta 00m:05s]
job1: (groupid=0, jobs=1): err= 0: pid=26828
read : io=128MiB, bw=626KiB/s, iops=153, runt=213413msec
slat (msec): min= 0, max= 4876, avg=3274.26, stdev=1619.11
clat (msec): min= 0, max= 6058, avg=613.37, stdev=1333.82
bw (KiB/s) : min= 0, max= 8126, per=214.47%, avg=1342.61, stdev=1809.33
write: io=132MiB, bw=652KiB/s, iops=159, runt=212685msec
slat (msec): min= 0, max= 2724, avg=1550.13, stdev=590.41
clat (msec): min= 0, max= 4694, avg=469.30, stdev=1153.29
bw (KiB/s) : min= 0, max= 7128, per=154.74%, avg=1008.93, stdev=1317.10
cpu : usr=0.06%, sys=0.72%, ctx=24804
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=99.9%
lat (msec): 2=75.0%, 4=0.1%, 10=0.2%, 20=0.2%, 50=0.1%, 100=0.1%
lat (msec): 250=2.4%, 500=2.2%, 750=1.4%, 1000=1.4%, >=2000=5.7%
Run status group 0 (all jobs):
READ: io=128MiB, aggrb=626KiB/s, minb=626KiB/s, maxb=626KiB/s, mint=213413msec, maxt=213413msec
WRITE: io=132MiB, aggrb=652KiB/s, minb=652KiB/s, maxb=652KiB/s, mint=212685msec, maxt=212685msec
Disk stats (read/write):
sda: ios=30215/32234, merge=2448/1707, ticks=19955036/12018636, in_queue=33917852, util=99.94%
[iodepth = 10000]
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=guasi --name=job1 --iodepth=10000 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=guasi, iodepth=10000
Starting 1 thread
Jobs: 1: [m] [100.0% done] [ 0/ 0 kb/s] [eta 00m:00s]
job1: (groupid=0, jobs=1): err= 0: pid=21767
read : io=145MiB, bw=641KiB/s, iops=156, runt=236473msec
slat (msec): min= 0, max= 230, avg=18.17, stdev=50.51
clat (msec): min= 1, max=53244, avg=30356.92, stdev=12078.88
bw (KiB/s) : min= 2, max= 2514, per=91.11%, avg=584.01, stdev=369.46
write: io=150MiB, bw=677KiB/s, iops=165, runt=232681msec
slat (msec): min= 0, max= 230, avg=18.53, stdev=50.94
clat (msec): min= 1, max=53220, avg=32159.18, stdev=10863.48
bw (KiB/s) : min= 0, max= 3088, per=98.79%, avg=668.82, stdev=669.49
cpu : usr=0.20%, sys=2.13%, ctx=321641
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=99.9%
lat (msec): 2=0.0%, 4=0.0%, 10=0.0%, 20=0.0%, 50=0.0%, 100=0.0%
lat (msec): 250=0.0%, 500=0.0%, 750=0.0%, 1000=0.0%, >=2000=0.3%
Run status group 0 (all jobs):
READ: io=145MiB, aggrb=641KiB/s, minb=641KiB/s, maxb=641KiB/s, mint=236473msec, maxt=236473msec
WRITE: io=150MiB, aggrb=677KiB/s, minb=677KiB/s, maxb=677KiB/s, mint=232681msec, maxt=232681msec
Disk stats (read/write):
sda: ios=30132/38602, merge=7003/72, ticks=9963460/237800, in_queue=10201296, util=99.11%
>>> fio --name=global --rw=randrw --size=256m --bs=4k --direct=1
--ioengine=libaio --name=job1 --iodepth=10000 --thread
job1: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=10000
Starting 1 thread
Jobs: 1: [m] [91.9% done] [ 0/ 0 kb/s] [eta 00m:21s]]
job1: (groupid=0, jobs=1): err= 0: pid=23794
read : io=135MiB, bw=663KiB/s, iops=161, runt=213443msec
slat (msec): min= 405, max=55971, avg=49388.29, stdev=7498.58
clat (msec): min= 0, max=55981, avg=487.09, stdev=4603.44
bw (KiB/s) : min= 0, max=78767, per=1604.69%, avg=10639.12, stdev=27546.25
write: io=138MiB, bw=610KiB/s, iops=149, runt=237610msec
slat (msec): min= 0, max=55972, avg=17419.86, stdev=9878.98
clat (msec): min= 0, max=55981, avg=429.89, stdev=4413.43
bw (KiB/s) : min= 0, max=80638, per=1582.17%, avg=9651.22, stdev=26668.44
cpu : usr=0.06%, sys=0.69%, ctx=27038
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=99.9%
lat (msec): 2=0.4%, 4=97.0%, 10=0.0%, 20=0.5%, 50=0.1%, 100=0.1%
lat (msec): 250=0.2%, 500=0.4%, 750=0.1%, 1000=0.0%, >=2000=0.0%
Run status group 0 (all jobs):
READ: io=135MiB, aggrb=663KiB/s, minb=663KiB/s, maxb=663KiB/s, mint=213443msec, maxt=213443msec
WRITE: io=138MiB, aggrb=610KiB/s, minb=610KiB/s, maxb=610KiB/s, mint=237610msec, maxt=237610msec
Disk stats (read/write):
sda: ios=33738/28795, merge=907/6695, ticks=24825684/12270488, in_queue=37096692, util=99.57%
Conclusions
Over the multiple tests that I ran using FIO, GUASI and Libaio performance matched each
other pretty much consistently. Performance fluctuated over different
measures of about +/-10% around their mean value. Typically GUASI resulted only slightly more
performing than Libaio, but
not that much to sustain a claim (differences were lower than measure
fluctuations). These results shows that the GUASI library can be used as generic
asynchronous provider, with performance matching the KAIO (Linux Kernel AIO)
implementation. Even when pushed to iodepths that are quite big for the
test hardware. The big advantage of GUASI,
is that it can render asynchronous any
system call or whatever userspace function.
Back Home