• Wu Fengguang's avatar
    writeback: balanced_rate cannot exceed write bandwidth · bdaac490
    Wu Fengguang authored
    Add an upper limit to balanced_rate according to the below inequality.
    This filters out some rare but huge singular points, which at least
    enables more readable gnuplot figures.
    
    When there are N dd dirtiers,
    
    	balanced_dirty_ratelimit = write_bw / N
    
    So it holds that
    
    	balanced_dirty_ratelimit <= write_bw
    
    The singular points originate from dirty_rate in the below formular:
    
            balanced_dirty_ratelimit = task_ratelimit * write_bw / dirty_rate
    where
    	dirty_rate = (number of page dirties in the past 200ms) / 200ms
    
    In the extreme case, if all dd tasks suddenly get blocked on something
    else and hence no pages are dirtied at all, dirty_rate will be 0 and
    balanced_dirty_ratelimit will be inf. This could happen in reality.
    
    Note that these huge singular points are not a real threat, since they
    are _guaranteed_ to be filtered out by the
    	min(balanced_dirty_ratelimit, task_ratelimit)
    line in bdi_update_dirty_ratelimit(). task_ratelimit is based on the
    number of dirty pages, which will never _suddenly_ fly away like
    balanced_dirty_ratelimit. So any weirdly large balanced_dirty_ratelimit
    will be cut down to the level of task_ratelimit.
    
    There won't be tiny singular points though, as long as the dirty pages
    lie inside the dirty throttling region (above the freerun region).
    Because there the dd tasks will be throttled by balanced_dirty_pages()
    and won't be able to suddenly dirty much more pages than average.
    Acked-by: default avatarJan Kara <jack@suse.cz>
    Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    bdaac490
page-writeback.c 64.6 KB