리눅스 시스템 디버깅

BCC

커널 내부에서 어떤 프로세스가 어떤 파일을 열고, 어떤 시스템 콜을 얼마나 호출하는지 확인하고 싶을 때 strace는 대상 프로세스 하나에 붙어야 하고 오버헤드도 커서 운영 중인 서버에서 시스템 전체를 훑어보기엔 부담스럽다.…

Continue ReadingBCC

perf 소프트웨어 이벤트로 CPU 병목 진단하기

클라우드 VM이나 컨테이너에서 perf stat -e cycles를 돌리면 "not supported"만 뜨고 아무것도 안 나오는 경우가 흔하다. 하이퍼바이저가 하드웨어 성능 카운터(PMU)를 게스트에 노출하지 않기 때문인데, IPC나 캐시 미스 같은 마이크로아키텍처 지표는…

Continue Readingperf 소프트웨어 이벤트로 CPU 병목 진단하기

dirty writeback 튜닝과 프레임 드롭의 인과관계

버퍼링된 쓰기(write())는 대부분 페이지 캐시에만 반영되고 바로 리턴되지만, dirty 페이지가 일정 기준을 넘으면 커널이 그 프로세스의 write() 호출 자체를 블로킹시켜 디스크가 따라잡을 때까지 강제로 기다리게 한다. 영상 인코더나 로깅 스레드처럼…

Continue Readingdirty writeback 튜닝과 프레임 드롭의 인과관계

I/O 스케줄러(mq-deadline/bfq/kyber) 비교

최신 커널은 블록 장치마다 기본으로 mq-deadline을 쓰지만, /sys/block/<dev>/queue/scheduler를 열어보면 bfq, kyber 같은 대안이 함께 나열돼 있다. 이름만 봐서는 언제 바꿔야 하는지 감이 안 오는데, 셋은 애초에 최적화하는 목표 자체가 다르다.…

Continue ReadingI/O 스케줄러(mq-deadline/bfq/kyber) 비교

USE Method로 리눅스 성능 문제 진단하기

"서버가 느려요"라는 신고가 들어오면 vmstat, top, iostat을 순서 없이 아무거나 띄워보다가 우연히 눈에 띈 수치에 매달리기 쉽다. Brendan Gregg가 정리한 USE Method(Utilization / Saturation / Errors)는 이런 무작위 삽질 대신,…

Continue ReadingUSE Method로 리눅스 성능 문제 진단하기

kgdb로 원격 시스템 라이브 디버깅하기

커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…

Continue Readingkgdb로 원격 시스템 라이브 디버깅하기

strace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

strace nginx나 strace sh script.sh로 걸어보면 부모 프로세스의 fork/execve까지만 잡히고, 실제 작업을 하는 워커/자식 프로세스 내부는 안 보인다. -f(--follow-forks)가 이 문제를 해결한다. 이 글에서는 -f/-ff/-e trace=로 멀티프로세스·멀티스레드 프로그램을 추적하는 방법을…

Continue Readingstrace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

pahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지

구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…

Continue Readingpahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지

GDB record full로 역방향 디버깅하기 — 하드웨어 카운터 없이 되감는 rr 대안

워치포인트로 "이 변수가 언제 바뀌는지"는 잡을 수 있어도, 그 값이 왜 그렇게 됐는지 되짚어 올라가려면 결국 브레이크포인트를 다시 걸고 처음부터 재실행하기를 반복하게 된다. Mozilla의 rr 같은 record-and-replay 디버거는 실행을 통째로…

Continue ReadingGDB record full로 역방향 디버깅하기 — 하드웨어 카운터 없이 되감는 rr 대안