@@ -37,12 +37,67 @@ const (
3737var (
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
4248func 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.
47102func 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