ext4: avoid unnecessary transaction stalls during writeback
authorJan Kara <jack@suse.cz>
Sun, 30 Apr 2017 22:29:10 +0000 (18:29 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 30 Apr 2017 22:29:10 +0000 (18:29 -0400)
commitdddbd6ac8f25b2d61e3e1c7134e3b3e1b9cd8670
tree0c7faeba079cc793bee59b1c265e01c777cf9f70
parent85c8f176a6111ecde9c158109989dbd445a0e59a
ext4: avoid unnecessary transaction stalls during writeback

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: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c