Thread (32 messages) 32 messages, 6 authors, 2017-07-13

Re: [PATCH 4/6] blk-mq: use EWMA to estimate congestion threshold

From: Bart Van Assche <hidden>
Date: 2017-07-11 21:02:18

On Wed, 2017-07-12 at 02:21 +0800, Ming Lei wrote:
When .queue_rq() returns BLK_STS_RESOURCE(BUSY), we can
consider that there is congestion in either low level
driver or hardware.
=20
This patch uses EWMA to estimate this congestion threshold,
then this threshold can be used to detect/avoid congestion.
Hello Ming,

Does EWMA stand for "exponentially weighted moving average" in the context =
of
this patch? If so, please mention this.
+static void blk_mq_update_req_dispatch_busy(struct blk_mq_hw_ctx *hctx)
+{
+	struct sbitmap_queue *sbq;
+	unsigned depth;
+
+	sbq =3D &hctx->tags->bitmap_tags;
+	depth =3D sbitmap_weight(&sbq->sb);
+
+	/* use EWMA to estimate a threshold for detecting congestion */
+	ewma_add(hctx->avg_busy_threshold, depth, 8, 0);
+}
This function has been named after the context it is called from. Wouldn't =
it
be more clear to change the name of this function into something that refer=
s to
what this function does, e.g. blk_mq_update_avg_busy_threshold()?

Additionally, I think that the behavior of e.g. the SCSI and dm-mpath drive=
rs
is too complicated for this approach to be effective. If you want to procee=
d
with this approach I think it should be possible for block drivers to opt o=
ut
of the mechanism introduced in the next patch.
quoted hunk ↗ jump to hunk
diff --git a/block/blk-mq.h b/block/blk-mq.h
index 60b01c0309bc..c4516d2a2d2c 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -133,4 +133,13 @@ static inline bool blk_mq_hw_queue_mapped(struct blk=
_mq_hw_ctx *hctx)
 	return hctx->nr_ctx && hctx->tags;
 }
=20
+/* borrowed from bcache */
+#define ewma_add(ewma, val, weight, factor)                             =
\
+({                                                                      =
\
+        (ewma) *=3D (weight) - 1;                                       =
  \
+        (ewma) +=3D (val) << factor;                                    =
  \
+        (ewma) /=3D (weight);                                           =
  \
+        (ewma) >> factor;                                               =
\
+})
Sorry but this does not match how others define an exponentially weighted m=
oving
average. As far as I know the ewma values should be updated as follows:

   new_ewma =3D w * val + (1 - w) * current_ewma

where 0 < w <=3D 1 is a rational number (typically 0.05 <=3D w <=3D 0.3). S=
ee also
https://en.wikipedia.org/wiki/EWMA_chart.

Bart.=
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help