Skip to content

Commit 94fde80

Browse files
authored
Merge pull request #909 from gaoyixiang1/develop
获取numa架构下所有的内存节点信息
2 parents 8607cc5 + dd3b9ff commit 94fde80

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

.github/workflows/ebpf_mem_watcher.yml

+1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ jobs:
3333
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
3434
cd ../../mem_watcher
3535
make
36+
sudo ./mem_watcher -N
3637
sudo timeout 20 ./mem_watcher

eBPF_Supermarket/Memory_Subsystem/mem_watcher/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ INCLUDES := -I$(OUTPUT) -I../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBB
2424
CFLAGS := -g -Wall
2525
ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)
2626

27-
APPS = paf pr procstat sysstat memleak fraginfo vmasnap drsnoop oomkiller
27+
APPS = paf pr procstat sysstat memleak fraginfo vmasnap drsnoop oomkiller numafraginfo
2828

2929
TARGETS= mem_watcher
3030
CARGO ?= $(shell which cargo)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "vmlinux.h"
2+
#include <bpf/bpf_helpers.h>
3+
#include <bpf/bpf_core_read.h>
4+
#include <bpf/bpf_tracing.h>
5+
#include "fraginfo.h"
6+
7+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
8+
9+
struct {
10+
__uint(type, BPF_MAP_TYPE_HASH);
11+
__uint(max_entries, 102400);
12+
__type(key, u64);
13+
__type(value, struct pgdat_info);
14+
} nodes SEC(".maps");
15+
16+
SEC("kprobe/get_page_from_freelist")
17+
int BPF_KPROBE(get_page_from_freelist, gfp_t gfp_mask, unsigned int order, int alloc_flags,
18+
const struct alloc_context *ac)
19+
{
20+
struct pgdat_info node_info = {};
21+
22+
struct pglist_data *pgdat;
23+
24+
pgdat = BPF_CORE_READ(ac, preferred_zoneref, zone, zone_pgdat);
25+
node_info.node_id = BPF_CORE_READ(pgdat, node_id);
26+
node_info.nr_zones = BPF_CORE_READ(pgdat, nr_zones);
27+
node_info.pgdat_ptr = (u64)pgdat;
28+
u64 key = (u64)pgdat;
29+
30+
bpf_map_update_elem(&nodes, &key, &node_info, BPF_NOEXIST);
31+
32+
return 0;
33+
}

eBPF_Supermarket/Memory_Subsystem/mem_watcher/mem_watcher.c

