linux에서 cpu 100% 사용하는 프로세스에서 thread와 call trace 찾기
리눅스 환경에서 별다른 요청 없이 CPU가 100%로 고정된다면, 대체로 특정 함수 내에서 무한 루프가 발생했을 가능성이 높다. 이를 추적하려면 CPU를 가장 많이 소모하는 스레드를 찾아 해당 스레드의 함수 호출 구조를 확인해야 한다.
스레드 별 CPU 사용량 확인
- 우선 PID를 확보한다.
- 다음 명령어로 각 스레드(TID)의 CPU 사용량을 정렬해 확인한다:bash
ps -L -o pid,tid,pcpu,comm -p <PID> --sort=-pcpu
TID
는 스레드 ID
PCPU
가 높은 스레드가 무한 루프에 빠졌을 가능성이 크다.
gdb로 실행 중 프로세스 attach
문제가 된 스레드(TID)를 확인했다면 gdb
를 이용해 프로세스에 직접 attach한다:
gdb -p <PID>
이후 다음 단계를 따른다.
- 페이지네이션 해제
set pagination off
출력이 많아도 --More--로 멈추지 않고 전체 스택을 한 번에 보여주기 위함이다.
- 스레드 확인
info threads
- 현재 프로세스의 모든 스레드 목록을 확인한다.
- 각 스레드는
LWP XXXX
형태로 표시되는데, 여기서LWP
가 곧 TID다.
- 스택 추적
thread apply all bt
- 모든 스레드의 함수 호출 스택을 출력한다.
- CPU 100% 스레드에 해당하는 LWP를 찾아 어떤 함수에서 멈춰 있는지 확인한다.
분석 포인트
- 정상적인 스레드는 함수 호출이 계속 바뀌지만, 무한 루프에 빠진 스레드는 동일한 함수에 머물러 있는 경우가 많다.
- 함수명이 심볼 정보 부족으로 보이지 않을 수도 있으나, 호출 구조를 통해 어느 부분에서 정체돼 있는지 유추가 가능하다.
- 이 방식은 프로세스를 종료하거나 재시작하지 않고도 실행 중인 상태 그대로 스레드 단위 추적이 가능하다는 장점이 있다.