Skip to content
  • NeilBrown's avatar
    loop: Add PF_LESS_THROTTLE to block/loop device thread. · b2ee7d46
    NeilBrown authored
    
    
    When a filesystem is mounted from a loop device, writes are
    throttled by balance_dirty_pages() twice: once when writing
    to the filesystem and once when the loop_handle_cmd() writes
    to the backing file.  This double-throttling can trigger
    positive feedback loops that create significant delays.  The
    throttling at the lower level is seen by the upper level as
    a slow device, so it throttles extra hard.
    
    The PF_LESS_THROTTLE flag was created to handle exactly this
    circumstance, though with an NFS filesystem mounted from a
    local NFS server.  It reduces the throttling on the lower
    layer so that it can proceed largely unthrottled.
    
    To demonstrate this, create a filesystem on a loop device
    and write (e.g. with dd) several large files which combine
    to consume significantly more than the limit set by
    /proc/sys/vm/dirty_ratio or dirty_bytes.  Measure the total
    time taken.
    
    When I do this directly on a device (no loop device) the
    total time for several runs (mkfs, mount, write 200 files,
    umount) is fairly stable: 28-35 seconds.
    When I do this over a loop device the times are much worse
    and less stable.  52-460 seconds.  Half below 100seconds,
    half above.
    When I apply this patch, the times become stable again,
    though not as fast as the no-loop-back case: 53-72 seconds.
    
    There may be room for further improvement as the total overhead still
    seems too high, but this is a big improvement.
    
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarMing Lei <tom.leiming@gmail.com>
    Suggested-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    b2ee7d46