Skip to content

Commit 86b0c14

Browse files
committed
libbpf-tools: oomkill: support display memory cgroup
Using a simple test program (not shown) called OOM, we performed the following two tests: 1. Allocating unlimited memory 2. Adding the process to a cgroup named oom-memcg and limiting its memory usage to 200MB. When we do not print cgroup information, we can only see process information and cannot see the difference between memcg and non-memcg. $ sudo ./oomkill Tracing OOM kills... Ctrl-C to stop. 14:28:23 Triggered by PID 179201 ("oom"), OOM kill of PID 179201 ("oom"), 6114610 pages, loadavg: loadavg: 0.56 0.51 0.38 2/968 179204 14:28:42 Triggered by PID 179212 ("oom"), OOM kill of PID 179212 ("oom"), 51200 pages, loadavg: loadavg: 0.40 0.47 0.37 3/968 179212 The function implemented by this patch can clearly display cgroup information. $ sudo ./oomkill -c Tracing OOM kills... Ctrl-C to stop. 14:32:59 Triggered by PID 179879 ("oom"), CGROUP 8309 ("/sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/session.slice/[email protected]"), OOM kill of PID 179879 ("oom"), 6114610 pages, loadavg: loadavg: 0.50 0.38 0.35 4/970 179879 14:33:14 Triggered by PID 179884 ("oom"), CGROUP 122547 ("/sys/fs/cgroup/oom-memcg"), MEMCG 122547 ("/sys/fs/cgroup/oom-memcg"), OOM kill of PID 179884 ("oom"), 51200 pages, loadavg: loadavg: 0.47 0.38 0.35 3/971 179884 Link: iovisor#5384 Signed-off-by: Rong Tao <[email protected]>
1 parent 07ce7c7 commit 86b0c14

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

libbpf-tools/oomkill.bpf.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88
#include "compat.bpf.h"
99
#include "oomkill.h"
1010

11+
/* linux:include/linux/memcontrol.h */
12+
struct mem_cgroup {
13+
struct cgroup_subsys_state css;
14+
};
15+
1116
SEC("kprobe/oom_kill_process")
1217
int BPF_KPROBE(oom_kill_process, struct oom_control *oc, const char *message)
1318
{
1419
struct data_t *data;
20+
struct mem_cgroup *memcg;
1521

1622
data = reserve_buf(sizeof(*data));
1723
if (!data)
@@ -20,6 +26,16 @@ int BPF_KPROBE(oom_kill_process, struct oom_control *oc, const char *message)
2026
data->fpid = bpf_get_current_pid_tgid() >> 32;
2127
data->tpid = BPF_CORE_READ(oc, chosen, tgid);
2228
data->pages = BPF_CORE_READ(oc, totalpages);
29+
data->cgroupid = bpf_get_current_cgroup_id();
30+
31+
/* Get the memory cgroup id */
32+
memcg = BPF_CORE_READ(oc, memcg);
33+
if (memcg) {
34+
struct cgroup *cgrp = BPF_CORE_READ(memcg, css.cgroup);
35+
data->mem_cgroupid = BPF_CORE_READ(cgrp, kn, id);
36+
} else
37+
data->mem_cgroupid = 0;
38+
2339
bpf_get_current_comm(&data->fcomm, sizeof(data->fcomm));
2440
bpf_probe_read_kernel(&data->tcomm, sizeof(data->tcomm), BPF_CORE_READ(oc, chosen, comm));
2541
submit_buf(ctx, data, sizeof(*data));

libbpf-tools/oomkill.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
22
// Copyright (c) 2022 Jingxiang Zeng
33
// Copyright (c) 2022 Krisztian Fekete
4+
// Copyright (c) 2025 Rong Tao
45
//
56
// Based on oomkill(8) from BCC by Brendan Gregg.
67
// 13-Jan-2022 Jingxiang Zeng Created this.
78
// 17-Oct-2022 Krisztian Fekete Edited this.
9+
// 03-Aug-2025 Rong Tao Support display cgroup.
810
#include <argp.h>
911
#include <errno.h>
1012
#include <signal.h>
@@ -20,13 +22,15 @@
2022
#include "compat.h"
2123
#include "oomkill.h"
2224
#include "btf_helpers.h"
25+
#include "cgroup_helpers.h"
2326
#include "trace_helpers.h"
2427

2528
static volatile sig_atomic_t exiting = 0;
2629

2730
static bool verbose = false;
31+
static bool display_cgroup = false;
2832

29-
const char *argp_program_version = "oomkill 0.1";
33+
const char *argp_program_version = "oomkill 0.2";
3034
const char *argp_program_bug_address =
3135
"https://github.com/iovisor/bcc/tree/master/libbpf-tools";
3236
const char argp_program_doc[] =
@@ -35,17 +39,22 @@ const char argp_program_doc[] =
3539
"USAGE: oomkill [-h]\n"
3640
"\n"
3741
"EXAMPLES:\n"
38-
" oomkill # trace OOM kills\n";
42+
" oomkill # trace OOM kills\n"
43+
" oomkill --cgroup # trace OOM kills with cgroup display\n";
3944

4045
static const struct argp_option opts[] = {
4146
{ "verbose", 'v', NULL, 0, "Verbose debug output", 0 },
47+
{ "cgroup", 'c', NULL, 0, "Display cgroup information", 0 },
4248
{ NULL, 'h', NULL, OPTION_HIDDEN, "Show the full help", 0 },
4349
{},
4450
};
4551

4652
static error_t parse_arg(int key, char *arg, struct argp_state *state)
4753
{
4854
switch (key) {
55+
case 'c':
56+
display_cgroup = true;
57+
break;
4958
case 'v':
5059
verbose = true;
5160
break;
@@ -60,18 +69,28 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
6069

6170
static int handle_event(void *ctx, void *data, size_t len)
6271
{
63-
char loadavg[256];
72+
char loadavg[256], cgroup_path[PATH_MAX];
6473
char ts[32];
6574
struct data_t *e = data;
6675

6776
str_timestamp("%H:%M:%S", ts, sizeof(ts));
77+
printf("%s Triggered by PID %d (\"%s\"),", ts, e->tpid, e->tcomm);
78+
if (display_cgroup) {
79+
get_cgroupid_path(e->cgroupid, cgroup_path, sizeof(cgroup_path));
80+
printf(" CGROUP %lld (\"%s\"),", e->cgroupid, cgroup_path);
81+
if (e->mem_cgroupid) {
82+
if (e->mem_cgroupid != e->cgroupid)
83+
get_cgroupid_path(e->mem_cgroupid, cgroup_path,
84+
sizeof(cgroup_path));
85+
printf(" MEMCG %lld (\"%s\"),", e->mem_cgroupid, cgroup_path);
86+
}
87+
}
88+
printf(" OOM kill of PID %d (\"%s\"), %lld pages", e->tpid, e->tcomm, e->pages);
6889

6990
if (str_loadavg(loadavg, sizeof(loadavg)) > 0)
70-
printf("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\"), %lld pages, loadavg: %s",
71-
ts, e->fpid, e->fcomm, e->tpid, e->tcomm, e->pages, loadavg);
91+
printf(", loadavg: %s\n", loadavg);
7292
else
73-
printf("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\"), %lld pages\n",
74-
ts, e->fpid, e->fcomm, e->tpid, e->tcomm, e->pages);
93+
printf("\n");
7594

7695
return 0;
7796
}

libbpf-tools/oomkill.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ struct data_t {
88
__u32 fpid;
99
__u32 tpid;
1010
__u64 pages;
11+
__u64 cgroupid;
12+
__u64 mem_cgroupid;
1113
char fcomm[TASK_COMM_LEN];
1214
char tcomm[TASK_COMM_LEN];
1315
};

0 commit comments

Comments
 (0)