perf scripts python: Add command execution for gecko script

This will enable the execution of gecko.py script using record and
report commands in 'perf script'.  And this will be also reflected at
"perf script -l" command.

For Example:
    perf script record gecko
    perf script report gecko

Committer notes:

As discussed on the perf tools office hours, I made -F 99 the default
for the record script and removed the double -- on the report script so
that the existing 'perf script' protocol for the combined operation:

    # perf script gecko

Works, i.e. the record script pipes its stdout into the stdin of the
report script, basically:

  /bin/sh /usr/libexec/perf-core/scripts/python/bin/gecko-record -F 99 -g -a -q -o - | \
  /bin/sh /usr/libexec/perf-core/scripts/python/bin/gecko-report -i -

Testing it:

The resulting JSON file needs to be uploaded to
https://profiler.firefox.com, Anup already has code to start a local
http server on the trace_begin handler of the gecko python script, start
firefox and feed it the JSON.

The example below only collects sample for the specified workload, so
that we don't produce thousands of lines, to collect system wide
samples, use instead:

  # perf script gecko -a sleep 0.5

  # nohup perf script gecko sleep 0.5
  {
    "meta": {
      "interval": 1,
      "processType": 0,
      "product": "x86_64 GNU/Linux",
      "stackwalk": 1,
      "debug": 0,
      "gcpoison": 0,
      "asyncstack": 1,
      "startTime": 274601692.636,
      "shutdownTime": null,
      "version": 24,
      "presymbolicated": true,
      "categories": [
        {
          "name": "User",
          "color": "yellow",
          "subcategories": [
            "Other"
          ]
        },
        {
          "name": "Kernel",
          "color": "orange",
          "subcategories": [
            "Other"
          ]
        }
      ],
      "markerSchema": []
    },
    "libs": [],
    "threads": [
      {
        "tid": 3344498,
        "pid": 3344498,
        "name": "sleep",
        "markers": {
          "schema": {
            "name": 0,
            "startTime": 1,
            "endTime": 2,
            "phase": 3,
            "category": 4,
            "data": 5
          },
          "data": []
        },
        "samples": {
          "schema": {
            "stack": 0,
            "time": 1,
            "responsiveness": 2
          },
          "data": [
            [
              21,
              274601692.636,
              0
            ],
            [
              23,
              274601692.641,
              0
            ],
            [
              29,
              274601692.643,
              0
            ],
            [
              42,
              274601692.648,
              0
            ]
          ]
        },
        "frameTable": {
          "schema": {
            "location": 0,
            "relevantForJS": 1,
            "innerWindowID": 2,
            "implementation": 3,
            "optimizations": 4,
            "line": 5,
            "column": 6,
            "category": 7,
            "subcategory": 8
          },
          "data": [
            [
              0,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              1,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              2,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              3,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              4,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              5,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              6,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              7,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              8,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              9,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              10,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              11,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              12,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              13,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              14,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              15,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              16,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              17,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              18,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              19,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              20,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              21,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              22,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              23,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              24,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              25,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              26,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              27,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              28,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              29,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              30,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              31,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              32,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              33,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              34,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              35,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              36,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              37,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ],
            [
              38,
              false,
              0,
              null,
              null,
              null,
              null,
              1,
              null
            ]
          ]
        },
        "stackTable": {
          "schema": {
            "prefix": 0,
            "frame": 1
          },
          "data": [
            [
              null,
              0
            ],
            [
              0,
              1
            ],
            [
              1,
              2
            ],
            [
              2,
              3
            ],
            [
              3,
              4
            ],
            [
              4,
              5
            ],
            [
              5,
              6
            ],
            [
              6,
              7
            ],
            [
              7,
              8
            ],
            [
              8,
              9
            ],
            [
              9,
              10
            ],
            [
              10,
              11
            ],
            [
              11,
              12
            ],
            [
              12,
              13
            ],
            [
              13,
              14
            ],
            [
              14,
              15
            ],
            [
              15,
              16
            ],
            [
              16,
              17
            ],
            [
              17,
              18
            ],
            [
              18,
              19
            ],
            [
              19,
              20
            ],
            [
              20,
              21
            ],
            [
              20,
              22
            ],
            [
              22,
              23
            ],
            [
              11,
              24
            ],
            [
              24,
              25
            ],
            [
              25,
              26
            ],
            [
              26,
              27
            ],
            [
              27,
              28
            ],
            [
              28,
              29
            ],
            [
              9,
              11
            ],
            [
              30,
              24
            ],
            [
              31,
              25
            ],
            [
              32,
              30
            ],
            [
              33,
              31
            ],
            [
              34,
              32
            ],
            [
              35,
              29
            ],
            [
              36,
              33
            ],
            [
              37,
              34
            ],
            [
              38,
              35
            ],
            [
              39,
              36
            ],
            [
              40,
              37
            ],
            [
              41,
              38
            ]
          ]
        },
        "stringTable": [
          "__func__.0 (in [kernel.kallsyms].rodata)",
          "perf_trace_ext4_fc_track_inode (in [kernel.kallsyms])",
          "perf_trace_ext4_es_insert_delayed_block (in [kernel.kallsyms])",
          "ext4_es_show_pblock (in [kernel.kallsyms])",
          "perf_trace_ext4_ext_rm_leaf (in [kernel.kallsyms])",
          "devcgroup_access_write (in [kernel.kallsyms])",
          "devcgroup_update_access (in [kernel.kallsyms])",
          "propagate_exception (in [kernel.kallsyms])",
          "revalidate_active_exceptions (in [kernel.kallsyms])",
          "perf_trace_ext4_fc_commit_stop (in [kernel.kallsyms])",
          "perf_fetch_caller_regs (in [kernel.kallsyms])",
          "khugepaged (in [kernel.kallsyms])",
          "khugepaged_wait_work (in [kernel.kallsyms])",
          "freezable_schedule_timeout (in [kernel.kallsyms])",
          "freezer_count (in [kernel.kallsyms])",
          "try_to_freeze (in [kernel.kallsyms])",
          "try_to_freeze_unsafe (in [kernel.kallsyms])",
          "split_huge_pages_write (in [kernel.kallsyms])",
          "migrate_pages (in [kernel.kallsyms])",
          "unmap_and_move (in [kernel.kallsyms])",
          "__unmap_and_move (in [kernel.kallsyms])",
          "collect_events (in [kernel.kallsyms])",
          "uncore_down_prepare (in [kernel.kallsyms])",
          "perf_iommu_read (in [kernel.kallsyms])",
          "khugepaged_do_scan (in [kernel.kallsyms])",
          "khugepaged_scan_mm_slot (in [kernel.kallsyms])",
          "khugepaged_scan_file (in [kernel.kallsyms])",
          "need_resched (in [kernel.kallsyms])",
          "get_current (in [kernel.kallsyms])",
          "move_to_new_page (in [kernel.kallsyms])",
          "khugepaged_scan_pmd (in [kernel.kallsyms])",
          "trace_mm_khugepaged_scan_pmd (in [kernel.kallsyms])",
          "migrate_huge_page_move_mapping (in [kernel.kallsyms])",
          "do_huge_pmd_numa_page (in [kernel.kallsyms])",
          "pmd_pfn (in [kernel.kallsyms])",
          "protnone_mask (in [kernel.kallsyms])",
          "__pte_needs_invert (in [kernel.kallsyms])",
          "reclaim_high (in [kernel.kallsyms])",
          "memcg_memory_event (in [kernel.kallsyms])"
        ],
        "registerTime": 0,
        "unregisterTime": null,
        "processType": "default"
      }
    ],
    "processes": [],
    "pausedRanges": []
  }
  #

Signed-off-by: Anup Sharma <anupnewsmail@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/cbf03cda175ea3dd2c6cd87bd3f12d803446cb95.1689961706.git.anupnewsmail@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Anup Sharma 2023-07-21 23:27:46 +05:30 committed by Arnaldo Carvalho de Melo
parent 2d889c6af1
commit f9f72b2ab7
2 changed files with 5 additions and 0 deletions

View File

@ -0,0 +1,2 @@
#!/bin/bash
perf record -F 99 -g "$@"

View File

@ -0,0 +1,3 @@
#!/bin/bash
# description: create firefox gecko profile json format from perf.data
perf script "$@" -s "$PERF_EXEC_PATH"/scripts/python/gecko.py