Re: crimson-osd queues discussion

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

 



On Fri, Mar 8, 2019 at 6:23 PM kefu chai <tchaikov@xxxxxxxxx> wrote:
>
> On Wed, Mar 6, 2019 at 3:49 AM Gregory Farnum <gfarnum@xxxxxxxxxx> wrote:
> >
> > I realize I'm a bit late here, but I had some thoughts I wanted to get
> > out as well...
> >
> > On Wed, Feb 20, 2019 at 7:54 PM Sage Weil <sage@xxxxxxxxxxxx> wrote:
> > >
> > > On Thu, 21 Feb 2019, Liu, Chunmei wrote:
> > > > Hi all,
> > > >
> > > >   Here we want to discuss ceph-osd multiple queues and how can we
> > > > implement crimson-osd more efficient with or without these queues.
> > > >
> > > >   We noticed there are multiple places for enqueue operations in current
> > > > ceph-osd for a request when some preconditions are not satisfied such as
> > > > session->waiting_on_map(waiting for map), slot->waiting(waiting for pg),
> > > > waiting_for/map/peered/active/flush/scrub/** etc in pg.h, we need hold
> > > > the request in these waiting queues, when some certain precondition is
> > > > satisfied these enqueued request will be dequeued and enqueue front to
> > > > work queue again to go through all the precondition checks from the
> > > > beginning.
> > > >
> > > >   1. is it necessary to go through all the precondition checks again
> > > > from the beginning or we can continue from the blocked check?
> > >
> > > Look at PG.h line ~1303 or so for a summary of the various queues.  It's a
> > > mix: about half of them block and then stop blocking, never to block
> > > again, until a new peering interval.  The others can start/stop blocking
> > > at any time.
> > >
> > > I think this means that we should repeat all of the precondition checks.
> > >
> > > >    Crimson-osd is based on seastar framewok and use
> > > > future/promise/continue chains, when a task's precondition is not
> > > > satisfied at now it will return a future immediately and when promise
> > > > fulfill the future, the continue task will be push to task queue of
> > > > seastar reactor to schedule.  In this case we still need hold a queue
> > > > for each precondition to keep track of pending futures, when some
> > > > precondition is satisfied to call the waiting futures' promise to
> > > > fulfill the future.
> > > >
> > > >    2. We have two choice here: a). use application its own queue to do
> > > > request schedule just like the current ceph-osd (enqueue/dequeue request
> > > > from one queue to another when precondition is not satisfied), in this
> > > > case seastar reactor task scheduler is not involved in b). Use seastar
> > > > reactor task queue, in this case use future/promise/continue model when
> > > > precondition is not satisfied, let seastar reactor do schedule (also
> > > > need application queues for tracking pending futures)
> > > >      From our crimson-messenger experience, for some simple repeat
> > > > action such as send-message, seems application queue is more effective
> > > > than seastar reactor task queue.  We are not sure for osd/pg this kind
> > > > of complex case, if it is still more effective.
> > > >     Which one is better for crimson-osd?
> > >
> > > My gut says this will make for more robust code anyway to use an
> > > application queue, and the blocking is relatively rare, so I wouldn't
> > > worry about the overhead of repeating those checks.  But... I don't have
> > > any experience or intuition around what makes sense in the future/promise
> > > style of things.  :/
> >
> > I'm actually on the other side of this fence. The queues are fairly
> > stable now, but getting them to that point took a long time and
> > maintaining them correctly is still one of the most finicky parts of
> > making real changes in the OSD code. They are a big piece of "global"
> > state that don't show up in many places but are absolutely critical to
> > maintain correctly, so it's hard for developers to learn the rules
> > about them AND easy to miss that they need to be considered when
> > making otherwise-unrelated changes.
> > I was very much hoping that we could turn all of that explicit mapping
> > into implicit dependency chains that validate precondition (or pause
> > until they are satisfied) using futures that can be handled by the
> > reactor and otherwise only need to be considered at the point where
> > they are asserted, rather than later on at random places in the code.
> > I *think* this is feasible?
>
> yes, i am also in favor of this. see
> https://github.com/ceph/ceph/pull/26697/commits/81e906d82d9e04ebe5b8b230d424b300ebff2f93
> and https://github.com/ceph/ceph/pull/26697/commits/d64c7c8022cacfc787231cfa61d9ea0fdcc58013#diff-1449683df2509676ff6b4977eff7e74bR660
> for examples . to chain the producer and consumer in the same place
> helps with the readability and probably helps with the performance.

These links have gone stale in a rebase; can you share the commit titles?
Browsing some of them, I see that "crimson/osd: wait osdmap before
processing peering evt" has added an explicit "waiting_peering"
application queue that I presume we have to maintain just like all the
others that exist in the classic code.
-Greg

>
> >
> > There is a bit of a challenge to this when debugging blocked ops, but
> > I presume we'll need to develop a robust way of checking reactor
> > dependency chains anyway so I don't think it should be any worse than
> > if we had to build up debugging around all the queues.
>
> ahh, this is a good point. i never thought about a way to check
> dependency chain. this would need a probe touching the innards of
> reactor.
>
> >
> > >
> > > >    3. For QOS, do we have to use some application queue to implement
> > > > Qos? Means we can't avoid application queue for QOS?
> > >
> > > Yeah, I think we'll need the app queue for this anyway!
> >
> > It would depend on exactly what functionality we need, but I don't
> > think this is accurate. We can chain futures such that we wait for the
> > previous client op to complete, then wait on a timer, if we are just
> > limiting it to an absolute IOP rate. dmclock is a little harder but we
> > can also do futures that are satisfied by the completion of a single
> > "child" future, which would let us combine many different conditions
> > together and probably build that model.
> > -Greg
>
>
>
> --
> Regards
> Kefu Chai



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux