블로그로 돌아가기

macOS의 프로세스 모니터링이란? 개발자를 위한 설명

macOS의 프로세스 모니터링이란 실행 중인 프로그램, 그 리소스 사용량과 관계를 추적하는 것을 뜻합니다. 프로세스가 무엇인지, PID와 프로세스 트리가 어떻게 작동하는지, 그리고 개발자에게 왜 Activity Monitor 이상이 필요한지 알아보세요.

프로세스 모니터링이란 Mac에서 실행 중인 프로그램을 실시간으로 관찰하고 검사하고 관리하는 행위입니다. macOS에서 코드를 작성한다면 프로세스 모니터링을 이해하는 것은 선택이 아닙니다. 디버깅, 성능 튜닝, 보안 분석의 토대이기 때문입니다. 이 글은 프로세스 모니터링이 실제로 무엇을 의미하는지, 내부적으로 무엇이 관여하는지, 그리고 기본 제공 도구가 어디서부터 쓸모를 잃는지 설명합니다.

빠른 요약

macOS의 프로세스 모니터링은 실행 중인 프로그램(프로세스), 그 리소스 소비량, 부모-자식 관계, 런타임 컨텍스트를 추적하는 행위입니다. macOS는 각 프로세스에 고유한 PID를 부여하며, 모니터링 도구를 통해 CPU, 메모리, 열린 파일, 환경 변수, 프로세스 계보를 관찰하여 문제를 진단할 수 있습니다.

macOS의 프로세스란 무엇인가?

애플리케이션을 실행하거나, 셸 명령을 실행하거나, 백그라운드 서비스를 트리거할 때마다 macOS는 프로세스를 생성합니다. 프로세스는 자체 메모리 공간, 파일 디스크립터, 실행 컨텍스트를 가진, 실행 중인 프로그램의 격리된 인스턴스입니다. 커널(Apple의 하이브리드 커널인 XNU)이 프로세스 스케줄링, 리소스 할당, 프로세스 간 통신을 관리합니다.

PID: 신원 체계

각 프로세스는 생성 시점에 커널이 부여하는 양의 정수인 **프로세스 ID(PID)**를 받습니다. PID는 현재 실행 중인 프로세스들 사이에서 고유하며, kill부터 Activity Monitor까지 모든 도구가 특정 프로세스를 가리킬 때 사용하는 방식입니다. macOS의 맨 처음 프로세스는 launchd(PID 1)로, 다른 모든 서비스를 시작하고 감독하는 시스템 전역 프로세스 관리자입니다.

프로세스 트리: 부모-자식 계층

프로세스는 고립되어 존재하지 않습니다. 한 프로세스가 다른 프로세스를 생성하면(fork() 또는 posix_spawn()을 통해), 생성한 쪽이 부모가 되고 새 프로세스가 그 자식이 됩니다. 이는 launchd를 뿌리로 하는 트리 구조를 형성합니다. 예를 들면:

이 트리를 이해하는 것이 중요합니다. 빌드가 실패하거나 프로세스가 예상치 못한 리소스를 소비할 때, 부모-자식 사슬은 문제가 단지 어디서 나타나는지가 아니라 어디서 비롯되었는지를 알려 줍니다.

개발자에게 프로세스 모니터링이 필요한 이유

일반 사용자는 Mac이 느려졌을 때 Activity Monitor를 확인합니다. 개발자는 근본적으로 다른 이유로 프로세스 모니터링이 필요합니다.

다중 프로세스 애플리케이션 디버깅

현대의 macOS 애플리케이션은 단일 프로세스인 경우가 드뭅니다. Electron 앱, 브라우저 엔진, Xcode와 Bazel 같은 빌드 시스템, 컨테이너 런타임은 모두 복잡한 프로세스 계층을 생성합니다. 크래시를 일으킨 특정 자식 프로세스까지 추적해야 할 때, 프로세스 이름의 평면 목록은 거의 쓸모가 없습니다.

실행 실패 진단

프로세스가 잘못된 환경 변수, 부정확한 작업 디렉터리, 누락된 권한으로 시작되면, 실행 컨텍스트를 검사하지 않고는 보이지 않는 방식으로 실패합니다. 프로세스 생성 시점의 PATH, DYLD_FRAMEWORK_PATH, 또는 사용자 지정 변수를 아는 것이 해결로 가는 가장 빠른 길인 경우가 많습니다.

일시적 프로세스 잡아내기

빌드 툴체인(컴파일러, 링커, 코드 생성기)은 밀리초 단위로 생성되고 종료됩니다. 성능 프로파일링과 빌드 디버깅은 이 수명이 짧은 프로세스가 사라지기 전에 잡아내야 합니다.

보안 감사

