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>