Skip to content

Commit 4484f18

Browse files
authored
Merge pull request #2542 from mchtech/add-perf-profiler-options
Add profiler options for perf collector
2 parents edc33af + f934f9c commit 4484f18

File tree

1 file changed

+122
-33
lines changed

1 file changed

+122
-33
lines changed

collector/perf_linux.go

Lines changed: 122 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,67 @@ const (
3737
var (
3838
perfCPUsFlag = kingpin.Flag("collector.perf.cpus", "List of CPUs from which perf metrics should be collected").Default("").String()
3939
perfTracepointFlag = kingpin.Flag("collector.perf.tracepoint", "perf tracepoint that should be collected").Strings()
40+
perfNoHwProfiler = kingpin.Flag("collector.perf.disable-hardware-profilers", "disable perf hardware profilers").Default("false").Bool()
41+
perfHwProfilerFlag = kingpin.Flag("collector.perf.hardware-profilers", "perf hardware profilers that should be collected").Strings()
42+
perfNoSwProfiler = kingpin.Flag("collector.perf.disable-software-profilers", "disable perf software profilers").Default("false").Bool()
43+
perfSwProfilerFlag = kingpin.Flag("collector.perf.software-profilers", "perf software profilers that should be collected").Strings()
44+
perfNoCaProfiler = kingpin.Flag("collector.perf.disable-cache-profilers", "disable perf cache profilers").Default("false").Bool()
45+
perfCaProfilerFlag = kingpin.Flag("collector.perf.cache-profilers", "perf cache profilers that should be collected").Strings()
4046
)
4147

4248
func init() {
4349
registerCollector(perfSubsystem, defaultDisabled, NewPerfCollector)
4450
}
4551

52+
var (
53+
perfHardwareProfilerMap = map[string]perf.HardwareProfilerType{
54+
"CpuCycles": perf.CpuCyclesProfiler,
55+
"CpuInstr": perf.CpuInstrProfiler,
56+
"CacheRef": perf.CacheRefProfiler,
57+
"CacheMisses": perf.CacheMissesProfiler,
58+
"BranchInstr": perf.BranchInstrProfiler,
59+
"BranchMisses": perf.BranchMissesProfiler,
60+
"StalledCyclesBackend": perf.StalledCyclesBackendProfiler,
61+
"StalledCyclesFrontend": perf.StalledCyclesFrontendProfiler,
62+
"RefCpuCycles": perf.RefCpuCyclesProfiler,
63+
// "BusCycles": perf.BusCyclesProfiler,
64+
}
65+
perfSoftwareProfilerMap = map[string]perf.SoftwareProfilerType{
66+
"PageFault": perf.PageFaultProfiler,
67+
"ContextSwitch": perf.ContextSwitchProfiler,
68+
"CpuMigration": perf.CpuMigrationProfiler,
69+
"MinorFault": perf.MinorFaultProfiler,
70+
"MajorFault": perf.MajorFaultProfiler,
71+
// "CpuClock": perf.CpuClockProfiler,
72+
// "TaskClock": perf.TaskClockProfiler,
73+
// "AlignFault": perf.AlignFaultProfiler,
74+
// "EmuFault": perf.EmuFaultProfiler,
75+
}
76+
perfCacheProfilerMap = map[string]perf.CacheProfilerType{
77+
"L1DataReadHit": perf.L1DataReadHitProfiler,
78+
"L1DataReadMiss": perf.L1DataReadMissProfiler,
79+
"L1DataWriteHit": perf.L1DataWriteHitProfiler,
80+
"L1InstrReadMiss": perf.L1InstrReadMissProfiler,
81+
"LLReadHit": perf.LLReadHitProfiler,
82+
"LLReadMiss": perf.LLReadMissProfiler,
83+
"LLWriteHit": perf.LLWriteHitProfiler,
84+
"LLWriteMiss": perf.LLWriteMissProfiler,
85+
"InstrTLBReadHit": perf.InstrTLBReadHitProfiler,
86+
"InstrTLBReadMiss": perf.InstrTLBReadMissProfiler,
87+
"BPUReadHit": perf.BPUReadHitProfiler,
88+
"BPUReadMiss": perf.BPUReadMissProfiler,
89+
// "L1InstrReadHit": perf.L1InstrReadHitProfiler,
90+
// "DataTLBReadHit": perf.DataTLBReadHitProfiler,
91+
// "DataTLBReadMiss": perf.DataTLBReadMissProfiler,
92+
// "DataTLBWriteHit": perf.DataTLBWriteHitProfiler,
93+
// "DataTLBWriteMiss": perf.DataTLBWriteMissProfiler,
94+
// "NodeCacheReadHit": perf.NodeCacheReadHitProfiler,
95+
// "NodeCacheReadMiss": perf.NodeCacheReadMissProfiler,
96+
// "NodeCacheWriteHit": perf.NodeCacheWriteHitProfiler,
97+
// "NodeCacheWriteMiss": perf.NodeCacheWriteMissProfiler,
98+
}
99+
)
100+
46101
// perfTracepointFlagToTracepoints returns the set of configured tracepoints.
47102
func perfTracepointFlagToTracepoints(tracepointsFlag []string) ([]*perfTracepoint, error) {
48103
tracepoints := make([]*perfTracepoint, len(tracepointsFlag))
@@ -282,48 +337,82 @@ func NewPerfCollector(logger log.Logger) (Collector, error) {
282337
collector.tracepointCollector = tracepointCollector
283338
}
284339

340+
// Configure perf profilers
341+
hardwareProfilers := perf.AllHardwareProfilers
342+
if *perfHwProfilerFlag != nil && len(*perfHwProfilerFlag) > 0 {
343+
// hardwareProfilers = 0
344+
for _, hf := range *perfHwProfilerFlag {
345+
if v, ok := perfHardwareProfilerMap[hf]; ok {
346+
hardwareProfilers |= v
347+
}
348+
}
349+
}
350+
softwareProfilers := perf.AllSoftwareProfilers
351+
if *perfSwProfilerFlag != nil && len(*perfSwProfilerFlag) > 0 {
352+
// softwareProfilers = 0
353+
for _, sf := range *perfSwProfilerFlag {
354+
if v, ok := perfSoftwareProfilerMap[sf]; ok {
355+
softwareProfilers |= v
356+
}
357+
}
358+
}
359+
cacheProfilers := perf.L1DataReadHitProfiler | perf.L1DataReadMissProfiler | perf.L1DataWriteHitProfiler | perf.L1InstrReadMissProfiler | perf.InstrTLBReadHitProfiler | perf.InstrTLBReadMissProfiler | perf.LLReadHitProfiler | perf.LLReadMissProfiler | perf.LLWriteHitProfiler | perf.LLWriteMissProfiler | perf.BPUReadHitProfiler | perf.BPUReadMissProfiler
360+
if *perfCaProfilerFlag != nil && len(*perfCaProfilerFlag) > 0 {
361+
cacheProfilers = 0
362+
for _, cf := range *perfCaProfilerFlag {
363+
if v, ok := perfCacheProfilerMap[cf]; ok {
364+
cacheProfilers |= v
365+
}
366+
}
367+
}
368+
285369
// Configure all profilers for the specified CPUs.
286370
for _, cpu := range cpus {
287371
// Use -1 to profile all processes on the CPU, see:
288372
// man perf_event_open
289-
hwProf, err := perf.NewHardwareProfiler(
290-
-1,
291-
cpu,
292-
perf.AllHardwareProfilers,
293-
)
294-
if err != nil && !hwProf.HasProfilers() {
295-
return nil, err
296-
}
297-
if err := hwProf.Start(); err != nil {
298-
return nil, err
373+
if !*perfNoHwProfiler {
374+
hwProf, err := perf.NewHardwareProfiler(
375+
-1,
376+
cpu,
377+
hardwareProfilers,
378+
)
379+
if err != nil && !hwProf.HasProfilers() {
380+
return nil, err
381+
}
382+
if err := hwProf.Start(); err != nil {
383+
return nil, err
384+
}
385+
collector.perfHwProfilers[cpu] = &hwProf
386+
collector.hwProfilerCPUMap[&hwProf] = cpu
299387
}
300-
collector.perfHwProfilers[cpu] = &hwProf
301-
collector.hwProfilerCPUMap[&hwProf] = cpu
302388

303-
swProf, err := perf.NewSoftwareProfiler(-1, cpu, perf.AllSoftwareProfilers)
304-
if err != nil && !swProf.HasProfilers() {
305-
return nil, err
306-
}
307-
if err := swProf.Start(); err != nil {
308-
return nil, err
389+
if !*perfNoSwProfiler {
390+
swProf, err := perf.NewSoftwareProfiler(-1, cpu, softwareProfilers)
391+
if err != nil && !swProf.HasProfilers() {
392+
return nil, err
393+
}
394+
if err := swProf.Start(); err != nil {
395+
return nil, err
396+
}
397+
collector.perfSwProfilers[cpu] = &swProf
398+
collector.swProfilerCPUMap[&swProf] = cpu
309399
}
310-
collector.perfSwProfilers[cpu] = &swProf
311-
collector.swProfilerCPUMap[&swProf] = cpu
312400

313-
cacheProfilers := perf.L1DataReadHitProfiler & perf.L1DataReadMissProfiler & perf.L1DataWriteHitProfiler & perf.L1InstrReadMissProfiler & perf.InstrTLBReadHitProfiler & perf.InstrTLBReadMissProfiler & perf.LLReadHitProfiler & perf.LLReadMissProfiler & perf.LLWriteHitProfiler & perf.LLWriteMissProfiler & perf.BPUReadHitProfiler & perf.BPUReadMissProfiler
314-
cacheProf, err := perf.NewCacheProfiler(
315-
-1,
316-
cpu,
317-
cacheProfilers,
318-
)
319-
if err != nil && !cacheProf.HasProfilers() {
320-
return nil, err
321-
}
322-
if err := cacheProf.Start(); err != nil {
323-
return nil, err
401+
if !*perfNoCaProfiler {
402+
cacheProf, err := perf.NewCacheProfiler(
403+
-1,
404+
cpu,
405+
cacheProfilers,
406+
)
407+
if err != nil && !cacheProf.HasProfilers() {
408+
return nil, err
409+
}
410+
if err := cacheProf.Start(); err != nil {
411+
return nil, err
412+
}
413+
collector.perfCacheProfilers[cpu] = &cacheProf
414+
collector.cacheProfilerCPUMap[&cacheProf] = cpu
324415
}
325-
collector.perfCacheProfilers[cpu] = &cacheProf
326-
collector.cacheProfilerCPUMap[&cacheProf] = cpu
327416
}
328417

329418
collector.desc = map[string]*prometheus.Desc{

0 commit comments

Comments
 (0)