[dm-devel] BIO_RW_SYNCIO

Vivek Goyal vgoyal at redhat.com
Wed Jul 28 01:33:45 UTC 2010


On Tue, Jul 27, 2010 at 07:09:50PM -0400, Vivek Goyal wrote:
> On Tue, Jul 27, 2010 at 03:48:52PM -0400, Mikulas Patocka wrote:
> > 
> > 
> > On Mon, 26 Jul 2010, Vivek Goyal wrote:
> > 
> > > On Mon, Jul 26, 2010 at 05:53:40PM -0400, Mikulas Patocka wrote:
> > > > Hi Jens
> > > > 
> > > [ Jens's mail id has changed. Ccing him on different mail id ]
> > > 
> > > > I found out that when I remove BIO_RW_SYNCIO from dm-kcopyd.c, performance 
> > > > when writing to the snapshot origin is increased twice. In this workload, 
> > > > snapshot driver reads a lot of 8k chunks from one place on the disk and 
> > > > writes them to the other place on the same disk. Without BIO_RW_SYNCIO, it 
> > > > is twice faster with CFQ scheduler.
> > > > 
> > > > What does BIO_RW_SYNCIO exactly do?  Does it attempt to decrease latency 
> > > > and decrease throughput? (so that disk head seeks more between the source 
> > > > and destination and it causes performance degradation) Is there some 
> > > > general guidance, when use BIO_RW_SYNCIO and when not?
> > > 
> > > BIO_RW_SYNC marks a request as SYNC. reads are by default sync. Writes
> > > can be marked as SYNC so that they get priority of ASYNC WRITES.
> > > 
> > > Marking writes as SYNC has advantage that it gets its own queue, it can
> > > preempt ASYNC WRITES and CFQ also idles on the cfq queue waiting for
> > > more requests.
> > > 
> > > I suspect if it is idling on SYNC WRITES which is a problem here.
> > > 
> > > - Is it the same thread which is submitting both read and write requests?
> > 
> > Yes.
> > 
> > > - Are you interleaving reads and writes. Like reading some data, then
> > >   writting it and reading again...
> > 
> > I issue write immediatelly when read finishes.
> > 
> > > I guess after writting some data, CFQ is idling on WRITE_SYNC and next
> > > READ does not get dispatched immediately to the disk.
> > > 
> > > Is it possible to provide some 30 second blktrace of the underlying device
> > > where CFQ is running. You can also try setting slice_idle to 0 and see if
> > > it helps.
> > > 
> > > If setting slice_idle=0 helps you, can you please also give a try to
> > > following patch.
> > > 
> > > https://patchwork.kernel.org/patch/113061/
> > > 
> > > Thanks
> > > Vivek
> > 
> > I took the traces and placed them at 
> > http://people.redhat.com/mpatocka/data/blktrace/
> > 
> > It shows that WRITE requests are merged without SYNCIO flags and are not 
> > merged if SYNCIO is used.
> 
> Yes you are right. So I think following is happening.
> 
> Key is that requests don't get merged once they are on dispatch list. They
> get merged only when they are still sitting in some cfq queue and are with
> elevator.
> 
> In case of sync IO, both reads and writes are on single cfq queue. We are
> driving good dispatch list depth (drv=65). That means there are 65 reads
> and writes on dispatch list and none of the new requests can be merged with
> those.
> 
> In case of async IO, reads and writes are going on different cfq queues.
> While reads are being dispatched from one queue, writes are sitting in 
> CFQ and are open to merge. That's the reason we are seeing lot more WRITE
> merging with async case.
> 
> Not sure what we can do about it though. But had a couple of questions.
> 
> - You seem to be issuing lots of 4K size adjacent READS and WRITES. Is
>   there a way that you can club these together and issue a bigger request.
> 
> - What kind of device this is where request queue depth is 65. Can you
>   try reducing request queue depth to say 16 and see if things improve
>   a bit. (/sys/block/<dev>/device/queue_depth).
> 

One more thing. Have you change the "quantum" tunable of CFQ? Looking
at the traces of SYNC case, CFQ seems to be allowing up to 65 requests
from a single cfq queue. But that does not happen. It is limited to 8
requests max from a cfq queue.

Which kernel version are you using?

Thanks
Vivek




More information about the dm-devel mailing list