I/O 스케줄러(mq-deadline/bfq/kyber) 비교
최신 커널은 블록 장치마다 기본으로 mq-deadline을 쓰지만, /sys/block/<dev>/queue/scheduler를 열어보면 bfq, kyber 같은 대안이 함께 나열돼 있다. 이름만 봐서는 언제 바꿔야 하는지 감이 안 오는데, 셋은 애초에 최적화하는 목표 자체가 다르다.…
리눅스 시스템 디버깅
최신 커널은 블록 장치마다 기본으로 mq-deadline을 쓰지만, /sys/block/<dev>/queue/scheduler를 열어보면 bfq, kyber 같은 대안이 함께 나열돼 있다. 이름만 봐서는 언제 바꿔야 하는지 감이 안 오는데, 셋은 애초에 최적화하는 목표 자체가 다르다.…
애플리케이션에서 fsync() 호출이 가끔 몇 ms에서 수십 ms까지 튀는데, iostat의 디바이스 평균 지연시간만 봐서는 그게 큐잉 때문인지 디스크 자체가 느린 건지 구분이 안 될 때가 있다. blktrace는 블록 계층의 각…
"서버가 느려요"라는 신고가 들어오면 vmstat, top, iostat을 순서 없이 아무거나 띄워보다가 우연히 눈에 띈 수치에 매달리기 쉽다. Brendan Gregg가 정리한 USE Method(Utilization / Saturation / Errors)는 이런 무작위 삽질 대신,…
커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…
strace nginx나 strace sh script.sh로 걸어보면 부모 프로세스의 fork/execve까지만 잡히고, 실제 작업을 하는 워커/자식 프로세스 내부는 안 보인다. -f(--follow-forks)가 이 문제를 해결한다. 이 글에서는 -f/-ff/-e trace=로 멀티프로세스·멀티스레드 프로그램을 추적하는 방법을…
구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…
워치포인트로 "이 변수가 언제 바뀌는지"는 잡을 수 있어도, 그 값이 왜 그렇게 됐는지 되짚어 올라가려면 결국 브레이크포인트를 다시 걸고 처음부터 재실행하기를 반복하게 된다. Mozilla의 rr 같은 record-and-replay 디버거는 실행을 통째로…
KASAN은 힙 오버플로우나 use-after-free를 잡아내는 데 강력하지만, 모든 할당에 리다이렉션 존(redzone)과 섀도 메모리 검사를 붙이는 방식이라 오버헤드가 크고 프로덕션에 상시 켜두기는 부담스럽다. KFENCE(Kernel Electric-Fence)는 이 문제를 확률적 샘플링으로 우회한다 —…
락 경합(lock contention)은 멀티코어 시스템에서 흔한 성능 병목 원인이다. CPU 사용률은 높은데 실제 작업 처리량은 그대로거나 오히려 떨어진다면, 스레드들이 실제 일을 하는 대신 서로 락을 기다리며 시간을 보내고 있을 가능성이…
perf stat로 cycles, instructions, cache-misses 몇 개를 조합해 IPC와 미스율을 계산하는 건 코어 하나짜리 애플리케이션이라면 충분하다. 그런데 병목이 프론트엔드인지 백엔드인지까지 확인한 다음, 백엔드라면 그게 L1인지 L2인지 라스트레벨 캐시인지 TLB인지까지 계속…