xfs
[Top] [All Lists]

Re: [[PATCH, RESEND]] less AGs for single disks configs.

To: David Chinner <dgc@xxxxxxx>
Subject: Re: [[PATCH, RESEND]] less AGs for single disks configs.
From: Justin Piszcz <jpiszcz@xxxxxxxxxxxxxxx>
Date: Mon, 12 Nov 2007 09:57:21 -0500 (EST)
Cc: xaiki@xxxxxxx, xfs@xxxxxxxxxxx
In-reply-to: <20071112090147.GD66820511@xxxxxxx>
References: <20071031233516.GB88034736@xxxxxxxxxxxxxxxxx> <1194839329-22003-1-git-send-email-xaiki@xxxxxxx> <1194839329-22003-2-git-send-email-xaiki@xxxxxxx> <1194839329-22003-3-git-send-email-xaiki@xxxxxxx> <1194839329-22003-4-git-send-email-xaiki@xxxxxxx> <1194839329-22003-5-git-send-email-xaiki@xxxxxxx> <1194839329-22003-6-git-send-email-xaiki@xxxxxxx> <20071112090147.GD66820511@xxxxxxx>
Sender: xfs-bounce@xxxxxxxxxxx


On Mon, 12 Nov 2007, David Chinner wrote:

On Mon, Nov 12, 2007 at 02:48:49PM +1100, xaiki@xxxxxxx wrote:
From: Niv Sardi <xaiki@xxxxxxx>

get the underlying structure with get_subvol_stripe_wrapper(),
and pass sunit | swidth as an argument to calc_default_ag_geometry().

if it is set, get the AG sizes bigger.

this also cleans up a typo:
-       } else if (daflag)      /* User-specified AG size */
+       } else if (daflag)      /* User-specified AG count */

No need to mention that you are cleaning up a typo in the description ;)

---
 xfsprogs/mkfs/xfs_mkfs.c |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/xfsprogs/mkfs/xfs_mkfs.c b/xfsprogs/mkfs/xfs_mkfs.c
index 78c2c77..4cf9975 100644
--- a/xfsprogs/mkfs/xfs_mkfs.c
+++ b/xfsprogs/mkfs/xfs_mkfs.c
@@ -393,6 +393,7 @@ void
 calc_default_ag_geometry(
        int             blocklog,
        __uint64_t      dblocks,
+       int             multidisk,
        __uint64_t      *agsize,
        __uint64_t      *agcount)
 {
@@ -428,12 +429,13 @@ calc_default_ag_geometry(
         *
         * This scales us up smoothly between min/max AG sizes.
         */
+
        if (dblocks > GIGABYTES(512, blocklog))
-               shift = 5;
+               shift = 5 - (multidisk == 0);
        else if (dblocks > GIGABYTES(8, blocklog))
-               shift = 4;
+               shift = 4 - (multidisk == 0);
        else if (dblocks >= MEGABYTES(128, blocklog))
-               shift = 3;
+               shift = 3 - (multidisk == 0);
        else
                ASSERT(0);

Ok, so now we end up with half the number of allocation groups
at these different sizes. That's not exactly what I had in mind.
basically, what you've done works out as:

        > 512GB  old = 32 AGs, new = 16AGs
        > 8 GB   old = 16 AGs, new = 8AGs
        > 128MB  old = 8 AGs, new = 4AGs

on an 8Gb filesystem we still get 8 AGs, which is far too many.
on a 750GB disk, we still get 16AGs, which to far too many.

A single spindle, regardless of it's size, will have similar
seek characteristics so scaling the number of AGs with size
is the wrong thing to do - you don't get better parallelism
out of a single spindle, just more seeks and lower performance.
hence keeping the number of AGs fixed up to the point where
the AG size tops out (i.e. 4TB) seems like a better scaling
factor to me. i.e. something like:


        if (!multidisk) {
                if (dblocks >= TERABYTES(4, blocklog)) {
                        blocks = XFS_AG_MAX_BLOCKS(blocklog);
                        goto done;
                }
                agcount = 4;
                /* work out ag size here */
                goto done;
        }

I'd also like to see some test results showing the mkfs output
for the different configurations to confirm it works correctly
(i.e. that the corner cases work correctly).

Cheers,

Dave.
--
Dave Chinner
Principal Engineer
SGI Australian Software Group



Dave, when this is put into place do you recommend people re-format their XFS partitions for those with a 750GiB drive -or- with a < 2TB RAID5 array, would one see any increase in speed?

Justin.


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