On Tue, Feb 5, 2019 at 11:45 AM Dmitry Stogov <dmi...@zend.com> wrote:

>
>
> On 2/5/19 12:40 PM, Benjamin Eberlei wrote:
> >
> >
> > On Tue, Feb 5, 2019 at 7:46 AM Dmitry Stogov <dmi...@zend.com
> > <mailto:dmi...@zend.com>> wrote:
> >
> >
> >
> >     On 2/5/19 1:48 AM, Benjamin Eberlei wrote:
> >      >
> >      >
> >      > On Mon, Feb 4, 2019 at 10:29 PM Benjamin Eberlei
> >     <kont...@beberlei.de <mailto:kont...@beberlei.de>
> >      > <mailto:kont...@beberlei.de <mailto:kont...@beberlei.de>>> wrote:
> >      >
> >      >
> >      >
> >      >     On Thu, Jan 31, 2019 at 10:44 AM Dmitry Stogov
> >     <dmi...@zend.com <mailto:dmi...@zend.com>
> >      >     <mailto:dmi...@zend.com <mailto:dmi...@zend.com>>> wrote:
> >      >
> >      >         Hi Internals,
> >      >
> >      >
> >      >         I'm glad to finally propose including JIT into PHP.
> >      >
> >      >
> >      > https://wiki.php.net/rfc/jit
> >      >
> >      >
> >      >         In the current state it may be included both into PHP-8,
> >     where
> >      >         we are going to continue active improvement, and into
> >     PHP-7.4,
> >      >         as an experimental feature.
> >      >
> >      >
> >      >     Can you give some information on if there are pre-conditions
> that
> >      >     must hold for a function to be jitted, or quit conditions
> >     that force
> >      >     the JIT to be reverted for a function?
> >
> >     -dopcache.jit=1245 will lead to JIT only functions with @jit
> >     doc-comment
> >     tag. It's possible to extend this manual control.
> >
> >
> > @jit works if I have full control over my code-base, but whenever I use
> > libraries/frameworks this kind of configuration is too static, and puts
> > a burden on open-source maintainers to figure out what they want to jit
> > or not for users.
> >
> > This option will not be very useful from a distributed maintenance
> > perspective, especially if you don't know if users pick 4 or 3, this is
> > too much configuration details/micro-management in my opinion,
> > especially given your argument that JIT is supposed to be as transparent
> > and behind the scenes as possible for users.
> >
> > In my opinion 4 should not be available to users.
>
> In some cases it may help (similar to "inline" in C).
> For better performance, I would recomend "hot counters trigger" - 3 or
> everything - 0.
>
> >
> >
> >      >     In addition, it would be
> >      >     helpful for testing if there was a way to find out if a
> >     function was
> >      >     jitted, maybe through ReflectionMethod/Function or
> >      >     opcache_get_status() ?
> >
> >     yes. This makes sense.
> >
> >      >
> >      > And as a follow up, the JIT seems to affect zend_execute_ex and
> >      > zend_execute_internal based profiling (tested with
> >     tideways_xhprof) in a
> >      > way that all Jitted functions are not called through those two
> hooks
> >      > anymore, and don't appear in profiling data anymore. Is that a
> >     correct
> >      > description? The number of parent=>child call entries drops from
> >     88 to
> >      > 12 in my sample code when jit is activated.
> >      >
> >      > Is that a desired side-effect?
> >
> >     Yes. This is, at least expected.
> >     PHP profilers/debuggers may disable JIT and opcache for particular
> >     request, setting "opcache.enable=0" in RINIT.
> >
> >
> > This may be acceptable for development profilers, but it is not for
> > production profiling such as Blackfire and Tideways. I see that
> > overwriting internal function pointers still works for hooks, so that
> > doesn't need improvement, but PHP extensions need a way to control
> > zend_execute_ex behavior, or get an alternative hook for jit based
> > execution.
>
> JIT doesn't make a lot of sense if it doesn't optimize the overhead of
> interpretation (nested calls to execute_ex, etc). It's clear, that it's
> more difficult to debug optimized native code. Most implementations
> fallback to interpretation when need debugging. Profiling of optimized
> code is possible, but requires additional hooks.
>

I understand, but its not about preventing execute_ex for all calls, just
for the 50ish that I am interested in, high level framework functions that
are probably not efficently Jitted anyways.

For Tideways as production profiler, I am obviously interested in users
having great performance, but our users trust us to instrument what is
necessary to find out what might be wrong.


> > For Xhprof style profilers, a hook that gets the class + function name
> > alone would be enough.
> >
> > For tracing profilers based on a whitelist of a few instrumented
> > functions like tideways, NewRelic and probably all other APM vendor
> > extensions, there needs to be a hook to selectively decide "don't JIT
> > this function", that can be hooked into from 0 to many extensions.
> > Example, Tideways hooks into the userland function Mage::logException(),
> > to detect that Magento has thrown an exception that leads to a 500 page
> > being rendered. It should be possible to make sure this function never
> > gets jitted, so that I see its execution in zend_execute_ex.
>
> It's easily possible to disable JIT-ing by implementing @nojit (it's
> pity, we didn't get attributes).
>

Sorry, but I can't add @nojit or @jit to third party frameworks or
libraries. And this is what most Profiling/APM extensions are explicitly
hooking into. A third party extension must control this somehow, without
users having to have to change their code at all.

ZEND_API extern int (*opcache_jit_accept_handler)(zend_string *class_name,
zend_string *function_name);

Then i can overwrite it in my own extension:

int tideways_jit_accept_handler(zend_string *class_name, zend_string
*function_name) {
     if (zend_hash_key_exists(TRG(callbacks), class_name)) {
          return DENY;
     }
     if (!class_name && zend_hash_key_exists(TRG(callbacks),
function_name)) {
          return DENY;
     }

     return original_jit_accept_handler(class_name, function_name);
}

Problem with this hook would be that it needed to be available in Zend/ and
not in ext-opcache so i can trust this global variable to exist in every
compile such as zend_execute_ex.


>
> Thanks. Dmitry.
>
> >
> >
> >     In addition, JIT-ed functions now may be tracked by Linux perf
> >     (oprofile
> >     and Intel VTune).
> >
> >     $ perf record php -d opcache.huge_code_pages=0 -d
> >     opcache.jit_debug=0x10
> >     bench.php
> >     $ perf report
> >
> >
> > I think you overestimate PHP users savyness in Linux level profiling,
> > maybe 1 in 100 knows how to use perf. In addition many PHP users don't
> > have root on their servers (managed). And within Docker you don't even
> > get there to start perfing. Profilers that put user experience first
> > must be PHP extensions, so we need to make sure the basic level of
> > hooking is possible even though we have a JIT.
> >
> >
> >     Thanks. Dmitry.
> >
> >
> >
> >      >
> >      >
> >      >
> >      >         Thanks. Dmitry.
> >      >
> >
>

Reply via email to