reduce log I/O latency V2
PATCH 1/1 reduce log I/O latency V2
Reduce log I/O latency
To ensure that log I/O is issued as the highest priority I/O, set the I/O priority of the log I/O to the highest possible. This will ensure that log I/O is not held up behind bulk data or other metadata I/O as delaying log I/O can pause the entire transaction subsystem. Introduce a new buffer flag to allow us to tag the log buffers so we can discriminate when issuing the I/O.
Version 2:
- don't use realtime priority class
--- fs/xfs/linux-2.6/xfs_buf.c | 3 +++ fs/xfs/linux-2.6/xfs_buf.h | 5 ++++- fs/xfs/xfs_log.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-)
fs/xfs/linux-2.6/xfs_buf.c +3 -0
@@ -1198,6 +1198,9 @@ next_chunk: submit_io:if (likely (bio->bi_size)) { +/* log I/O should not be delayed by anything except realtime. */ +if (bp->b_flags &XBF_LOG_BUFFER ) +bio_set_prio (bio,IOPRIO_PRIO_VALUE (IOPRIO_CLASS_BE ,0 ));submit_bio (rw, bio);if (size) goto next_chunk;
fs/xfs/linux-2.6/xfs_buf.h +4 -1
@@ -53,7 +53,8 @@ typedef enum {XBF_DELWRI = (1 <<6 ),/* buffer has dirty pages */ XBF_STALE = (1 <<7 ),/* buffer has been staled, do not find it */ XBF_FS_MANAGED = (1 <<8 ),/* filesystem controls freeing memory */ -XBF_ORDERED = (1 <<11 ),/* use ordered writes */ +XBF_LOG_BUFFER = (1 <<9 ),/* Buffer issued by the log */ +XBF_ORDERED = (1 <<11 ),/* use ordered writes */ XBF_READ_AHEAD = (1 <<12 ),/* asynchronous read-ahead */ /* flags used only as arguments to access routines */
@@ -339,6 +340,8 @@ extern void xfs_buf_trace(xfs_buf_t *, c#define XFS_BUF_TARGET (bp) ((bp)->b_target)#define XFS_BUFTARG_NAME (target) xfs_buf_target_name(target) +#define XFS_BUF_SET_LOGBUF (bp) ((bp)->b_flags |= XBF_LOG_BUFFER) +static inline int xfs_bawrite (void *mp,xfs_buf_t *bp) { bp->b_fspriv3 = mp;
fs/xfs/xfs_log.c +2 -0
@@ -1443,6 +1443,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case.
Looks good Dave. Shouldn't we also tag the second buffer in the split log write case?
Quoted 70 lines · David Chinner
Reduce log I/O latency
To ensure that log I/O is issued as the highest priority I/O, set the I/O priority of the log I/O to the highest possible. This will ensure that log I/O is not held up behind bulk data or other metadata I/O as delaying log I/O can pause the entire transaction subsystem. Introduce a new buffer flag to allow us to tag the log buffers so we can discriminate when issuing the I/O.
Version 2:
- don't use realtime priority classSigned-off-by Dave Chinner <[email protected]>--- fs/xfs/linux-2.6/xfs_buf.c | 3 +++ fs/xfs/linux-2.6/xfs_buf.h | 5 ++++- fs/xfs/xfs_log.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-)Index:
2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.c
===================================================================fs/xfs/linux-2.6/xfs_buf.c +3
-0@@ -1198,6 +1198,9 @@ next_chunk: submit_io:if (likely (bio->bi_size)) { +/* log I/O should not be delayed by anything except realtime. */ +if (bp->b_flags &XBF_LOG_BUFFER ) +bio_set_prio (bio,IOPRIO_PRIO_VALUE (IOPRIO_CLASS_BE ,0 ));submit_bio (rw, bio);if (size) goto next_chunk;Index:
2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.h
===================================================================fs/xfs/linux-2.6/xfs_buf.h +4
-1@@ -53,7 +53,8 @@ typedef enum {XBF_DELWRI = (1 <<6 ),/* buffer has dirty pages */ XBF_STALE = (1 <<7 ),/* buffer has been staled, do not find it */ XBF_FS_MANAGED = (1 <<8 ),/* filesystem controls freeing memory */ -XBF_ORDERED = (1 <<11 ),/* use ordered writes */ +XBF_LOG_BUFFER = (1 <<9 ),/* Buffer issued by the log */ +XBF_ORDERED = (1 <<11 ),/* use ordered writes */ XBF_READ_AHEAD = (1 <<12 ),/* asynchronous read-ahead */ /* flags used only as arguments to access routines */@@ -339,6 +340,8 @@ extern void xfs_buf_trace(xfs_buf_t *, c#define XFS_BUF_TARGET (bp) ((bp)->b_target)#define XFS_BUFTARG_NAME (target) xfs_buf_target_name(target) +#define XFS_BUF_SET_LOGBUF (bp) ((bp)->b_flags |= XBF_LOG_BUFFER) +static inline int xfs_bawrite (void *mp,xfs_buf_t *bp) { bp->b_fspriv3 = mp;Index:
2.6.x-xfs-new/fs/xfs/xfs_log.c
===================================================================fs/xfs/xfs_log.c +2
-0@@ -1443,6 +1443,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case.
Quoted 2 lines · Lachlan McIlroy
Looks good Dave. Shouldn't we also tag the second buffer in the split log write case?
Hmm - I thought it was being tagged. looks like I missed a reject on my last set of patch re-orderings - updated patch attached.
---
Reduce log I/O latency
To ensure that log I/O is issued as the highest priority I/O, set the I/O priority of the log I/O to the highest possible. This will ensure that log I/O is not held up behind bulk data or other metadata I/O as delaying log I/O can pause the entire transaction subsystem. Introduce a new buffer flag to allow us to tag the log buffers so we can discriminate when issuing the I/O.
--- fs/xfs/linux-2.6/xfs_buf.c | 3 +++ fs/xfs/linux-2.6/xfs_buf.h | 5 ++++- fs/xfs/xfs_log.c | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-)
fs/xfs/linux-2.6/xfs_buf.c +3 -0
@@ -1198,6 +1198,9 @@ next_chunk: submit_io:if (likely (bio->bi_size)) { +/* log I/O should not be delayed by anything except realtime. */ +if (bp->b_flags &XBF_LOG_BUFFER ) +bio_set_prio (bio,IOPRIO_PRIO_VALUE (IOPRIO_CLASS_BE ,0 ));submit_bio (rw, bio);if (size) goto next_chunk;
fs/xfs/linux-2.6/xfs_buf.h +4 -1
@@ -53,7 +53,8 @@ typedef enum {XBF_DELWRI = (1 <<6 ),/* buffer has dirty pages */ XBF_STALE = (1 <<7 ),/* buffer has been staled, do not find it */ XBF_FS_MANAGED = (1 <<8 ),/* filesystem controls freeing memory */ -XBF_ORDERED = (1 <<11 ),/* use ordered writes */ +XBF_LOG_BUFFER = (1 <<9 ),/* Buffer issued by the log */ +XBF_ORDERED = (1 <<11 ),/* use ordered writes */ XBF_READ_AHEAD = (1 <<12 ),/* asynchronous read-ahead */ /* flags used only as arguments to access routines */
@@ -339,6 +340,8 @@ extern void xfs_buf_trace(xfs_buf_t *, c#define XFS_BUF_TARGET (bp) ((bp)->b_target)#define XFS_BUFTARG_NAME (target) xfs_buf_target_name(target) +#define XFS_BUF_SET_LOGBUF (bp) ((bp)->b_flags |= XBF_LOG_BUFFER) +static inline int xfs_bawrite (void *mp,xfs_buf_t *bp) { bp->b_fspriv3 = mp;
fs/xfs/xfs_log.c +3 -0
@@ -1462,6 +1462,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case.
@@ -1499,6 +1501,7 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp);if (log->l_mp->m_flags &XFS_MOUNT_BARRIER )XFS_BUF_ORDERED (bp); dptr =XFS_BUF_PTR (bp);
Yup, all good now.
Quoted 86 lines · David Chinner
Quoted 2 lines · Lachlan McIlroy
Looks good Dave. Shouldn't we also tag the second buffer in the split log write case?
Hmm - I thought it was being tagged. looks like I missed a reject on my last set of patch re-orderings - updated patch attached.
---
Reduce log I/O latency
To ensure that log I/O is issued as the highest priority I/O, set the I/O priority of the log I/O to the highest possible. This will ensure that log I/O is not held up behind bulk data or other metadata I/O as delaying log I/O can pause the entire transaction subsystem. Introduce a new buffer flag to allow us to tag the log buffers so we can discriminate when issuing the I/O.
Signed-off-by Dave Chinner <[email protected]>--- fs/xfs/linux-2.6/xfs_buf.c | 3 +++ fs/xfs/linux-2.6/xfs_buf.h | 5 ++++- fs/xfs/xfs_log.c | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-)Index:
2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.c
===================================================================fs/xfs/linux-2.6/xfs_buf.c +3
-0@@ -1198,6 +1198,9 @@ next_chunk: submit_io:if (likely (bio->bi_size)) { +/* log I/O should not be delayed by anything except realtime. */ +if (bp->b_flags &XBF_LOG_BUFFER ) +bio_set_prio (bio,IOPRIO_PRIO_VALUE (IOPRIO_CLASS_BE ,0 ));submit_bio (rw, bio);if (size) goto next_chunk;Index:
2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.h
===================================================================fs/xfs/linux-2.6/xfs_buf.h +4
-1@@ -53,7 +53,8 @@ typedef enum {XBF_DELWRI = (1 <<6 ),/* buffer has dirty pages */ XBF_STALE = (1 <<7 ),/* buffer has been staled, do not find it */ XBF_FS_MANAGED = (1 <<8 ),/* filesystem controls freeing memory */ -XBF_ORDERED = (1 <<11 ),/* use ordered writes */ +XBF_LOG_BUFFER = (1 <<9 ),/* Buffer issued by the log */ +XBF_ORDERED = (1 <<11 ),/* use ordered writes */ XBF_READ_AHEAD = (1 <<12 ),/* asynchronous read-ahead */ /* flags used only as arguments to access routines */@@ -339,6 +340,8 @@ extern void xfs_buf_trace(xfs_buf_t *, c#define XFS_BUF_TARGET (bp) ((bp)->b_target)#define XFS_BUFTARG_NAME (target) xfs_buf_target_name(target) +#define XFS_BUF_SET_LOGBUF (bp) ((bp)->b_flags |= XBF_LOG_BUFFER) +static inline int xfs_bawrite (void *mp,xfs_buf_t *bp) { bp->b_fspriv3 = mp;Index:
2.6.x-xfs-new/fs/xfs/xfs_log.c
===================================================================fs/xfs/xfs_log.c +3
-0@@ -1462,6 +1462,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case. @@ -1499,6 +1501,7 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp);if (log->l_mp->m_flags &XFS_MOUNT_BARRIER )XFS_BUF_ORDERED (bp); dptr =XFS_BUF_PTR (bp);