eBPF-/Basic 8

[eBPF] 08. Capturing Scheduling Latency & visualization record

runqlat (RUN Queue LATency)runqlat은 리눅스의 CPU 스케줄러 지연 시간을 측정하는 eBPF 성능 분석 도구이다. runqlat은 리눅스 커널의 스케줄러 이벤트에 훅을 걸어 작동한다.프로세스는 sleep에서 깨어난 이후 아래와 같은 흐름을 거친다.Runnable 상태Run Queue에 등록 (아직 실행 중은 아님)스케줄러에 의해 선택CPU에서 실행이때 Run Queue Latency는 Run Queue에 들어간 시점부터 CPU에서 실행되기까지의 시간을 측정한 것이다.아래와 같이 결과가 나온다.# runqlatTracing run queue latency... Hit Ctrl-C to end.^C usecs : count distributi..

eBPF-/Basic 2026.04.14

[eBPF] 07. ring buffer를 활용한 프로세스 종료 캡쳐

ring buffer를 활용한 프로세스 종료 캡쳐Ring Buffer지난 시간에 다루었던 Perf event array는 각 CPU 코어마다 독립된 버퍼를 가진다. 이 방식은 메모리 낭비와 데이터의 순서가 꼬일 수 있는 문제점이 있다.이 문제를 해결하기 위해 커널 5.8 버전부터 Ring Buffer가 추가되었다.Ring buffer는 고정된 크기의 메모리 공간을 원형으로 순환하며 사용하는 자료구조이다. 버퍼의 끝에 데이터가 차면 다시 첫번째 공간으로 돌아가서 데이터를 사용한다.ebpf에서 Ring Buffer는 모든 CPU가 공유한다. 이로써 FIFO를 보장하여 데이터 순서 꼬임 문제와 메모리 낭비 문제를 해결한다. 데이터를 전송할 때 사용하는 주요 함수 몇가지를 알아보고 실습으로 넘어가보자.void ..

eBPF-/Basic 2026.04.14

[eBPF] 06. perf event array를 활용한 프로세스 실행 캡쳐

perf bufferebpf 프로그램이 커널에서 수집한 데이터를 유저 공간으로 전송해야할 때, bpk_printk만으로는 성능과 기능면에서 부족하다. 이때 데이터를 효율적으로 주고받기 위해 perf buffer를 활용한다.버퍼가 필요한 이유는 ebpf가 커널 내에서 실행되므로 유저 공간에 데이터를 보낼 때 고성능 통신 채널이 필요하다. 이를 위해 ebpf 는 두가지 유형의 링버퍼를 제공하며, 자세한 내용은 아래 표로 정리해보았다.구분Perf Event ArrayBPF Ring Buffer도입 버전커널 4.15 이상커널 5.8 이상특징CPU마다 개별 버퍼 할당 (Per-CPU)모든 CPU가 공유하는 단일 버퍼장점호환성 범위가 매우 넓음메모리 효율성 및 데이터 순서 보장 우수단점데이터 순서 뒤섞임 발생 가능..

eBPF-/Basic 2026.04.14

[eBPF] 05. Hashmap을 사용한 signal snooping

sigsnoop이번 실습은 프로세스에 signal를 보내는 syscall을 스누핑하여 해시맵을 사용하여 상태를 저장하는 방법을 소개한다. sigsnoop.bpf.c 실습 파일#include #include #include #define MAX_ENTRIES 10240#define TASK_COMM_LEN 16struct event { unsigned int pid; unsigned int tpid; int sig; int ret; char comm[TASK_COMM_LEN];};struct { __uint(type, BPF_MAP_TYPE_HASH); __uint(max_entries, MAX_ENTRIES); __type(key, __u32); __type(value, struct event);} va..

eBPF-/Basic 2026.04.14

[eBPF] 04. uprobe 기반 함수 호출 캡처