개발 머신에서 실행되는 서명되지 않았거나 ad-hoc 서명된 프로세스는 손상된 도구를 의미할 수 있습니다. 실행 중인 모든 프로세스의 코드 서명과 권한을 모니터링하는 것은 기본적인 위생 단계입니다.

프로세스 모니터링을 위한 macOS 기본 제공 도구

macOS는 다양한 추상화 수준의 여러 프로세스 모니터링 도구를 함께 제공합니다.

Activity Monitor

/Applications/Utilities/Activity Monitor.app에 있는 GUI 도구입니다. 프로세스별 CPU, 메모리, 에너지, 디스크, 네트워크 통계를 실시간으로 제공합니다. “무엇이 내 CPU를 쓰고 있지?”에 답하기에는 충분하지만, 개발자 워크플로에는 제한적입니다. 트리 보기도, 환경 검사도, 정규식 필터링도, 수명이 짧은 프로세스 캡처도 없습니다.

명령줄 도구

도구용도한계
psPID, CPU, 메모리가 포함된 실행 중 프로세스의 스냅샷정적 스냅샷만 제공; 실시간 갱신 없음
top리소스 사용량으로 정렬된 실시간 프로세스 목록트리 보기 없음; 제한적 필터링
lsofPID의 열린 파일, 소켓, 포트 나열프로세스당 출력이 수천 줄에 달할 수 있음
dtrace동적 커널 수준 추적SIP 수정 필요; 가파른 학습 곡선
sample특정 PID에 대한 CPU 샘플링한 번에 한 프로세스만 대상
spindump시스템 전역 멈춤 및 스핀 리포트사후 분석이며 실시간 모니터링이 아님

이 도구들은 개별적으로는 강력하지만 파편화되어 있습니다. 단일 디버깅 세션을 위해 ps, lsof, dtrace의 데이터를 서로 연관 짓는 데는 상당한 수작업이 필요합니다.

기본 제공 도구가 부족한 지점

Activity Monitor와 원시 명령줄 도구 사이의 간극에 대부분의 개발자 답답함이 자리합니다. 구체적으로:

ProcXray는 이러한 간극을 메우기 위해 만들어졌습니다. 실시간 프로세스 트리 렌더링, 환경 변수 검사, 모든 프로세스 메타데이터에 대한 정규식 검색, 수명이 짧은 프로세스 보존, 코드 서명 검증을 갖춘 네이티브 macOS 인터페이스를 제공합니다. 개발자가 디버깅 중 실제로 필요로 하는 데이터를 하나의 창에 모은 것입니다.

핵심 개념 요약

개념의미
프로세스자체 메모리와 PID를 가진, 실행 중인 프로그램의 인스턴스
PID커널이 부여한 고유한 정수 식별자
프로세스 트리프로세스 간의 계층적 부모-자식 관계
환경 변수프로세스 생성 시 상속되어 런타임 동작에 영향을 주는 키-값 쌍
코드 서명바이너리의 출처와 무결성에 대한 암호학적 증거
권한서명된 바이너리에 내장된, 선언된 기능(예: 네트워크 접근, 파일 시스템 샌드박싱)

자주 묻는 질문

macOS에서 프로세스와 스레드의 차이는 무엇인가요?

프로세스는 자체 메모리 공간과 PID를 가진 독립적인 실행 단위입니다. 스레드는 프로세스의 메모리를 공유하는, 프로세스 _내부_의 가벼운 실행 경로입니다. macOS는 CPU 코어에 프로세스가 아니라 스레드를 스케줄링합니다. 프로세스 모니터링 도구는 프로세스를 추적하고, Instruments 같은 프로파일링 도구는 프로세스 내부의 스레드를 추적합니다.

관리자 권한 없이 macOS에서 프로세스를 모니터링할 수 있나요?

네, 본인 사용자 계정이 소유한 프로세스라면 가능합니다. Activity Monitor, ps, ProcXray 같은 도구는 상승된 권한 없이도 본인의 프로세스를 보여줍니다. root나 다른 시스템 사용자가 소유한 프로세스를 검사하려면 관리자 접근 권한이나 특정 권한이 필요합니다.

프로세스 모니터링은 애플리케이션 성능 모니터링(APM)과 어떻게 다른가요?

프로세스 모니터링은 OS 수준에서 동작합니다. 어떤 언어나 프레임워크를 쓰든 상관없이 모든 프로세스를 추적합니다. APM 도구(Datadog, New Relic 등)는 여러분의 애플리케이션 코드를 계측하여 요청 지연 시간, 오류율, 비즈니스 지표를 추적합니다. 둘은 상호 보완적입니다. 프로세스 모니터링은 무엇이 실행 중이고 다른 프로세스와 어떻게 연관되는지를 알려 주고, APM은 여러분의 애플리케이션이 내부에서 무엇을 하는지를 알려 줍니다.

출처 및 참고 자료

ProcXray 다운로드 → — 무료, macOS Sonoma+.