Linux 시스템에서 성능 문제를 분석하거나 커널 내부 동작을 확인하려면 특정 함수가 언제 호출되는지 알아야 하는 경우가 많습니다. Tracepoint는 커널에 미리 정의된 이벤트만 추적할 수 있지만, 원하는 함수가 Tracepoint로 제공되지 않는 경우도 있습니다.
이때 사용하는 기술이 Kprobe(Kernel Probe) 입니다.
Kprobe는 실행 중인 Linux Kernel의 거의 모든 함수에 동적으로 Hook을 설치하여 함수 호출을 추적할 수 있는 기능입니다. eBPF와 함께 사용하면 커널을 수정하거나 재부팅하지 않고도 매우 세밀한 분석이 가능합니다.
이번 글에서는 Kprobe의 개념과 동작 원리, Tracepoint와의 차이점, eBPF에서의 활용 방법, 그리고 실무 활용 사례를 자세히 알아보겠습니다.
Linux Kprobe란?
Kprobe는 커널 함수의 시작 지점에 동적으로 Probe를 삽입하여 함수 실행을 감시하는 Linux Kernel 기능입니다.
동작 구조는 다음과 같습니다.
Application
↓
System Call
↓
Kernel Function
↓
Kprobe 실행
↓
eBPF Program
↓
데이터 수집
함수가 호출될 때마다 Kprobe가 실행되어 필요한 정보를 수집합니다.
Kprobe가 필요한 이유
예를 들어 메모리 할당 속도가 느려졌다고 가정해 보겠습니다.
Kernel에는 메모리를 할당하는 함수가 존재하지만 Tracepoint가 제공되지 않을 수도 있습니다.
이 경우
- 함수 시작 시점
- 함수 인자
- 반환값
- 실행 횟수
등을 Kprobe로 확인할 수 있습니다.
Kprobe의 동작 원리
Kprobe는 함수의 첫 번째 명령어를 임시로 변경하여 동작합니다.
Kernel Function
↓
첫 번째 명령어
↓
Breakpoint 삽입
↓
Kprobe Handler 실행
↓
원래 함수 계속 실행
Kernel은 Probe를 실행한 후 원래 함수 실행을 이어갑니다.
Kretprobe란?
Kprobe는 함수의 시작 시점을 추적합니다.
반면 Kretprobe는 함수가 종료될 때 실행됩니다.
함수 시작
↓
Kprobe
↓
함수 실행
↓
Return
↓
Kretprobe
이를 통해 함수의 실행 시간이나 반환값도 분석할 수 있습니다.
Kprobe와 Tracepoint의 차이
| 항목 | Kprobe | Tracepoint |
|---|---|---|
| 대상 | 모든 Kernel 함수 | 미리 정의된 이벤트 |
| 안정성 | Kernel 변경 영향 가능 | 매우 안정적 |
| 유연성 | 매우 높음 | 제한적 |
| 사용 난이도 | 비교적 높음 | 쉬움 |
가능하다면 Tracepoint를 사용하고, 필요한 이벤트가 없을 경우 Kprobe를 사용하는 것이 일반적입니다.
사용 가능한 함수 확인
Kernel 함수 목록은 다음 명령으로 확인할 수 있습니다.
cat /proc/kallsyms
예시
ffffffff81234567 tcp_sendmsg
ffffffff81234890 do_sys_open
ffffffff81235abc schedule
이 함수들을 대상으로 Kprobe를 설정할 수 있습니다.
bpftrace에서 Kprobe 사용
예를 들어 do_sys_open 함수를 추적하려면 다음과 같이 실행합니다.
sudo bpftrace -e '
kprobe:do_sys_open
{
printf("%s\n", comm);
}'
파일을 여는 함수가 호출될 때마다 프로세스 이름을 출력합니다.
Kretprobe 사용 예제
함수 종료 시점을 추적하는 예시입니다.
sudo bpftrace -e '
kretprobe:do_sys_open
{
printf("return\n");
}'
함수의 반환 시점마다 출력됩니다.
함수 실행 횟수 측정
특정 함수 호출 횟수를 계산할 수도 있습니다.
sudo bpftrace -e '
kprobe:tcp_sendmsg
{
@count++;
}'
종료 시
@count: 15432
처럼 호출 횟수를 확인할 수 있습니다.
함수 실행 시간 측정
Kprobe와 Kretprobe를 함께 사용하면 실행 시간을 계산할 수 있습니다.
Kprobe
↓
Start Time 저장
↓
Kernel Function 실행
↓
Kretprobe
↓
End Time 계산
↓
실행 시간 출력
성능 병목 분석에서 자주 사용하는 기법입니다.
bpftool에서 프로그램 확인
현재 Kernel에 로드된 eBPF 프로그램 확인
sudo bpftool prog show
Program Type도 함께 확인할 수 있습니다.
실무에서 자주 사용하는 명령어
Kernel 함수 확인
cat /proc/kallsyms
Kprobe 실행
sudo bpftrace
Program 확인
sudo bpftool prog show
Kernel 버전
uname -r
디버그 파일 시스템 확인
mount | grep debugfs
Tracer 상태 확인
cat /sys/kernel/debug/tracing/available_filter_functions
실무 사례
예를 들어 운영 중인 데이터베이스 서버에서 디스크 성능 저하가 발생했다고 가정해 보겠습니다.
다음 순서로 원인을 분석할 수 있습니다.
cat /proc/kallsyms로 관련 Kernel 함수 확인- 디스크 I/O 함수에 Kprobe 연결
- Kretprobe로 실행 시간 측정
- eBPF 프로그램으로 호출 횟수 집계
- 병목 함수 확인
- 성능 최적화 수행
Tracepoint가 제공되지 않는 함수까지 분석할 수 있기 때문에 매우 강력한 디버깅 방법입니다.
자주 묻는 질문
Kprobe는 모든 Kernel 함수에 사용할 수 있나요?
대부분의 함수에 사용할 수 있지만, 일부 인라인 함수나 최적화된 함수는 추적이 어려울 수 있습니다. 또한 커널 버전이나 컴파일 옵션에 따라 함수 이름이 달라질 수도 있습니다.
Kprobe와 Kretprobe는 언제 각각 사용하나요?
함수가 시작되는 시점의 인자나 호출 횟수를 확인하려면 Kprobe를 사용합니다. 함수의 반환값이나 실행 시간을 분석하려면 Kretprobe를 함께 사용하는 것이 일반적입니다.
Kprobe는 운영 서버에서도 사용할 수 있나요?
가능합니다. 다만 잘못된 Probe 설정은 성능에 영향을 줄 수 있으므로 필요한 함수만 선택적으로 추적하는 것이 좋습니다. 최신 환경에서는 eBPF와 함께 사용하는 방식이 널리 활용됩니다.
마무리
Linux Kprobe는 커널 함수에 동적으로 Probe를 삽입하여 함수 호출을 추적하는 강력한 디버깅 기술입니다. Tracepoint보다 더 유연하게 원하는 함수를 분석할 수 있으며, Kretprobe와 함께 사용하면 함수 실행 시간과 반환값까지 확인할 수 있습니다. eBPF, bpftrace, bpftool과 함께 활용하면 Linux Kernel 내부 동작을 깊이 있게 분석하고 성능 병목이나 장애 원인을 효과적으로 찾아낼 수 있습니다.