xfs
[Top] [All Lists]

xfs: AIL lock contention reduction V3

To: xfs@xxxxxxxxxxx
Subject: xfs: AIL lock contention reduction V3
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Mon, 13 Dec 2010 15:32:14 +1100
This series reduces AIL locking overhead by introducing bulk
operations for insert and delete. With delayed logging, we can be
doing insert operations on thousands of items at a time, so using a
bulk operation to reduce AIL lock traffic is a major win in terms of
reducing contention on the lock.

Similarly, when we have inode buffer IO completion running on
multiple CPUs at once, the AIl lock contention from each individual
AIL removal is significant.  By batching all the inodes on the
buffer to be removed from the AIL in a single bulk operation,
contention on the AIL is reduced by an order of magnitude.

Finally, there is a modification to the xfsaild wakeup code to
prevent too many wakeups when the xfsaild is pausing waiting for
some work to complete. This prevents an excessive number of AIL
scanning traversals by the xfsaild when tail pushing is backing off
and waiting for some IO to complete.

In combination, these modification reduce AIL lock contention
sufficiently to drop the AIL lock out of the "top 10" contended
locks on 8-way fs_mark and dbench workloads.

Version 3:
- split XFS_EFI_CANCELED fixup into separate patch
- initialised efi_next_extent correctly
- converted XFS_EFI_RECOVERED to use correct bit set/clear
  operations
- removed unneeded clearing of XFS_EFI_COMMITTED in recovery.
- added helper for freeing an EFI.
- cleaned up log item array variable naming.
- cleaned up bulk AIL operation comments.

Version 2:
- split out stale inode AIL insertion bug fix
- split bulk AIL insertion into multiple patches
        - EFI/EFD handling changes
        - stale inode AIL insertion bug fix
        - simplify code calling xfs_ail_delete
        - bulk ail insertion modifications
- use atomic_inc_return for extent recording in
  xfs_trans_log_efi_extent()
- modified AIL sleep code to explicitly set task state as suggested
  by Christoph.
- split AIL bulk deletion into two patches
        - buffer iodone callback modifications
        - bulk AIL deletion and inode iodone callback mods.
- removed lip parameter from xfs_buf_do_callbacks() as the loop
  fetches it from the buffer anyway.
- fixed unused variable warning in xfs_buf_do_callbacks().
- added two new patches to reduce code duplication
        - use AIL bulk insertion function to implement single
          updates
        - use AIL bulk delete function to implement single deletes

<Prev in Thread] Current Thread [Next in Thread>