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.

> 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).

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