On Thu, Apr 16, 2009 at 4:07 PM, Peter Tribble <peter.trib...@gmail.com> wrote:
> On Tue, Apr 7, 2009 at 8:25 PM, Jason King <ja...@ansipunx.net> wrote:
>> To get around the hurdle of all kstats being effectively private,
>> which in turn makes it difficult to effectively build any sort of
>> tools that use them,
>
> That hasn't stopped plenty of tools being developed, though.

Yes, but based on the discussion here, even though there's lots of
stuff already in ON that use kstats directly, even though there are
unbundled products that use kstats sold by Sun, adding another one
will apparently not be allowed without getting something like this
pushed through unless it's done by someone with a Sun badge.

Regardless of the apparent double standard (and it is -- if perfmib
can't use them, then vmstat, iostat, fsstat should't be able to use
them either), it's probably useful enough in its own right.

>
>> I'm proposing adding stability attributes to
>> kstats, similar to how dtrace providers have stability attributes.  (I
>> believe this was originally suggested by Dan Price, though I'd have to
>> look -- the point is I don't want to falsely take credit for the
>> idea).   The immediate need is as a prerequisite for the SNMP
>> performance MIB, so that it can be done right.
>>
>> I'd like to throw out a proposed design for discussion (see below).
>> If a consensus can be reached, then I'd like to create an ARC case for
>> submission.  I'm not sure it's big enough to warrant it's own project
>> (though if others disagree, I'm fine with that as well).
>>
>> Stability attributes:
>>
>> The thinking is unless there's a good reason to diverge, for
>> consistency (and sanity of someone trying to figure out what to use),
>> I think keeping it analogous to the dtrace attributes makes the most
>> sense:
>>
>> typedef uint8_t kstat_stability_t;
>
> Why a new type?
>
>> KSTAT_STABILITY_INTERNAL           internal to kstat system
>> KSTAT_STABILITY_PRIVATE             private to ON, the default for all kstats
>> KSTAT_STABILITY_OBSOLETE         scheduled for removal
>> KSTAT_STABILITY_EXTERNAL          maintained by a 3rd party
>> KSTAT_STABILITY_UNSTABLE          new or rapidly changing
>> KSTAT_STABILITY_EVOLVING          less rapidly changing
>> KSTAT_STABILITY_STABLE               mature interface
>> KSTAT_STABILITY_STANDARD         industry standard
>> KSTAT_STABILITY_MAX                    maximum valid stability
>
> That's a lot. About 7 or 8 too many.
>
> At most it's a binary choice: these are safe to use, or they aren't.
> I'm not sure I
> see utility in finer shades of grey.

It's trying to match what dtrace has done for provider stability,
though it sounds like it'd be more useful to match the current
standards for other interfaces so there's more detail than 'this will
change' or 'this will never change'.  Basically to be able to indicate
when it _could_ change.


>
> The classification is really two-dimensional: is the name/existence of the 
> kstat
> stable; and then whether the data it exports can be relied on.
>
> (And, as someone who writes kstat consumers, I would simply ignore the
> stability levels anyway. I care far more about the data that's contained in 
> the
> kstats.)
>
>> Kernel Interfaces:
>>
>> int kstat_set_stability(const char *ks_module, const char *ks_name,
>> kstat_stability_t stability);
>> Desc: set the kstat to a given stability level
>> Returns: 0 - success
>>            EINVAL - stability level isn't valid
>>            ENOENT - kstat doesn't exist
>
> Why a separate call? Isn't it possible to extend the bit-field of possible
> flags?
>
> (That assumes that the stability is described as KSTAT_FLAG_STABLE,
> which is either set or not. Doing multiple stability levels this way
> gets a little
> harder...)
>
>> ??: should this be mutable, or should it be allowed to only be set
>> once, and return an error from there on out?
>
> If you were going to have a separate call, then having it between kstat_create
> and kstat_install would be necessary. In other words, kstat_set_stability 
> would
> fail unless KSTAT_FLAG_INVALID were set.
>
>> int kstat_get_stability(const char *ks_module, const char *ks_name,
>> kstat_stability_t *stability);
>> Returns: 0 - stability value in stability.  If the stability value was
>> not explicitly set, *stability contains KSTAT_STABILITY_PRIVATE.
>>           ENOENT - kstat does not exist.
>>
>> User interfaces:
>>
>> int kstat_get_stability(kstat_ctl_t *kc, const char *ks_module, const
>> char *ks_name, kstat_stability_t *stability)
>> Similar to kernel interface
>> Returns 0 on success, -1 on failure.  On failure, errno is set to:
>>        ENOENT - kstat does not exist.
>
> Yuk. Why a separate call? Makes life far more complicated, as you have to
> catch kstats going, and really you need to check that the kstat you're talking
> to is the same one you thought you were talking to. In fact, rather than using
> module/name (you need instance as well) it might be easier to simply use
> the kstat or its KID as the argument to identify a kstat uniquely.

AFAIK, the current kstat interfaces are effectively frozen.


> Another possible design would be to do away with the separate call,
> and simply appropriate the (currently unused)ks_resv field in the kstat
> structure to hold the stability data.
>
>> ??: How should the perl module be updated.
>
> Well, I would just have (optionally, so the output format doesn't
> change by default) the stability level printed out just like the class
> is. That's what I would do for JKstat, anyway.
>
> --
> -Peter Tribble
> http://www.petertribble.co.uk/ - http://ptribble.blogspot.com/
>
_______________________________________________
perf-discuss mailing list
perf-discuss@opensolaris.org

Reply via email to