eBPF 실전 (4) — 런큐 지연과 컨텍스트 스위치 관측하기
CPU 사용률이 100%가 아닌데도 응답이 느린 서버가 있다. 태스크가 실행 가능(runnable) 상태로 런큐에서 기다린 시간, 즉 런큐 지연(run queue latency)이 원인인 경우가 많은데 top이나 vmstat에는 이 값이 나오지 않는다. /proc/PID/schedstat에…
Linux Kernel
CPU 사용률이 100%가 아닌데도 응답이 느린 서버가 있다. 태스크가 실행 가능(runnable) 상태로 런큐에서 기다린 시간, 즉 런큐 지연(run queue latency)이 원인인 경우가 많은데 top이나 vmstat에는 이 값이 나오지 않는다. /proc/PID/schedstat에…
같은 vfs_read()를 관측하더라도 BPF 프로그램을 붙일 수 있는 훅은 kprobe, fentry, tracepoint, raw tracepoint 등 여러 가지다. 훅마다 인자에 접근하는 방법, 커널 버전이 바뀔 때의 안정성, 이벤트당 비용이 다르다. 고빈도…
eBPF 프로그램은 이벤트 하나를 처리하고 끝나는 짧은 함수라서, 이벤트 사이에 상태를 유지하거나 결과를 유저 공간에 넘기려면 BPF 맵이 필요하다. 문제는 맵 종류가 30가지가 넘고, 잘못 고르면 카운트가 조용히 유실되거나 이벤트가…
커널 동작을 들여다보려면 예전에는 커널 모듈을 만들거나 커널을 다시 빌드해야 했다. 모듈 버그 하나가 곧 커널 패닉이고, 커널 버전이 바뀔 때마다 다시 컴파일해야 한다. eBPF는 검증된 작은 프로그램을 실행 중인…
스핀락(spinlock)과 뮤텍스(mutex)를 잘못 쓴 커널 코드는 대부분 조용히 지나간다. 초기화하지 않은 스핀락은 0으로 채워진 메모리라 x86에서는 그냥 동작하고, 스핀락 안에서 호출한 kmalloc(GFP_KERNEL)은 메모리가 넉넉하면 잠들지 않으니 아무 일도 없다. 그러다…
9월 6일 공개된 리눅스 커널 7.3-rc2에는 기능 추가 없이 코드 모양만 바꾸는 대형 패치가 하나 들어갔습니다. 키스 쿡(Kees Cook)이 보낸 kmalloc_obj() 전환 풀 리퀘스트입니다. 304개 파일에서 637줄이 추가되고 726줄이 삭제됐습니다.…
커널 하드닝 옵션 randstruct와 Rust는 지금까지 한 커널에 함께 들어갈 수 없었습니다. Kconfig에 depends on !RANDSTRUCT가 박혀 있어 둘 중 하나를 켜면 다른 하나가 조용히 꺼집니다. 문제는 이 규칙이 커널의…
클라우드 VM의 디스크를 200GB로 늘렸는데 df -h는 여전히 100GB를 가리킨다. 반대로 LVM 볼륨을 줄였더니 파일시스템이 아예 마운트되지 않는다. 둘 다 흔한 사고이고 원인은 같다. 우리가 "디스크 크기"라고 뭉뚱그려 부르는 값은…
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
2편까지 오면 타깃에 부트로더가 올라가 디스크에서 파일을 읽어 실행하는 데까지 된다. 이제 그 자리에 올릴 커널이 필요하다. 실물 보드라면 벤더가 준 커널 소스를 받아 크로스 컴파일하고 SD 카드에 복사하는 단계인데,…