I would guess the performance increase would be well under 1%.  But it's a
fairly simple change.  The biggest performance increase I think would come
from avoiding a PCRE match, to see if the specific debug tag was enabled.
For some TSDebug calls, there can be many arguments to push, and perhaps a
fair amount of calculation to generate the correct arguments.

On Wed, Jun 12, 2019 at 12:21 PM Bryan Call <bc...@apache.org> wrote:

> I am surprised you are seeing this as a performance issue.  Looking at the
> code it looks like 1 function call and a couple pointer dereferences.
>
> If you wanted to speed up TSDebug and make the code harder to maintain you
> could create a structure that looks like like DiagsConfig in ts.h and then
> set a pointer used in the API to look at the gobal DiagsConfig.  Then you
> could have a macro that would do basically what on() does.  This would
> bypass a function call and would have 1 more pointer dereference than your
> example.
>
> -Bryan
>
>
> > On Jun 12, 2019, at 10:00 AM, Walt Karas <wka...@verizonmedia.com.INVALID>
> wrote:
> >
> > What do you mean by "exposing diags"?
> >
> > On Wed, Jun 12, 2019 at 11:50 AM Bryan Call <bc...@apache.org> wrote:
> >
> >> I would rather see TSDebug be optimized and exposing diags instead of
> >> creating a new type of debug.
> >>
> >> -Bryan
> >>
> >>
> >>> On Jun 12, 2019, at 9:44 AM, Walt Karas <wka...@verizonmedia.com
> .INVALID>
> >> wrote:
> >>>
> >>> I don't believe so.  The issue I'm trying to address is that there is
> >> still
> >>> significant execution time overhead for debug output calls when
> >>> proxy.config.diags.debug.enabled is 0.  This change would make the
> >>> execution time overhead negligible (if TSFastDbg is used or TSDebug is
> >>> changed to be like the proposed TSFastDbg).  Another way of putting it
> >> is,
> >>> I want to clean up the existing TSDEBUG alternative to TSDebug.
> >>>
> >>> On Wed, Jun 12, 2019 at 11:31 AM Bryan Call <bc...@apache.org> wrote:
> >>>
> >>>> How would this be controlled on the command line when running
> >>>> trafic_server -T?
> >>>>
> >>>> It looks like it is a departure from how debug tags and controlled
> now.
> >>>>
> >>>> -Bryan
> >>>>
> >>>>
> >>>>> On Jun 11, 2019, at 1:21 PM, Walt Karas <wka...@verizonmedia.com
> >> .INVALID>
> >>>> wrote:
> >>>>>
> >>>>> Any +1's for simply replacing TSDebug with the proposed TSFastDbg ?
> >>>>>
> >>>>> On Mon, Apr 8, 2019 at 6:20 PM Leif Hedstrom <zw...@apache.org>
> wrote:
> >>>>>
> >>>>>>
> >>>>>>
> >>>>>> On Apr 4, 2019, at 8:05 AM, Walt Karas <wka...@verizonmedia.com
> >>>> .INVALID>
> >>>>>> wrote:
> >>>>>>
> >>>>>> Because senility. probably "on" should be a non-pointer of type
> const
> >>>>>> volatile char, and InkAPI in the core can just keep a pointer to the
> >>>> whole
> >>>>>> structure for updating.
> >>>>>>
> >>>>>> But I'm leaning more to fixing up the capability that already kinda
> >>>> there.
> >>>>>> Which is optimizimg only for the case when all debug output is
> >> disabled.
> >>>>>> Especially since maybe zwoop would be on my side for once :o) .
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> My bad, whatever Walt said, I take the opposite stance.
> >>>>>>
> >>>>>> — leif
> >>>>>>
> >>>>>> P.s
> >>>>>> J/K!
> >>>>>>
> >>>>>>
> >>>>>> On Thu, Apr 4, 2019 at 8:51 AM Alan Carroll
> >>>>>> <solidwallofc...@verizonmedia.com.invalid> wrote:
> >>>>>>
> >>>>>> This could enable a significant speed up for debug tags. One point
> is
> >>>> that
> >>>>>> when the debug tag string is set, at that point the debug objects
> >> could
> >>>> be
> >>>>>> updated to the correct state according to the debug tag string,
> rather
> >>>> than
> >>>>>> checking it every time a debug message is logged.
> >>>>>>
> >>>>>> I have to ask, why is there a pointer to the enable flag, instead of
> >>>> just
> >>>>>> the enable flag? Your logic doesn't even check that flag, it checks
> >>>> whether
> >>>>>> the pointer is null.
> >>>>>>
> >>>>>> On Wed, Apr 3, 2019 at 11:52 AM Leif Hedstrom <zw...@apache.org>
> >> wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On Apr 3, 2019, at 10:47 AM, Walt Karas <wka...@verizonmedia.com
> >>>>>>
> >>>>>> .INVALID>
> >>>>>>
> >>>>>> wrote:
> >>>>>>
> >>>>>>
> >>>>>> It looks like the TS API already has less granular version of this:
> >>>>>>
> >>>>>> extern int diags_on_for_plugins;
> >>>>>>
> >>>>>> #define TSDEBUG             \
> >>>>>>
> >>>>>> if (diags_on_for_plugins) \
> >>>>>>
> >>>>>> TSDebug
> >>>>>>
> >>>>>>
> >>>>>> A problem with this is if you write:
> >>>>>>
> >>>>>>
> >>>>>> if (flag)
> >>>>>>
> >>>>>> TSDEBUG(yadayada);
> >>>>>>
> >>>>>> else
> >>>>>>
> >>>>>> do_something();
> >>>>>>
> >>>>>>
> >>>>>> then the else will be associated with the if hidden in the macro.
> I'd
> >>>>>> prefer to change to something like:
> >>>>>>
> >>>>>>
> >>>>>> extern const volatile char TS_detail_dbg_output_enabled;
> >>>>>>
> >>>>>>
> >>>>>> #define TSFastDbg(_TAG, ...) \
> >>>>>> do { \
> >>>>>> if (TS_detail_dbg_output_enabled) \
> >>>>>> TSDebug(_TAG, __VA_ARGS__); \
> >>>>>>
> >>>>>> } while(0)
> >>>>>>
> >>>>>>
> >>>>>> Yeh, that kinda sounds like a bug, doesn’t it?
> >>>>>>
> >>>>>>
> >>>>>> The negative is that we'd only see the benefit when all debug output
> >>>>>>
> >>>>>> was
> >>>>>>
> >>>>>> disabled.  But, in any case, that is the main benefit, to avoid
> >> impacts
> >>>>>> during normal operation.
> >>>>>>
> >>>>>>
> >>>>>> Right, we should always optimize for the common cases, obviously.
> When
> >>>>>> there’s a decision to make, where you can either make it “equally”
> >>>>>> expensive always, or more expensive in a rare case, but cheaper in
> the
> >>>>>> common case, we should likely chose the latter.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Looking in src/tscore/Diags.cc, it looks like the debug enable flag
> is
> >>>>>>
> >>>>>> only
> >>>>>>
> >>>>>> set at startup time.  So we wouldn't be able to enable TSFastDbg
> using
> >>>>>> traffic_cntl without adding complexity.
> >>>>>>
> >>>>>> On Tue, Apr 2, 2019 at 5:48 PM Walt Karas <wka...@verizonmedia.com>
> >>>>>>
> >>>>>> wrote:
> >>>>>>
> >>>>>>
> >>>>>> Add this new structure to apidefs.h:
> >>>>>>
> >>>>>> typedef struct TSFastDbgCntl_
> >>>>>> {
> >>>>>> const char * const tag; // nul-terminated string
> >>>>>> const volatile char * const on; // pointer to 1-byte flag
> >>>>>> }
> >>>>>> TSFastDbgCntl;
> >>>>>>
> >>>>>> Add this new API function, that returns a pointer to an instance of
> >>>>>>
> >>>>>> the
> >>>>>>
> >>>>>> above structure:
> >>>>>>
> >>>>>> TSFastDbgCntl * TSCreateFastDbgCntl(const char *tag);
> >>>>>>
> >>>>>> Add this macro, which would be used in place of direct use of
> >>>>>>
> >>>>>> TSDebug().
> >>>>>>
> >>>>>>
> >>>>>> #define TSFastDbg(_FD_CNTL, ...) \
> >>>>>> do { \
> >>>>>> if ((_FD_CNTL)->on) \
> >>>>>> TSDebug((_FD_CNTL)->tag, __VA_ARGS__); \
> >>>>>> } while(0)
> >>>>>>
> >>>>>> The first parameter to TSFastDbg() is a pointer that was returned by
> >>>>>> TSCreateFastDbgCntl().  The remaining parameters are printf
> parameters
> >>>>>> (format string and values matching format specifiers).  The core
> would
> >>>>>>
> >>>>>> be
> >>>>>>
> >>>>>> responsible for changing the value of the 'on' fields in the
> >>>>>>
> >>>>>> TSFastDbgCntl
> >>>>>>
> >>>>>> instances.  For direct calls to TSDebug(), even if the tag is
> >>>>>>
> >>>>>> disabled,
> >>>>>>
> >>>>>> all
> >>>>>>
> >>>>>> the parameters have to be prepared and pushed onto the stack.  As
> was
> >>>>>> discussed in IRC, you have to feel guilty about doing converting a
> >>>>>> string_view to a string and outputting it with c_str().  Because the
> >>>>>>
> >>>>>> code
> >>>>>>
> >>>>>> to do this will be executed even if the debug tag is disabled.
> >>>>>> Furthermore, for each call to TSDebug, it's necessary to do an
> >>>>>>
> >>>>>> associative
> >>>>>>
> >>>>>> lookup on the tag string to determine that output for the tag is
> >>>>>>
> >>>>>> disabled.
> >>>>>>
> >>>>>>
> >>>>>> We would want to put equivalent capabilities in Diags.h in the core
> >>>>>>
> >>>>>> for
> >>>>>>
> >>>>>> debug output.  The implementation is non-trivial, but I think it
> would
> >>>>>>
> >>>>>> take
> >>>>>>
> >>>>>> at most a week including the Au test additions.
> >>>>>>
> >>>>>> I looked at making TSFastDbg() an inline function rather than a
> macro:
> >>>>>> https://godbolt.org/z/IfVbBk
> >>>>>> The opitimization works well if you compile the code with the inline
> >>>>>> function as C, but the optimization is poor if you compile it as
> C++.
> >>>>>>
> >>>>>> This
> >>>>>>
> >>>>>> difference exists for both gcc and clang.  It's weird.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>
> >>>>
> >>
> >>
>
>

Reply via email to