• Andrew Morton's avatar
    [PATCH] adaptive lazy readahead · 202775d6
    Andrew Morton authored
    From: Suparna Bhattacharya <suparna@in.ibm.com>
    
    From: Ram Pai <linuxram@us.ibm.com>
    
    Pipelined readahead behaviour is suitable for sequential reads, but not for
    large random reads (typical of database workloads), where lazy readahead
    provides a big performance boost.
    
    One option (suggested by Andrew Morton) would be to have the application
    pass hints to turn off readahead by setting the readahead window to zero
    using posix_fadvise64(POSIX_FADV_RANDOM), and to special-case that in
    do_generic_mapping_read to completely bypass the readahead logic and
    instead read in all the pages needed directly.
    
    This was the idea I started with.  But then I thought, we can do a still
    better job ?  How about adapting the readahead algorithm to lazy-read or
    non-lazy-read based on the past i/o patterns ?
    
    The overall idea is to keep track of average number of contiguous pages
    accessed in a file.  If the average at any given time is above ra->pages
    the pattern is sequential.  If not the pattern is random.  If pattern is
    sequential do non-lazy-readahead( read as soon as the first page in the
    active window is touched) else do lazy-readahead.
    
    I have studied the behaviour of this patch using my user-level simulator.
    It adapts pretty well.
    
    Note from Suparna: This appears to bring streaming AIO read performance for
    large (64KB) random AIO reads back to sane values (since the lazy readahead
    backout in the mainline).
    202775d6
readahead.c 16.6 KB