blob: 88ad7eb64f240fd1ea3ca4af918b376b9b137537 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
---
logging:
version: 1
formatters:
console:
format: '%(asctime)s - %(name)s - %(message)s'
prom:
format: '%(message)s'
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: console
stream: ext://sys.stdout
prom:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: prom
filename: /tmp/metric.prom
mode: w
loggers:
prom:
handlers: [prom]
level: INFO
propagate: False
root:
level: INFO
handlers: [console]
scheduler:
duration: 1
programs:
- name: bundle_bpf
metrics:
counter:
- name: cpu_cycle
documentation: Cycles processed by CPUs
namespace: bpf
labelnames:
- name
- cpu
- pid
- name: cpu_instruction
documentation: Instructions retired by CPUs
namespace: bpf
labelnames:
- name
- cpu
- pid
- name: llc_reference
documentation: Last level cache operations by type
namespace: bpf
labelnames:
- name
- cpu
- pid
- name: llc_miss
documentation: Last level cache operations by type
namespace: bpf
labelnames:
- name
- cpu
- pid
events:
- type: 0x0 # HARDWARE
name: 0x0 # PERF_COUNT_HW_CPU_CYCLES
target: on_cpu_cycle
table: cpu_cycle
- type: 0x0 # HARDWARE
name: 0x1 # PERF_COUNT_HW_INSTRUCTIONS
target: on_cpu_instruction
table: cpu_instruction
- type: 0x0 # HARDWARE
name: 0x2 # PERF_COUNT_HW_CACHE_REFERENCES
target: on_cache_reference
table: llc_reference
- type: 0x0 # HARDWARE
name: 0x3 # PERF_COUNT_HW_CACHE_MISSES
target: on_cache_miss
table: llc_miss
code: |
#include <linux/ptrace.h>
#include <uapi/linux/bpf_perf_event.h>
const int max_cpus = 256;
struct key_t {
int cpu;
int pid;
char name[TASK_COMM_LEN];
};
BPF_HASH(llc_miss, struct key_t);
BPF_HASH(llc_reference, struct key_t);
BPF_HASH(cpu_instruction, struct key_t);
BPF_HASH(cpu_cycle, struct key_t);
static inline __attribute__((always_inline)) void get_key(struct key_t* key) {
key->cpu = bpf_get_smp_processor_id();
key->pid = bpf_get_current_pid_tgid();
bpf_get_current_comm(&(key->name), sizeof(key->name));
}
int on_cpu_cycle(struct bpf_perf_event_data *ctx) {
struct key_t key = {};
get_key(&key);
cpu_cycle.increment(key, ctx->sample_period);
return 0;
}
int on_cpu_instruction(struct bpf_perf_event_data *ctx) {
struct key_t key = {};
get_key(&key);
cpu_instruction.increment(key, ctx->sample_period);
return 0;
}
int on_cache_reference(struct bpf_perf_event_data *ctx) {
struct key_t key = {};
get_key(&key);
llc_reference.increment(key, ctx->sample_period);
return 0;
}
int on_cache_miss(struct bpf_perf_event_data *ctx) {
struct key_t key = {};
get_key(&key);
llc_miss.increment(key, ctx->sample_period);
return 0;
}
|