Asynchronous File I/O on Linux

Mark Woodward markw-FJ05HQ0HCKaWd6l5hS35sQ at public.gmane.org
Mon May 17 14:57:54 EDT 2010


OK, maybe we fell into a pedantic argument about what "asynchronous" 
means, but, what I wanted to do was issue some number of seek+read 
requests simultaneously on a single file from within a single context 
(thread or process) (to do this requires some form of asynchronous I/O) 
in order for those reads to be executed in parallel at the disk drive 
level so that tagged queuing in the SATA disk can be used to optimize 
the physical disk read order. As I explained before, a 7200 RPM disk has 
a rotational period of 8 or so milliseconds. (lets round to 10 for all 
the mechanical workings of the drive) *any* read from that disk will 
take, on average, 4~5 ms. So, 4 random reads of a file, issued 
sequentially will take around 20ms. If, however, you could issue those 
requests simultaneously (using asynchronous I/O) it is theoretically 
possible for those requests to get the the disk at close to the same 
time and a good SATA disk with a big enough internal buffer should be 
able to get those reads during the same 360~540 degree rotation of the 
disk platters. This could save about 5~10 ms per operation. So far, no 
one seems to know if it is even possible for Linux to take advantage of 
this and my tests seem to indicate that the standard APIs available do 
not. From: Richard Pieri <richard.pieri-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org> Subject: Re: 
Asynchronous File I/O on Linux To: Boston Linux and Unix 
<discuss-mNDKBlG2WHs at public.gmane.org> Message-ID: 
<08234F47-926E-4447-817A-57FEEABB6B83-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org> Content-Type: 
text/plain; charset=us-ascii On May 16, 2010, at 2:30 PM, Mark Woodward 
wrote:

> > 
> > While I can see your point, it would be impossible to do multiple simultaneous requests without some sort of asynchronous I/O capability.  The "random access" aspect of it comes out of using multiple file handles to a single file.
>   

Not true.  read() and friends usually block until the read completes or an error occurs.  If you open() a file with O_NONBLOCK then the read() call returns an error if there is nothing ready to be read.  This gets you nowhere near parallel reads, but it does get you a polling loop that chews up CPU while effectively blocking your program anyway.





> > Besides, you probably mean O_RDWR or O_RDONLY, O_WRONLY won't work in your example.
>   

Probably.  :) 

--Rich P.






More information about the Discuss mailing list