• Suparna Bhattacharya's avatar
    [PATCH] AIO: workqueue context switch reduction · e84e486c
    Suparna Bhattacharya authored
    From: Chris Mason
    
    I compared the 2.6 pipetest results with the 2.4 suse kernel, and 2.6 was
    roughly 40% slower.  During the pipetest run, 2.6 generates ~600,000
    context switches per second while 2.4 generates 30 or so.
    
    aio-context-switch (attached) has a few changes that reduces our context
    switch rate, and bring performance back up to 2.4 levels.  These have only
    really been tested against pipetest, they might make other workloads worse.
    
    The basic theory behind the patch is that it is better for the userland
    process to call run_iocbs than it is to schedule away and let the worker
    thread do it.
    
                                                                                  
    1) on io_submit, use run_iocbs instead of run_iocb
    2) on io_getevents, call run_iocbs if no events were available.
    
    3) don't let two procs call run_iocbs for the same context at the same
       time.  They just end up bouncing on spinlocks.
    
    The first three optimizations got me down to 360,000 context switches per
    second, and they help build a little structure to allow optimization #4,
    which uses queue_delayed_work(HZ/10) instead of queue_work. 
    
    That brings down the number of context switches to 2.4 levels.
    
    Adds aio_run_all_iocbs so that normal processes can run all the pending
    retries on the run list.  This allows worker threads to keep using list
    splicing, but regular procs get to run the list until it stays empty.  The
    end result should be less work for the worker threads.
    
    I was able to trigger short stalls (1sec) with aio-stress, and with the
    current patch they are gone.  Could be wishful thinking on my part though,
    please let me know how this works for you.
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    e84e486c
aio.c 43.9 KB