From: Jens Axboe <axboe@kernel.dk>
To: Mike Snitzer <snitzer@redhat.com>
Cc: jmoyer@redhat.com, dm-devel@redhat.com, shivakrishna.merla@netapp.com
Subject: Re: [RFC PATCH 4/4 v2] dm: delay running the queue slightly during request completion
Date: Tue, 24 Feb 2015 10:16:32 -0800 [thread overview]
Message-ID: <54ECC000.40604@kernel.dk> (raw)
In-Reply-To: <20150224181257.GA11444@redhat.com>
On 02/24/2015 10:12 AM, Mike Snitzer wrote:
> On Tue, Feb 24 2015 at 12:52pm -0500,
> Jens Axboe <axboe@kernel.dk> wrote:
>
>> On 02/24/2015 09:22 AM, Mike Snitzer wrote:
>>> On Tue, Feb 24 2015 at 11:51P -0500,
>>> Jens Axboe <axboe@kernel.dk> wrote:
>>>
>>>> On 02/24/2015 08:44 AM, Mike Snitzer wrote:
>>>>> On really fast storage it can be beneficial to delay running the
>>>>> request_queue to allow the elevator more opportunity to merge requests.
>>>>>
>>>>> Otherwise, it has been observed that requests are being sent to
>>>>> q->request_fn much quicker than is ideal on IOPS-bound backends.
>>>>>
>>>>> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
>>>>> ---
>>>>> drivers/md/dm.c | 2 +-
>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
>>>>> index fc92899..92091e0 100644
>>>>> --- a/drivers/md/dm.c
>>>>> +++ b/drivers/md/dm.c
>>>>> @@ -1034,7 +1034,7 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue)
>>>>> * queue lock again.
>>>>> */
>>>>> if (run_queue)
>>>>> - blk_run_queue_async(md->queue);
>>>>> + blk_delay_queue(md->queue, HZ / 10);
>>>>
>>>> This looks dangerous... How will this impact sync IO? Heuristics like this
>>>> will always come back and bite you in the ass.
>>>>
>>>> A slightly more friendly heuristic might be to delay running the queue, if
>>>> you still have pending IO. That would give you a more sawtooth like queue
>>>> depth management, so it would potentially slow down a bit, but the upside
>>>> would be more efficient merging since it would allow some requests so sit a
>>>> little bit before being dispatched.
>>>
>>> OK, thanks for the suggestion, sending RFC patches FTW:
>>>
>>> From: Mike Snitzer <snitzer@redhat.com>
>>> Subject: [PATCH] dm: delay running the queue slightly during request
>>> completion
>>>
>>> On really fast storage it can be beneficial to delay running the
>>> request_queue to allow the elevator more opportunity to merge requests.
>>>
>>> Otherwise, it has been observed that requests are being sent to
>>> q->request_fn much quicker than is ideal on IOPS-bound backends.
>>>
>>> To avoid impacting sync IO, the delay when running the queue is only
>>> used if there is pending IO. As Jens put it when suggesting this
>>> heuristic:
>>> "That would give you a more sawtooth like queue depth management, so it
>>> would potentially slow down a bit, but the upside would be more
>>> efficient merging since it would allow some requests to sit a little
>>> bit before being dispatched."
>>>
>>> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
>>> ---
>>> drivers/md/dm.c | 8 ++++++--
>>> 1 file changed, 6 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
>>> index fc92899..85b8919 100644
>>> --- a/drivers/md/dm.c
>>> +++ b/drivers/md/dm.c
>>> @@ -1033,8 +1033,12 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue)
>>> * back into ->request_fn() could deadlock attempting to grab the
>>> * queue lock again.
>>> */
>>> - if (run_queue)
>>> - blk_run_queue_async(md->queue);
>>> + if (run_queue) {
>>> + if (md->queue->nr_pending)
>>> + blk_delay_queue(md->queue, HZ / 10);
>>> + else
>>> + blk_run_queue_async(md->queue);
>>> + }
>>
>> So all of this needs to be tested and performance vetted. But my
>> original suggestion was something like:
>>
>> if (run_queue && !md->queue->nr_pending)
>> blk_run_queue_async(md->queue);
>>
>> which might be a bit extreme, but if we hit 0, that's the only case
>> where you truly do need to run the queue. So that kind of logic
>> would give you the highest chance of merge success, potentially at
>> the cost of reduced performance for other cases.
>
> Yeah, I was wondering about not running the queue at all when discussing
> with Jeff earlier today. Seemed extreme, and Jeff thought it could
> cause performance to really take a hit.
Whether you have to or not depends on how you break out of queueing
loops. But you definitely don't have to run it on every single request
completion...
>> That aside, where did you pull this ->nr_pending from? I think you
>> need to look at that again...
>
> Um, as in q->nr_pending doesn't reflect the number of pending requests?
> I looked at blk-core.c, saw nr_pending and ran with it...
>
> But looking closer it is only used if CONFIG_PM. SO what is the right
> way to check for pending requests on the queue?
You probably want to track it yourself. You could look at the request
counters, but that would introduce a dependency on the old request path.
--
Jens Axboe
next prev parent reply other threads:[~2015-02-24 18:16 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-24 16:44 [PATCH 0/4] dm: simplify request-based DM a bit and an RFC-like perf tweak Mike Snitzer
2015-02-24 16:44 ` [PATCH 1/4] dm: remove unnecessary wrapper around blk_lld_busy Mike Snitzer
2015-02-24 16:44 ` [PATCH 2/4] dm: remove request-based DM queue's lld_busy_fn hook Mike Snitzer
2015-02-24 16:44 ` [PATCH 3/4] dm: remove request-based logic from make_request_fn wrapper Mike Snitzer
2015-02-24 16:44 ` [RFC PATCH 4/4] dm: delay running the queue slightly during request completion Mike Snitzer
2015-02-24 16:51 ` Jens Axboe
2015-02-24 17:22 ` [RFC PATCH 4/4 v2] " Mike Snitzer
2015-02-24 17:52 ` Jens Axboe
2015-02-24 18:12 ` Mike Snitzer
2015-02-24 18:16 ` Jens Axboe [this message]
2015-02-24 18:32 ` Mike Snitzer
2015-02-25 0:56 ` awful request merge results while simulating high IOPS multipath Mike Snitzer
2015-02-25 4:14 ` Keith Busch
2015-02-25 15:11 ` Jens Axboe
2015-02-25 18:17 ` Busch, Keith
2015-02-25 22:10 ` Mike Snitzer
2015-02-25 23:57 ` Keith Busch
2015-02-26 0:11 ` Mike Snitzer
2015-02-26 0:28 ` Keith Busch
2015-02-25 4:38 ` FIXED! [was: awful request merge results while simulating high IOPS] multipath Mike Snitzer
2015-02-25 4:41 ` Mike Snitzer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54ECC000.40604@kernel.dk \
--to=axboe@kernel.dk \
--cc=dm-devel@redhat.com \
--cc=jmoyer@redhat.com \
--cc=shivakrishna.merla@netapp.com \
--cc=snitzer@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.