Huny's Dev Blog

linux process cpu 100% 사용 스레드(thread) 찾기

리눅스에서 특정 프로세스가 CPU 100%를 지속적으로 점유한다면 무한 루프 가능성이 크다. 본 글에서는 ps와 gdb를 이용해 CPU를 가장 많이 소모하는 스레드를 찾아내고, 해당 스레드의 함수 호출 스택(call trace)을 확인하는 방법을 정리한다. 프로세스를 종료하지 않고도 실행 중 문제 원인을 분석할 수 있다.
Hun Jang
Hun JangSep 29, 2025
linux process cpu 100% 사용 스레드(thread) 찾기

linux에서 cpu 100% 사용하는 프로세스에서 thread와 call trace 찾기

리눅스 환경에서 별다른 요청 없이 CPU가 100%로 고정된다면, 대체로 특정 함수 내에서 무한 루프가 발생했을 가능성이 높다. 이를 추적하려면 CPU를 가장 많이 소모하는 스레드를 찾아 해당 스레드의 함수 호출 구조를 확인해야 한다.

스레드 별 CPU 사용량 확인

  1. 우선 PID를 확보한다.
  1. 다음 명령어로 각 스레드(TID)의 CPU 사용량을 정렬해 확인한다:
    ps -L -o pid,tid,pcpu,comm -p <PID> --sort=-pcpu
    bash
    • TID는 스레드 ID
    • PCPU가 높은 스레드가 무한 루프에 빠졌을 가능성이 크다.

gdb로 실행 중 프로세스 attach

문제가 된 스레드(TID)를 확인했다면 gdb를 이용해 프로세스에 직접 attach한다:

gdb -p <PID>
bash

이후 다음 단계를 따른다.

  1. 페이지네이션 해제
    set pagination off
    출력이 많아도 --More--로 멈추지 않고 전체 스택을 한 번에 보여주기 위함이다.
  1. 스레드 확인
    info threads
    • 현재 프로세스의 모든 스레드 목록을 확인한다.
    • 각 스레드는 LWP XXXX 형태로 표시되는데, 여기서 LWP가 곧 TID다.
  1. 스택 추적
    thread apply all bt
    • 모든 스레드의 함수 호출 스택을 출력한다.
    • CPU 100% 스레드에 해당하는 LWP를 찾아 어떤 함수에서 멈춰 있는지 확인한다.

분석 포인트

  • 정상적인 스레드는 함수 호출이 계속 바뀌지만, 무한 루프에 빠진 스레드는 동일한 함수에 머물러 있는 경우가 많다.
  • 함수명이 심볼 정보 부족으로 보이지 않을 수도 있으나, 호출 구조를 통해 어느 부분에서 정체돼 있는지 유추가 가능하다.
  • 이 방식은 프로세스를 종료하거나 재시작하지 않고도 실행 중인 상태 그대로 스레드 단위 추적이 가능하다는 장점이 있다.