• Benedikt Meurer's avatar
    [tracing] Improve tracing signals for compilation/optimization. · a2af7e11
    Benedikt Meurer authored
    This adds OBJECT/SNAPSHOT trace events for Script and SharedFunctionInfo
    objects, logging their creation with appropriate information to make
    sense of them.
    
    Based on that we introduces five flow events to model the optimized
    compilation via tracing in the "disabled-by-default-v8.compile" category:
    
      - "v8.optimizingCompile.start" logs the creation of the
        PipelineCompilationJob (for TurboFan JavaScript optimization)
        with the "function" argument referring to the trace event
        object created for the SharedFunctionInfo.
      - "v8.optimzingCompile.prepare" logs the preparation of the
        PipelineCompilationJob on the main thread, also carrying the
        "function" argument. This connects the flow event to the actual
        tracing duration event associated with the preparation phases.
      - "v8.optimizingCompile.execute" logs the (usually concurrent)
        optimization of the TurboFan graph (again with "function").
      - "v8.optimizingCompile.finalize" logs the main thread phase which
        finalizes the optimized code and eventually installs it (in case
        of success).
      - "v8.optimizingCompile.end" signals the end of the
        PipelineCompilationJob, which carries the "compilationInfo",
        that contains the interesting bits of the OptimizedCompilationInfo,
        specifically whether the compile was successfull and which functions
        were inlined for example.
    
    This also adds two instant events "V8.AbortOptimization" and
    "V8.RetryOptimization" in "disabled-by-default-v8.compile" category
    that are emitted when TurboFan cannot optimize a certain function.
    In case of "V8.RetryOptimization", TurboFan might be able to optimize
    it later, whereas "V8.AbortOptimization" permanently disables the
    optimization of a given function. The JSON representation of this is
    
    ```js
    {
      "pid": 256639,
      "tid": 256639,
      "ts": 6935411377801,
      "tts": 159116,
      "ph": "I",
      "cat": "disabled-by-default-v8.compile",
      "name": "V8.AbortOptimization",
      "dur": 0,
      "tdur": 0,
      "args": {
        "reason": "Function is too big to be optimized",
        "function": {
          "id_ref": "0x600000001",
          "scope": "v8::internal::SharedFunctionInfo"
        }
      }
    },
    ```
    
    where the "function" refers to a previously emitted SNAPSHOT for the
    function in question. In the trace viewer it will show up as instant
    event under "v8.optimizingCompile.prepare" in case of the relevant
    example where optimization is disabled due to reaching the bytecode
    limit (as in the JSON above), i.e. it'll look something like this
    
      https://i.paste.pics/aafc2de9df10ea8f5acc1a761d80f07b.png
    
    for the example highlighted in the recent blog post
    
      https://ponyfoo.com/articles/javascript-performance-pitfalls-v8
    
    that describes the optimization limit. The "v8.optimizingCompile.end"
    duration event will also carry this information as part of the
    "compilationInfo" object, but specifically for CI tools, etc. it might
    be a whole lot easier to just look for the "V8.AbortOptimization"
    instant event.
    
    Bug: v8:8598, v8:9039
    Tbr: ulan@chromium.org
    Doc: bit.ly/v8-tracing-signals
    Change-Id: Ic87ac336004690c65b6b15ad73bc6fbd4b5f12c4
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1511483
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Reviewed-by: 's avatarPeter Marshall <petermarshall@chromium.org>
    Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#60448}
    a2af7e11
traced-value.cc 4.99 KB