- Subject: On I/O engines
- From: Martin Steigerwald <Martin@xxxxxxxxxxxx>
- Date: Wed, 3 Aug 2011 22:13:36 +0200
- User-agent: KMail/1.13.7 (Linux/3.0.0-1-amd64; KDE/4.6.5; x86_64; ; )
Hi!
In order to understand I/O engines better, I like to summarize what I
think to know at the moment. Maybe this can be a starting point for some
additional documentation:
=== sync, psync, vsync ===
- all these are using synchronous Linux (POSIX) system calls
- is used by regular applications
- synchronous just refers to the system call interface: i.e. the when the
system call returns to the application
- as far as I understand it returns when the I/O request is told to be
completed
- it does not imply synchronous I/O aka O_SYNC which is way slower and
enabled by sync=1
- thus it does not guarantee that the I/O has been physically written to
the underlying device (see open(2))
- thus is only guarantees that the I/O request has been dealt with? what
does this exactly mean?
- does it mean that this is I/O in the context of the process?
- it can be used with direct=1 to circumvent the pagecache
difference is the kind of system call used:
- sync uses read/write which read/write count bytes into from/to a buffer.
Uses current file offset, changeable via fseek (or lseek, I did not find a
manpage for fseek)
- psync uses pread/pwrite which read/write count bytes from given offset
- vsync uses readv/writev which read/writes count, i.e. mutiple buffers of
given length in one call (struct iovec)
I am not sure on what performance difference to expect. I bet that
sync/psync should perform roughly the same.
=== libaio ===
- this uses Linux asynchronous I/O calls[1]
- it uses libaio for that
- who else uses libaio? It systems application that are near to the
system:
martin@merkaba:~> apt-cache rdepends libaio1
libaio1
Reverse Depends:
fio
qemu-kvm
libdbd-oracle-perl
zfs-fuse
stressapptest
qemu-kvm
qemu-utils
qemu-system
multipath-tools
ltp-kernel-test
libaio1-dbg
libaio-dev
fio
drizzle
blktrace
- these calls allow applications to offload I/O calls to the background
- according to [1] this is only supported for direct I/O
- using anything else let it fall back to synchronous call behavior
- thus one sees this in combination with direct=1 in fio jobs
- does this mean that this is I/O outside the context of the process?
Question:
- what difference is between the following two other than the second one
seems to be more popular in example job files?
1) ioengine=sync + direct=1
2) ioengine=libaio + direct=1
Current answer: It is that fio can issue further I/Os while the Linux
kernels handles the I/O.
=== other I/O engines relevant to Linux ===
There seem to be some other I/O engines relevant to Linux and mass storage
I/O:
== mmap ==
- maps the memory into files and uses memcpy
- used by quite some applications
- what else to note?
== syslet-rw ==
- make regular read/write asynchronous
- where is this used?
- what else to note?
Any others?
Is what I wrote correct so far?
I think I´d like to write something up about the different I/O concepts in
Linux, if such a document doesn´t exist yet.
[1] http://lse.sourceforge.net/io/aio.html
Thanks,
--
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Home]
[Linux SCSI]
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Video Projectors]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]