uprobeuprobe는 커널 모드 대상이였던 tracepoint, fentry, kprobe랑 다르게 유저 공간 대상으로 실행된다.따라서 사용자 프로그램을 관찰할 때, 유저 함수 호출을 추적이 가능하고, 대상이 유저 모드인 만큼 안정성 또한 비교적 높다. 하지만 대상이 유저 모드이기 때문에 범위가 제한되고, 너무 많은 호출에 uprobe를 걸 시에 프로세스 실행 속도가 느려질 수 있다.uprobe는 파일 기반 프로브로, 특정 바이너리 함수에 걸면 그 파일을 사용하는 모든 프로세스(아직 실행되지 않은 프로세스 포함)까지 추적할 수 있다.덕분에 커널에서 직접 파싱하기 어려운 HTTP/2(헤더 인코딩), HTTPS(암호화) 같은 사용자 모드 트래픽을 관찰하는 데 적합하다. 예를 들어 SSL/TLS 평문 데이..

eBPF-/Basic 2026.04.14

[eBPF] 03. fentry 기반 syscall 후킹

fentryfentry는 *ftrace hook 계열로, 커널 함수 진입 시점에 eBPF 프로그램을 실행할 수 있게 해준다.kprobe와는 다르게 *trampoline(트램폴린)을 사용하여 훨씬 가볍게 동작하므로 오버헤드가 작고 타입 안전성이 보장된다.ftrace 란?frece(Function Tracer)는 리눅스 커널 내부 동작을 추적하고 분석하기 위한 강력한 도구이다. ftrace hook은 ftrace를 활용하는 후킹 방식을 묶어서 부르는 말이다.trampoline 이란?trampoline은 짧은 점프 코드 조각을 가리킨다. 원래 함수가 호출될 때, 중간에 아주 작은 코드(trampoline)를 삽입하게 되는데,이 작은 코드가 원래 가려던 함수로 점프하기 전에 다른 동작(여기서는 eBPF 실행)을..

eBPF-/Basic 2026.04.14

[eBPF] 02. kprobe 기반 syscall 후킹

Tracepoint VS kprobe이전 02-Tracepoint-Based-Syscall-Hooking 에서 tracepoint 기반의 syscall 후킹을 살펴봤다.sys_enter_write 같은 tracepoint를 활용하여 write() 시스템 콜이 호출될 때마다 호출된 시점, 호출한 PID 를 확인해 봤다. 이 방식은 커널이 공식적으로 제공하는 안정된 지점이기 때문에 커널 업데이트나 구조 변경이 있어도 깨지지 않고 비교적 안전하게 사용할 수 있다는 장점이 있다.그런데 위에 언급했듯이 공식적으로 제공하는 지점이기 때문에, tracepoint 는 미리 정의된 지점에서만 활용이 가능하다는 한계가 있다. 모든 함수에 tracepoint가 존재하는 것은 아니므로, 사용자가 특정 함수나 코드 경로를 더욱..

eBPF-/Basic 2026.04.14

[eBPF] 01. Tracepoint 기반 syscall 후킹

eccecc(eBPF C Compiler)는 C 언어로 작성한 eBPF 프로그램을 커널이 이해할 수 있는 eBPF 바이트코드와 메타데이터(JSON) 로 변환해주는 도구이다.역할.c 파일로 작성된 eBPF 프로그램을 LLVM IR → eBPF 바이트코드 → JSON 형식으로 변환한다.프로그램에서 사용되는 eBPF 맵을 JSON에 함께 포함한다.결과물이 ELF 오브젝트가 아닌 JSON 형식이므로, 다른 환경에서도 쉽게 실행 및 배포할 수 있다.LLVM IR(Low Level Virtual Machine Intermediate Representation)은 c/cpp 같은 하이 레벨과 로우 레벨 사이에 있는 중간 언어이다. ecli (eBPF Command Line Interface)ecli 는 eBPF Co..

eBPF-/Basic 2026.04.14