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

Re: [Xen-devel] [PATCH RFC 0/6] Slotted channels for sync vm_events



On Mon, Mar 4, 2019 at 9:01 AM George Dunlap <george.dunlap@xxxxxxxxxx> wrote:
>
> On 2/19/19 11:48 AM, Razvan Cojocaru wrote:
> > On 2/12/19 7:01 PM, Tamas K Lengyel wrote:
> >> On Thu, Feb 7, 2019 at 9:06 AM Petre Ovidiu PIRCALABU
> >> <ppircalabu@xxxxxxxxxxxxxxx> wrote:
> >>>
> >>> On Thu, 2019-02-07 at 11:46 +0000, George Dunlap wrote:
> >>>> On 2/6/19 2:26 PM, Petre Ovidiu PIRCALABU wrote:
> >>>>> On Wed, 2018-12-19 at 20:52 +0200, Petre Pircalabu wrote:
> >>>>>> This patchset is a rework of the "multi-page ring buffer" for
> >>>>>> vm_events
> >>>>>> patch based on Andrew Cooper's comments.
> >>>>>> For synchronous vm_events the ring waitqueue logic was
> >>>>>> unnecessary as
> >>>>>> the
> >>>>>> vcpu sending the request was blocked until a response was
> >>>>>> received.
> >>>>>> To simplify the request/response mechanism, an array of slotted
> >>>>>> channels
> >>>>>> was created, one per vcpu. Each vcpu puts the request in the
> >>>>>> corresponding slot and blocks until the response is received.
> >>>>>>
> >>>>>> I'm sending this patch as a RFC because, while I'm still working
> >>>>>> on
> >>>>>> way to
> >>>>>> measure the overall performance improvement, your feedback would
> >>>>>> be a
> >>>>>> great
> >>>>>> assistance.
> >>>>>>
> >>>>>
> >>>>> Is anyone still using asynchronous vm_event requests? (the vcpu is
> >>>>> not
> >>>>> blocked and no response is expected).
> >>>>> If not, I suggest that the feature should be removed as it
> >>>>> (significantly) increases the complexity of the current
> >>>>> implementation.
> >>>>
> >>>> Could you describe in a bit more detail what the situation
> >>>> is?  What's
> >>>> the current state fo affairs with vm_events, what you're trying to
> >>>> change, why async vm_events is more difficult?
> >>>>
> >>> The main reason for the vm_events modification was to improve the
> >>> overall performance in high throughput introspection scenarios. For
> >>> domus with a higher vcpu count, a vcpu could sleep for a certain period
> >>> of time while waiting for a ring slot to become available
> >>> (__vm_event_claim_slot)
> >>> The first patchset only increased the ring size, and the second
> >>> iteraton, based on Andrew Copper's comments, proposed a separate path
> >>> to handle synchronous events ( a slotted buffer for each vcpu) in order
> >>> to have the events handled independently of one another. To handle
> >>> asynchronous events, a dynamically allocated vm_event ring is used.
> >>> While the implementation is not exactly an exercise in simplicity, it
> >>> preserves all the needed functionality and offers fallback if the Linux
> >>> domain running the monitor application doesn't support
> >>> IOCTL_PRIVCMD_MMAP_RESOURCE.
> >>> However, the problem got a little bit more complicated when I tried
> >>> implementing the vm_events using an IOREQ server (based on Paul
> >>> Durrant's comments). For synchronous vm_events, it simplified things a
> >>> little, eliminating both the need for a special structure to hold the
> >>> processing state and the evtchns for each vcpu.
> >>> The asynchronous events were a little more tricky to handle. The
> >>> buffered ioreqs were a good candidate, but the only thing usable is the
> >>> corresponding evtchn in conjunction with an existing ring. In order to
> >>> use them, a mock buffered ioreq should be created and transmitted, with
> >>> the only meaningful field being the ioreq type.
> >>>
> >>>> I certainly think it would be better if you could write the new
> >>>> vm_event
> >>>> interface without having to spend a lot of effort supporting modes
> >>>> that
> >>>> you think nobody uses.
> >>>>
> >>>> On the other hand, getting into the habit of breaking stuff, even for
> >>>> people we don't know about, will be a hindrance to community growth;
> >>>> a
> >>>> commitment to keeping it working will be a benefit to growth.
> >>>>
> >>>> But of course, we haven't declared the vm_event interface 'supported'
> >>>> (it's not even mentioned in the SUPPORT.md document yet).
> >>>>
> >>>> Just for the sake of discussion, would it be possible / reasonble,
> >>>> for
> >>>> instance, to create a new interface, vm_events2, instead?  Then you
> >>>> could write it to share the ioreq interface without having legacy
> >>>> baggage you're not using; we could deprecate and eventually remove
> >>>> vm_events1, and if anyone shouts, we can put it back.
> >>>>
> >>>> Thoughts?
> >>>>
> >>>>   -George
> >>> Yes, it's possible and it will GREATLY simplify the implementation. I
> >>> just have to make sure the interfaces are mutually exclusive.
> >>
> >> I'm for removing features from the vm_event interface that are no
> >> longer in use, especially if they block more advantageous changes like
> >> this one. We don't know what the use-case was for async events nor
> >> have seen anyone even mention them since I've been working with Xen.
> >> Creating a new interface, as mentioned above, would make sense if
> >> there was a disagreement with retiring this feature. I don't think
> >> that's the case. I certainly would prefer not having to maintain two
> >> separate interfaces going forward without a clear justification and
> >> documented use-case explaining why we keep the old interface around.
> >
> > AFAICT, the async model is broken conceptually as well, so it makes no
> > sense. It would make sense, IMHO, if it would be lossy (i.e. we just
> > write in the ring buffer, if somebody manages to "catch" an event while
> > it flies by then so be it, if not it will be overwritten). If it would
> > have been truly lossy, I'd see a use-case for it, for gathering
> > statistics maybe.
> >
> > However, as the code is now, the VCPUs are not paused only if there's
> > still space in the ring buffer. If there's no more space in the ring
> > buffer, the VCPU trying to put an event in still gets paused by the
> > vm_event logic, which means that these events are only "half-async".
> >
> > FWIW, I'm with Tamas on this one: if nobody cares about async events /
> > comes forward with valid use cases or applications using them, I see no
> > reason why we should have this extra code to maintain, find bugs in, and
> > trip over other components (migration, in Andrew's example).
>
> The whole idea would be that we *don't* maintain "v1", unless someone
> shows up and says they want to use it.
>
> To let you know where I'm coming from:  It's actually fairly uncommon
> for people using something to participate in the community that
> generates it.  For example, a few years ago I spent some time with a
> GCoC student making libxl bindings for Golang.  In spite of the fact
> that they're still at 'early prototype' stage, apparently there's a
> community of people that have picked those up and are using them.
>
> Such people often:
> * Start using without getting involved with the community
> * Don't read the mailing list to hear what's going to happen
> * Won't complain if something breaks, but will just go find a different
> platform.
>
> If you have something that already works, switching to something else is
> a huge effort; if what you used to have is broken and you have to switch
> everything over anyway, then you're much more likely to try something else.
>
> There are many reason for the success of both Linux and Linux
> containers, but one major one is the fairly fanatical commitment they
> have to backwards compatibility and avoiding breaking userspace
> applications.  By contrast, it seems to me that the xend -> xl
> transition, while necessary, has been an inflection point that caused a
> lot of people to consider moving away from Xen (since a lot of their old
> tooling stopped working).
>
> So; at the moment, we don't know if anyone's using the async
> functionality or not.  We have three choices:
>
> A. Try to implement both sync / async in the existing interface.
> B. Re-write the current interface to be sync-only.
> C. Create a new interface ('v2') from scratch, deleting 'v1' when 'v2'
> is ready.
>
> Option A *probaby* keeps silent users.  But, Petre spends a lot of time
> designing around and debugging something that he doesn't use or care
> about, and that he's not sure *anyone* uses.  Not great.
>
> Option B is more efficient for Petre.  But if there are users, any ones
> that don't complain we lose immediately.  If any users do complain, then
> again we have the choice: Try to retrofit the async functionality, or
> tell them we're sorry, they'll have to port their thing to v2 or go away.
>
> In the case of option C, we can leave 'v1' there as long as we want.  If
> we delete it, and people complain, it won't be terribly difficult to
> reinstate 'v1' without affecting 'v2'.
>
> I mean, a part of me completely agrees with you: get rid of cruft
> nobody's using; if you want to depend on something someone else is
> developing, at least show up and get involved in the community, or don't
> complain when it goes away.
>
> But another part of me is just worried the long-term effects of this
> kind of behavior.
>
> Anyway, I won't insist on having a v2 if nobody else says anything; I
> just wanted to make sure the "invisible" effects got proper consideration.

I agree with the not-break-things for convenience only for stable
interfaces. This is not a stable interface however and never was -
it's experimental at this point. So we should treat it as such and not
keep dead code around just to make it appear to be a stable interface.

Tamas

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.