Android System & AOSP Engineering/Debug, ADB & System Tools

안드로이드 ADB 성능 분석 가이드: CPU 사용량부터 메모리 및 온도 확인까지

임베디드 친구 2025. 2. 24. 12:31
반응형

안드로이드 기반의 시스템 앱을 개발하거나 임베디드 디바이스 환경에서 프레임워크를 최적화할 때 디바이스의 하드웨어 리소스 상태를 정확하게 파악하는 것은 서비스 안정성을 확보하기 위한 첫걸음입니다. 특히 장시간 구동 시 발생하는 메모리 누수나 특정 이벤트 시점에 CPU 점유율이 튀는 현상, 그리고 프로세스 과부하로 인한 발열 스로틀링(성능 제어) 문제는 사용자 경험을 해치는 주요 원인이 됩니다. 안드로이드 스튜디오의 프로파일러 같은 그래픽 도구도 훌륭하지만, 백그라운드에서 자동화 스크립트를 돌리거나 가벼운 터미널 환경에서 빠르게 리소스 덤프를 추출해야 할 때는 ADB(Android Debug Bridge) 커맨드 라인 툴이 가장 강력한 무기가 됩니다. 이번 포스팅에서는 안드로이드 서브시스템이 제공하는 다양한 성능 분석 명령어의 특징과 커널 가상 파일 시스템의 로우 데이터를 직접 해석하는 방법을 정리해 보겠습니다.

Generated by Gemini AI.

핵심 요약

  • dumpsys 서브시스템 명령어를 활용하면 특정 애플리케이션의 세부 메모리 할당(PSS) 상태와 전체 프로세스의 CPU 누적 점유율을 체계적으로 덤프할 수 있습니다.
  • top 툴과 /proc/stat 커널 시스템 파일 아카이빙을 결합하면 실시간 프로세스 스케줄링 상태와 CPU 코어별 코어 타임 소비 내역을 분석할 수 있습니다.
  • 가상 파일 시스템 레이어의 써멀 존 인덱스 값을 터미널에서 직접 파싱하면 외부 프로파일링 장비 없이도 칩셋의 실시간 열화 상태를 점검할 수 있습니다.

1. ADB 성능 모니터링 핵심 명령어 및 데이터 포인트

안드로이드 단말기의 런타임 리소스를 점검할 수 있는 핵심 커맨드 구조와 반환되는 가치 정보의 분류입니다.

분석 타깃 영역 터미널 실행 명령어 구조 핵심 데이터 및 판독 지표
통합 CPU 정보 adb shell dumpsys cpuinfo 시스템 전체 및 프로세스별 유저/커널 모드 소비 비율 파악
상세 메모리 분석 adb shell dumpsys meminfo <패키지명> Native Heap, Dalvik Heap 영역의 Pss Total 및 Private Dirty 크기 정밀 측정
실시간 런타임 adb shell top -n 1 현재 구동 중인 태스크들의 PID, 쓰레드 개수, 메모리(RSS) 점유 순위 정렬
리눅스 커널 통계 adb shell cat /proc/stat 시스템 부팅 이후 각 코어가 유저, 시스템, I/O 대기 등에 소비한 가상 틱 타임 조회
칩셋 써멀 진단 adb shell cat /sys/class/thermal/thermal_zone0/temp AP 칩셋 또는 배터리 주변부의 물리적 온도를 밀리도 단위로 즉시 추출

2. 세부 지표 분석 및 출력 데이터 해석

1. CPU 점유 상태 분석 (dumpsys cpuinfo)

명령어를 실행하면 시스템 내부 스케줄러가 기록한 통계 수치가 반환됩니다.

Bash
 
adb shell dumpsys cpuinfo
  • 출력 메커니즘 정보: 상단에 표시되는 Load 필드는 순서대로 최근 1분, 5분, 15분간의 시스템 평균 부하량(Load Average)을 의미합니다. 프로세스 리스트 옆에 표기되는 user는 사용자 앱 코드가 소비한 시간이며, kernel은 시스템 콜 처리를 위해 리눅스 커널 레이어가 소비한 연산 자원입니다.

2. 메모리 샌드박스 정밀 진단 (dumpsys meminfo)

특정 패키지명을 명시하여 실행하면 런타임 메모리 가상 맵 정보가 그리드 형태로 덤프됩니다.

Bash
 
adb shell dumpsys meminfo com.example.app
  • 판독 팁: 여러 수치 중 Pss Total 영역을 가장 눈여겨보아야 합니다. PSS(Proportional Set Size)는 해당 프로세스가 독점적으로 사용하는 메모리에 다른 프로세스와 공유하는 메모리 크기를 공유 프로세스 개수로 나눈 값을 더한 수치로, 실제 물리 메모리 소비량을 가장 가깝게 반영합니다. C/C++ 레이어에서 할당한 공간은 Native Heap에 잡히고, 자바나 코틀린 객체가 상주하는 공간은 Dalvik Heap 항목에서 검증할 수 있습니다.

3. 리눅스 통계 및 써멀 메트릭 매핑 (/proc 및 /sys)

리눅스 커널이 실시간으로 갱신하는 가상 파일 시스템의 텍스트 노드를 파싱하는 기법입니다.

Bash
 
# CPU 가상 통계 테이블 덤프
adb shell cat /proc/stat

# 베이스 써멀 존 온도 센서 데이터 조회
adb shell cat /sys/class/thermal/thermal_zone0/temp
  • 통계 필드 매핑 테이블: /proc/stat의 첫 줄 cpu 항목 바로 뒤에 나열되는 숫자 배열의 의미는 아래 테이블과 같습니다.
