Linux Kernel

eBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

메모리 문제는 대부분 사후에 발견된다. OOM으로 프로세스가 죽은 뒤 dmesg 한 줄이 남고, 그 전까지 누가 얼마나 잡아먹고 있었는지는 알 수 없다. /proc/meminfo나 /proc/slabinfo는 지금 이 순간의 스냅샷이라 어떤 작업이…

Continue ReadingeBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

eBPF 실전 (5) — sched_ext로 커널 스케줄러 직접 구현하기

4편까지는 스케줄러가 하는 일을 밖에서 들여다보기만 했다. 스케줄링 정책 자체를 바꾸려면 kernel/sched/를 고쳐 커널을 다시 빌드하고 재부팅해야 했고, 정책 하나 시험하는 데 빌드 주기가 통째로 들어갔다. 커널 6.12에 정식 합류한…

Continue ReadingeBPF 실전 (5) — sched_ext로 커널 스케줄러 직접 구현하기

eBPF 실전 (4) — 런큐 지연과 컨텍스트 스위치 관측하기

CPU 사용률이 100%가 아닌데도 응답이 느린 서버가 있다. 태스크가 실행 가능(runnable) 상태로 런큐에서 기다린 시간, 즉 런큐 지연(run queue latency)이 원인인 경우가 많은데 top이나 vmstat에는 이 값이 나오지 않는다. /proc/PID/schedstat에…

Continue ReadingeBPF 실전 (4) — 런큐 지연과 컨텍스트 스위치 관측하기

eBPF 실전 (3) — kprobe·fentry·tracepoint·uprobe 훅 오버헤드 비교

같은 vfs_read()를 관측하더라도 BPF 프로그램을 붙일 수 있는 훅은 kprobe, fentry, tracepoint, raw tracepoint 등 여러 가지다. 훅마다 인자에 접근하는 방법, 커널 버전이 바뀔 때의 안정성, 이벤트당 비용이 다르다. 고빈도…

Continue ReadingeBPF 실전 (3) — kprobe·fentry·tracepoint·uprobe 훅 오버헤드 비교

eBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정

eBPF 프로그램은 이벤트 하나를 처리하고 끝나는 짧은 함수라서, 이벤트 사이에 상태를 유지하거나 결과를 유저 공간에 넘기려면 BPF 맵이 필요하다. 문제는 맵 종류가 30가지가 넘고, 잘못 고르면 카운트가 조용히 유실되거나 이벤트가…

Continue ReadingeBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정

eBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

커널 동작을 들여다보려면 예전에는 커널 모듈을 만들거나 커널을 다시 빌드해야 했다. 모듈 버그 하나가 곧 커널 패닉이고, 커널 버전이 바뀔 때마다 다시 컴파일해야 한다. eBPF는 검증된 작은 프로그램을 실행 중인…

Continue ReadingeBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

리눅스 커널 spinlock·mutex 오용 디버깅 — DEBUG_SPINLOCK, DEBUG_MUTEXES, lockdep 실측 비교

스핀락(spinlock)과 뮤텍스(mutex)를 잘못 쓴 커널 코드는 대부분 조용히 지나간다. 초기화하지 않은 스핀락은 0으로 채워진 메모리라 x86에서는 그냥 동작하고, 스핀락 안에서 호출한 kmalloc(GFP_KERNEL)은 메모리가 넉넉하면 잠들지 않으니 아무 일도 없다. 그러다…

Continue Reading리눅스 커널 spinlock·mutex 오용 디버깅 — DEBUG_SPINLOCK, DEBUG_MUTEXES, lockdep 실측 비교

리눅스 커널 7.3-rc2, kmalloc() 호출을 kmalloc_obj()로 추가 전환 — Coccinelle이 놓친 scoped_guard 함수들

9월 6일 공개된 리눅스 커널 7.3-rc2에는 기능 추가 없이 코드 모양만 바꾸는 대형 패치가 하나 들어갔습니다. 키스 쿡(Kees Cook)이 보낸 kmalloc_obj() 전환 풀 리퀘스트입니다. 304개 파일에서 637줄이 추가되고 726줄이 삭제됐습니다.…

Continue Reading리눅스 커널 7.3-rc2, kmalloc() 호출을 kmalloc_obj()로 추가 전환 — Coccinelle이 놓친 scoped_guard 함수들

리눅스 커널 7.3, Rust 툴체인이 있으면 randstruct 기본 해제 — allmodconfig에서 Rust가 사라지던 문제

커널 하드닝 옵션 randstruct와 Rust는 지금까지 한 커널에 함께 들어갈 수 없었습니다. Kconfig에 depends on !RANDSTRUCT가 박혀 있어 둘 중 하나를 켜면 다른 하나가 조용히 꺼집니다. 문제는 이 규칙이 커널의…

Continue Reading리눅스 커널 7.3, Rust 툴체인이 있으면 randstruct 기본 해제 — allmodconfig에서 Rust가 사라지던 문제