6 format: '%(asctime)s - %(name)s - %(message)s'
13 class: logging.StreamHandler
15 formatter: console_stdout
16 stream: ext://sys.stdout
18 class: logging.StreamHandler
20 formatter: console_stderr
21 stream: ext://sys.stderr
23 class: logging.handlers.RotatingFileHandler
26 filename: /tmp/metric.prom
35 handlers: [console_stdout, console_stderr]
43 documentation: Cycles processed by CPUs
49 - name: cpu_instruction
50 documentation: Instructions retired by CPUs
57 documentation: Last level cache operations by type
64 documentation: Last level cache operations by type
71 - type: 0x0 # HARDWARE
72 name: 0x0 # PERF_COUNT_HW_CPU_CYCLES
75 - type: 0x0 # HARDWARE
76 name: 0x1 # PERF_COUNT_HW_INSTRUCTIONS
77 target: on_cpu_instruction
78 table: cpu_instruction
79 - type: 0x0 # HARDWARE
80 name: 0x2 # PERF_COUNT_HW_CACHE_REFERENCES
81 target: on_cache_reference
83 - type: 0x0 # HARDWARE
84 name: 0x3 # PERF_COUNT_HW_CACHE_MISSES
88 #include <linux/ptrace.h>
89 #include <uapi/linux/bpf_perf_event.h>
91 const int max_cpus = 256;
96 char name[TASK_COMM_LEN];
99 BPF_HASH(llc_miss, struct key_t);
100 BPF_HASH(llc_reference, struct key_t);
101 BPF_HASH(cpu_instruction, struct key_t);
102 BPF_HASH(cpu_cycle, struct key_t);
104 static inline __attribute__((always_inline)) void get_key(struct key_t* key) {
105 key->cpu = bpf_get_smp_processor_id();
106 key->pid = bpf_get_current_pid_tgid();
107 bpf_get_current_comm(&(key->name), sizeof(key->name));
110 int on_cpu_cycle(struct bpf_perf_event_data *ctx) {
111 struct key_t key = {};
114 cpu_cycle.increment(key, ctx->sample_period);
117 int on_cpu_instruction(struct bpf_perf_event_data *ctx) {
118 struct key_t key = {};
121 cpu_instruction.increment(key, ctx->sample_period);
124 int on_cache_reference(struct bpf_perf_event_data *ctx) {
125 struct key_t key = {};
128 llc_reference.increment(key, ctx->sample_period);
131 int on_cache_miss(struct bpf_perf_event_data *ctx) {
132 struct key_t key = {};
135 llc_miss.increment(key, ctx->sample_period);