• Jan Kara's avatar
    ext4: avoid unnecessary transaction stalls during writeback · dddbd6ac
    Jan Kara authored
    Currently ext4_writepages() submits all pages with transaction started.
    When no page needs block allocation or extent conversion we can submit
    all dirty pages in the inode while holding a single transaction handle
    and when device is congested this can take significant amount of time.
    Thus ext4_writepages() can block transaction commits for extended
    periods of time.
    
    Take for example a simple benchmark simulating PostgreSQL database
    (pgioperf in mmtest). The benchmark runs 16 processes doing random reads
    from a huge file, one process doing random writes to the huge file, and
    one process doing sequential writes to a small files and frequently
    running fsync. With unpatched kernel transaction commits take on average
    ~18s with standard deviation of ~41s, top 5 commit times are:
    
    274.466639s, 126.467347s, 86.992429s, 34.351563s, 31.517653s.
    
    After this patch transaction commits take on average 0.1s with standard
    deviation of 0.15s, top 5 commit times are:
    
    0.563792s, 0.519980s, 0.509841s, 0.471700s, 0.469899s
    
    [ Modified so we use an explicit do_map flag instead of relying on
      io_end not being allocated, the since io_end->inode is needed for I/O
      error handling. -- tytso ]
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    dddbd6ac
inode.c 175 KB