Re: [PATCH 1/1] md: expose behind writes counter

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Neil,

Thanks for the feedback...

Neil Brown wrote:
On Mon, 14 Dec 2009 11:56:32 -0500
Paul Clements <paul.clements@xxxxxxxxxxxx> wrote:

This is a very simple patch that exposes the behind_writes counter of an md array via a sysfs entry. This is helpful when tuning the value of behind_writes. Knowing, for instance, the maximum value over time allows one to set a proper upper value for an array.


Hi Paul,
 while I can see that this information could be useful, I wonder if this is
 the best way of accessing it.
 I imagine that the count of behind_writes would change quite quickly, so you
 would need to sample it at quite a high rate to get a meaningful number.

 I'm very conscious that the 'active_stripes' number provided by RAID5 is
 close to useful as it almost always reads a 'zero' even when the array is
 quite busy.

 Maybe having a sysfs attribute that reports the maximum value, and allow
 that maximum to be reset by writing to the attribute?

OK, I did this. I called it behind_writes_top. I also left the behind_writes entry, since it might be useful too.

See attached.

Thanks,
Paul
This is a simple patch that exposes the behind_writes counter of an md
array via a sysfs entry. It also exposes a behind_writes_top (I used this name
because there is already a max_write_behind, which is the configured maximum
value for behind_writes) counter that tracks the highest value of
behind_writes (so that behind_writes doesn't have to be constantly
polled to find the highest value).

The behind_writes_top value is reset whenever you write into the sysfs entry.

Tested against 2.6.32-rc5.

Signed-off-by: Paul Clements <paul.clements@xxxxxxxxxxxx>
---

 bitmap.c |    5 +++++
 bitmap.h |    3 ++-
 md.c     |   37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)

diff -pur linux-2.6.32-rc5-PRISTINE/drivers/md/bitmap.c linux-2.6.32-rc5/drivers/md/bitmap.c
--- linux-2.6.32-rc5-PRISTINE/drivers/md/bitmap.c	2009-10-15 20:41:50.000000000 -0400
+++ linux-2.6.32-rc5/drivers/md/bitmap.c	2009-12-16 08:03:39.000000000 -0500
@@ -1250,6 +1250,11 @@ int bitmap_startwrite(struct bitmap *bit
 
 	if (behind) {
 		atomic_inc(&bitmap->behind_writes);
+		if (atomic_read(&bitmap->behind_writes) >
+		    bitmap->behind_writes_top) {
+			bitmap->behind_writes_top =
+			    atomic_read(&bitmap->behind_writes);
+		}
 		PRINTK(KERN_DEBUG "inc write-behind count %d/%d\n",
 		  atomic_read(&bitmap->behind_writes), bitmap->max_write_behind);
 	}
diff -pur linux-2.6.32-rc5-PRISTINE/drivers/md/bitmap.h linux-2.6.32-rc5/drivers/md/bitmap.h
--- linux-2.6.32-rc5-PRISTINE/drivers/md/bitmap.h	2009-10-15 20:41:50.000000000 -0400
+++ linux-2.6.32-rc5/drivers/md/bitmap.h	2009-12-16 08:09:00.000000000 -0500
@@ -238,7 +238,8 @@ struct bitmap {
 
 	int allclean;
 
-	unsigned long max_write_behind; /* write-behind mode */
+	unsigned long max_write_behind; /* max allowed value, set by admin */
+	unsigned long behind_writes_top; /* highest actual value at runtime */
 	atomic_t behind_writes;
 
 	/*
diff -pur linux-2.6.32-rc5-PRISTINE/drivers/md/md.c linux-2.6.32-rc5/drivers/md/md.c
--- linux-2.6.32-rc5-PRISTINE/drivers/md/md.c	2009-10-15 20:41:50.000000000 -0400
+++ linux-2.6.32-rc5/drivers/md/md.c	2009-12-17 11:52:56.000000000 -0500
@@ -3237,6 +3237,41 @@ static struct md_sysfs_entry md_bitmap =
 __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store);
 
 static ssize_t
+behind_writes_show(mddev_t *mddev, char *page)
+{
+	if (mddev->bitmap) {
+		return sprintf(page, "%lu\n",
+			atomic_read(&mddev->bitmap->behind_writes));
+	} else {
+		return sprintf(page, "0\n");
+	}
+}
+
+static struct md_sysfs_entry md_behind_writes =
+__ATTR(behind_writes, S_IRUGO, behind_writes_show, NULL);
+
+static ssize_t
+behind_writes_top_show(mddev_t *mddev, char *page)
+{
+	if (mddev->bitmap) {
+		return sprintf(page, "%lu\n",
+			mddev->bitmap->behind_writes_top);
+	} else {
+		return sprintf(page, "0\n");
+	}
+}
+
+static ssize_t
+behind_writes_top_reset(mddev_t *mddev, const char *buf, size_t len)
+{
+	if (mddev->bitmap) mddev->bitmap->behind_writes_top = 0;
+	return len;
+}
+
+static struct md_sysfs_entry md_behind_writes_top =
+__ATTR(behind_writes_top, S_IRUGO | S_IWUSR, behind_writes_top_show, behind_writes_top_reset);
+
+static ssize_t
 size_show(mddev_t *mddev, char *page)
 {
 	return sprintf(page, "%llu\n",
@@ -3785,6 +3820,8 @@ static struct attribute *md_redundancy_a
 	&md_suspend_lo.attr,
 	&md_suspend_hi.attr,
 	&md_bitmap.attr,
+	&md_behind_writes.attr,
+	&md_behind_writes_top.attr,
 	&md_degraded.attr,
 	NULL,
 };

[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux