oom_kill_process()
để ghi lại các thông số thời gian thực khi OOM xảy ra.Ví dụ: Probe oomkill.bt
tích hợp trong bpftrace cho phép ghi lại sự kiện OOM kill kèm PID, tên tiến trình và bộ nhớ sử dụng.
oom_kill_process(struct oom_control *oc, const char *message)
nhận tham số đầu là một struct chứa các thông tin quyết định tiến trình bị kill.struct oom_control { struct mem_cgroup *memcg; // Nhóm bộ nhớ cgroup container struct task_struct *chosen; // Tiến trình bị chọn OOM kill unsigned long totalpages; // Tổng trang nhớ sử dụng long chosen_points; // Điểm xấu của tiến trình (oom_badness) // ... các thành phần khác};
Trường | Mô tả |
---|---|
memcg | Thông tin cgroup bộ nhớ container, bao gồm giới hạn & sử dụng |
chosen | Tiến trình bị OOM kill, chứa thông tin bộ nhớ, namespace, PID |
totalpages | Tổng số trang bộ nhớ yêu cầu khi OOM |
chosen_points | Điểm oom_badness – thước đo mức độ "xấu" của tiến trình |
kprobe:oom_kill_process { $oc = (struct oom_control *)arg0; printf("%s,%03d probe=\"%s\"\n", strftime("%Y-%m-%d %H:%M:%S", nsecs), (nsecs % 1000000000)/1000000, probe); printf("message=\"%s\"\n", str(arg1)); printf("host_pid=\"%d\" container_id=\"%s\" command=\"%s\"\n", $oc->chosen->pid, $oc->chosen->nsproxy->uts_ns->name.nodename, $oc->chosen->comm); printf("oc_totalpages=\"%d\" oc_chosen_points=\"%d\"\n", $oc->totalpages, $oc->chosen_points); printf("memcg_memory_usage_pages=\"%d\" memcg_memory_max_pages=\"%d\"\n", $oc->memcg->memory.usage.counter, $oc->memcg->memory.max); printf("mm_rss_filepages=\"%d\" mm_rss_anonpages=\"%d\" mm_rss_swapents=\"%d\" mm_rss_shmempages=\"%d\"\n", $oc->chosen->mm->rss_stat[0].count, $oc->chosen->mm->rss_stat[1].count, $oc->chosen->mm->rss_stat[2].count, $oc->chosen->mm->rss_stat[3].count); printf("proc_oom_score_adj=\"%d\" proc_min_flt=\"%d\" proc_maj_flt=\"%d\"\n", $oc->chosen->signal->oom_score_adj, $oc->chosen->min_flt, $oc->chosen->maj_flt);}
FROM debian:stable-slimRUN apt-get update && \ apt-get install -y linux-headers-generic bpftrace && \ rm -rf /var/lib/apt/lists/*
WORKDIR /appCOPY *.bt /app/CMD ["bpftrace", "container_oomkill.bt"]
docker build -t container-oomkill-probe .docker run --privileged --pid=host -v /sys:/sys:ro container-oomkill-probe
Cờ--privileged
và mount/sys
để probe truy cập kernel và cgroup.
#!/usr/bin/env python3import logging, time
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s")i = 0memory = []
while True: i += 1 logging.info(f"Allocating {i * 4} MiB...") memory.append(bytearray(4 * 1024 * 1024)) time.sleep(0.1)
services: probe: build: context: . dockerfile: Dockerfile volumes: - /sys:/sys:ro privileged: true pid: host
stress-mem: image: python:3-slim volumes: - ./stress-mem:/app working_dir: /app command: python3 main.py restart: on-failure deploy: replicas: 1 resources: limits: memory: 128MiB reservations: memory: 64MiB memswap_limit: 128MiB # Disable swap
mm_rss_swapents
và proc_maj_flt
).memswap_limit
được thiết lập bằng giới hạn bộ nhớ, swap bị vô hiệu hóa, tiến trình bị OOM kill ở mức bộ nhớ gần đúng giới hạn cấu hình.oom_kill_process
và cấu trúc oom_control
.