인덱스 순서 필드 명칭 데이터가 의미하는 세부 내용
1번째 user 우선순위 변경 없이 사용자 공간에서 프로세스가 실행된 총 시간
2번째 nice 우선순위(nice 값)가 낮아진 상태로 사용자 공간에서 소비된 시간
3번째 system 커널 공간의 제어문 및 시스템 콜을 처리하는 데 소비된 시간
4번째 idle 어떠한 작업도 수행하지 않고 CPU가 대기 상태로 머문 시간
5번째 iowait 디스크 나 스토리지 등 I/O 작업이 완료되기를 기다린 대기 시간
6번째 irq 하드웨어 인터럽트 서비스 루틴(ISR)을 처리한 시간
7번째 softirq 소프트웨어 인터럽트(소프트 IRQ) 하반부 처리에 소비된 시간

개발을 위한 팁

  • top 명령어 옵션 최적화: 실시간으로 리소스 추이를 볼 때 단순히 top -n 1만 치면 일회성 스냅샷만 보고 끝나게 됩니다. 지속적인 관찰이 필요하다면 adb shell top -d 2 처럼 -d 옵션을 주어 2초 간격으로 화면을 갱신하도록 만들 수 있습니다. 추가로 메모리 소비 순으로 정렬하고 싶다면 -o RSS 옵션을, CPU 점유율 순으로 정렬하고 싶다면 -o %CPU 옵션을 바인딩하여 스크립트를 최적화하시기 바랍니다.
  • 써멀 존 인덱스 다변화 매핑: 디바이스 제조사나 AP 칩셋 아키텍처에 따라 thermal_zone0 노드가 가리키는 센서 위치가 제각각 다를 수 있습니다. 어떤 노드가 메인 AP 센서인지 명확히 구별하려면 adb shell cat /sys/class/thermal/thermal_zone*/type 명령을 먼저 수행하여 각 존의 명칭(예: tsens_tz_sensor0, battery 등)을 확인한 뒤 매칭되는 인덱스의 temp 파일을 읽어오는 것이 정확합니다.
  • 메모리 덤프 자동화 파이프라인 구성: 앱의 특정 시나리오 전후로 메모리 변화를 자동 측정하려면 adb shell dumpsys meminfo 결과에서 PSS 단일 행만 추출하는 파이프라인을 구성하면 좋습니다. adb shell dumpsys meminfo <패키지명> | grep "TOTAL" 형태로 명령을 조합하면 쉘 스크립트 빌드 시 텍스트 전체를 파싱하는 수고를 덜 수 있습니다.

흔히 하는 실수

  • top 점유율 수치의 스케일 착각: 멀티코어(예: 옥타코어) 환경을 사용하는 최신 안드로이드 기기에서 top 명령어를 실행하면 특정 단일 앱의 CPU 점유율이 100%를 초과하여 200%나 300%까지 찍히는 현상을 볼 수 있습니다. 이는 안드로이드 최신 버전의 top 툴이 코어 1개당 최대치 100%를 기준으로 계산하는 리눅스 표준 방식을 따르기 때문입니다. 전체 코어 자원 대비 실제 소비량을 보려면 해당 수치를 전체 물리 코어 개수로 나누어 주어야 에러 마진이 없는 통계가 나옵니다.
  • 써멀 데이터 스케일 파싱 오류: /sys/class/thermal/ 하부 노드에서 리턴되는 온도 텍스트 데이터는 일반 소수점 형태가 아닌 정수형 밀리도 단위를 디폴트로 사용합니다. 콘솔창에 42500이라는 수치가 찍혔다면 이는 42500도가 아니라 1000으로 나눈 값인 42.5°C를 의미하므로, 모니터링 툴 엔진에 데이터를 파싱하여 적재할 때 데이터 스케일 변환 처리를 누락하지 않도록 주의해야 합니다.
  • 공유 메모리 중복 계산 오류: 프로세스의 가상 메모리 크기인 VSS나 물리 페이지 점유 총량인 RSS 지표만 보고 앱이 메모리를 과도하게 쓴다고 판단하면 오류를 범하게 됩니다. RSS에는 시스템 공통 라이브러리(예: libc.so)의 크기가 중복 할당된 것으로 잡히기 때문에 실제로 내 앱이 힙 영역에서 누수를 유발하는지 추적할 때는 반드시 공유 지분을 보정한 PSS 혹은 프로세스 독점 점유 공간인 Private Dirty 수치를 가치 지표로 삼아야 합니다.

결론

ADB 서브시스템 기반의 프로파일링 기법은 물리 인프라 리소스가 제한적인 임베디드 안드로이드 환경이나 가벼운 자동화 리그 환경에서 시스템 성능의 병목 구간을 진단할 수 있는 가장 직관적인 수단입니다. 프레임워크 저수준 레이어에서 올라오는 가상 파일 시스템 노드 데이터와 통합 덤프 유틸리티의 특성을 정확히 이해하면 무거운 상용 프로파일러 도움 없이도 시스템 런타임의 이상 징후를 추적할 수 있는 독자적인 자동화 모니터링 시스템을 구축할 수 있습니다. 본 가이드에 정리된 영역별 핵심 커맨드와 메트릭 판독 공식을 실무 자동화 리그 테스트 및 성능 최적화 검증 단계에 적극적으로 활용해 보시기 바랍니다.

반응형