+43
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "procstat.skel.h"
3434
#include "sysstat.skel.h"
3535
#include "fraginfo.skel.h"
36+
#include "numafraginfo.skel.h"
3637
#include "memleak.skel.h"
3738
#include "vmasnap.skel.h"
3839
#include "drsnoop.skel.h"
@@ -264,6 +265,7 @@ static struct env
264265
bool sysstat; // 是否启用系统内存状态报告
265266
bool memleak; // 是否启用内核态/用户态内存泄漏检测
266267
bool fraginfo; // 是否启用内存碎片信息
268+
bool numafraginfo;
267269
bool vmasnap; // 是否启用虚拟内存区域信息
268270
bool drsnoop;
269271
bool kernel_trace; // 是否启用内核态跟踪
@@ -283,6 +285,7 @@ static struct env
283285
.sysstat = false, // 默认关闭系统内存状态报告
284286
.memleak = false, // 默认关闭内存泄漏检测
285287
.fraginfo = false, // 默认关闭内存碎片信息
288+
.numafraginfo=false,
286289
.vmasnap = false, // 默认关闭虚拟内存区域信息
287290
.drsnoop = false,
288291
.kernel_trace = true, // 默认启用内核态跟踪
@@ -338,6 +341,9 @@ static const struct argp_option opts[] = {
338341

339342
{0, 0, 0, 0, "oomkiller:", 15}, // 新增的 oomkiller 选项
340343
{"oomkiller", 'o', 0, 0, "print oomkiller (内存不足时被杀死的进程信息)"},
344+
{0, 0, 0, 0, "numafraginfo:", 16},
345+
{"numafraginfo", 'N', 0, 0, "print numafraginfo"},
346+
341347

342348
{NULL, 'h', NULL, OPTION_HIDDEN, "show the full help"},
343349
{0},
@@ -400,6 +406,9 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
400406
case 'd':
401407
env.duration = atoi(arg);
402408
break;
409+
case 'N':
410+
env.numafraginfo = true;
411+
break;
403412
default:
404413
return ARGP_ERR_UNKNOWN;
405414
}
@@ -436,6 +445,7 @@ static int process_procstat(struct procstat_bpf *skel_procstat);
436445
static int process_sysstat(struct sysstat_bpf *skel_sysstat);
437446
static int process_memleak(struct memleak_bpf *skel_memleak, struct env);
438447
static int process_fraginfo(struct fraginfo_bpf *skel_fraginfo);
448+
static int process_numafraginfo(struct numafraginfo_bpf *skel_numafraginfo);
439449
static int process_vmasnap(struct vmasnap_bpf *skel_vmasnap);
440450
static int process_drsnoop(struct drsnoop_bpf *skel_drsnoop);
441451
static int process_oomkiller(struct oomkiller_bpf *skel_oomkiller); // 新增的oomkiller处理函数原型
@@ -456,6 +466,7 @@ int main(int argc, char **argv)
456466
struct sysstat_bpf *skel_sysstat;
457467
struct memleak_bpf *skel_memleak;
458468
struct fraginfo_bpf *skel_fraginfo;
469+
struct numafraginfo_bpf *skel_numafraginfo;
459470
struct vmasnap_bpf *skel_vmasnap;
460471
struct oomkiller_bpf *skel_oomkiller;
461472
struct drsnoop_bpf *skel_drsnoop;
@@ -485,6 +496,9 @@ int main(int argc, char **argv)
485496
{
486497
PROCESS_SKEL(skel_fraginfo, fraginfo);
487498
}
499+
else if(env.numafraginfo){
500+
PROCESS_SKEL(skel_numafraginfo, numafraginfo);
501+
}
488502
else if (env.vmasnap)
489503
{
490504
PROCESS_SKEL(skel_vmasnap, vmasnap);
@@ -1491,6 +1505,35 @@ static int process_fraginfo(struct fraginfo_bpf *skel_fraginfo)
14911505
fraginfo_bpf__destroy(skel_fraginfo);
14921506
return -err;
14931507
}
1508+
// =========================================numafraginfo=================================================
1509+
static int process_numafraginfo(struct numafraginfo_bpf *skel_numafraginfo)
1510+
{
1511+
1512+
int err = numafraginfo_bpf__load(skel_numafraginfo);
1513+
if (err)
1514+
{
1515+
fprintf(stderr, "Failed to load and verify BPF skeleton\n");
1516+
goto numafraginfo_cleanup;
1517+
}
1518+
1519+
err = numafraginfo_bpf__attach(skel_numafraginfo);
1520+
if (err)
1521+
{
1522+
fprintf(stderr, "Failed to attach BPF skeleton\n");
1523+
goto numafraginfo_cleanup;
1524+
}
1525+
while (1)
1526+
{
1527+
sleep(env.interval);
1528+
print_nodes(bpf_map__fd(skel_numafraginfo->maps.nodes));
1529+
printf("\n");
1530+
break;
1531+
}
1532+
1533+
numafraginfo_cleanup:
1534+
numafraginfo_bpf__destroy(skel_numafraginfo);
1535+
return -err;
1536+
}
14941537

14951538
// ================================================== vmasnap ====================================================================
14961539
static void print_find_event_data(int map_fd)

0 commit comments

Comments
 (0)