• Andrew Morton's avatar
    [PATCH] self-unplugging request queues · 00c8e791
    Andrew Morton authored
    The patch teaches a queue to unplug itself:
    
    a) if is has four requests OR
    b) if it has had plugged requests for 3 milliseconds.
    
    These numbers may need to be tuned, although doing so doesn't seem to
    make much difference.  10 msecs works OK, so HZ=100 machines will be
    fine.
    
    Instrumentation shows that about 5-10% of requests were started due to
    the three millisecond timeout (during a kernel compile).  That's
    somewhat significant.  It means that the kernel is leaving stuff in the
    queue, plugged, for too long.  This testing was with a uniprocessor
    preemptible kernel, which is particularly vulnerable to unplug latency
    (submit some IO, get preempted before the unplug).
    
    This patch permits the removal of a lot of rather lame unplugging in
    page reclaim and in the writeback code, which kicks the queues
    (globally!) every four megabytes to get writeback underway.
    
    This patch doesn't use blk_run_queues().  It is able to kick just the
    particular queue.
    
    The patch is not expected to make much difference really, except for
    AIO.  AIO needs a blk_run_queues() in its io_submit() call.  For each
    request.  This means that AIO has to disable plugging altogether,
    unless something like this patch does it for it.  It means that AIO
    will unplug *all* queues in the machine for every io_submit().  Even
    against a socket!
    
    This patch was tested by disabling blk_run_queues() completely.  The
    system ran OK.
    
    The 3 milliseconds may be too long.  It's OK for the heavy writeback
    code, but AIO may want less.  Or maybe AIO really wants zero (ie:
    disable plugging).  If that is so, we need new code paths by which AIO
    can communicate the "immediate unplug" information - a global unplug is
    not good.
    
    
    To minimise unplug latency due to user CPU load, this patch gives keventd
    `nice -10'.  This is of course completely arbitrary.  Really, I think keventd
    should be SCHED_RR/MAX_RT_PRIO-1, as it has been in -aa kernels for ages.
    00c8e791
workqueue.c 8.68 KB