htop 및 Linux 프로세스 모니터링 이해
htop 및 Linux 프로세스 모니터링 이해
htop 및 Linux 프로세스 모니터링 이해
htop은 Linux용 인터랙티브 프로세스 뷰어로, 시스템 리소스에 대한 실시간 개요를 제공합니다. 데이터를 올바르게 해석하려면 Linux 커널이 작업을 추적하고 /proc 의사 파일 시스템을 통해 해당 정보를 어떻게 노출하는지 이해해야 합니다.
시스템 가동 시간 및 /proc 파일 시스템
시스템 가동 시간은 마지막 부팅 이후 머신이 얼마나 오래 실행되고 있는지를 나타냅니다. htop과 uptime 명령은 이 값을 /proc/uptime에서 가져옵니다.
- 데이터 소스:
/proc/uptime에는 두 개의 숫자가 들어 있습니다. 시스템이 켜져 있던 총 초와 시스템이 유휴 상태였던 총 초입니다. - 멀티코어 시스템: 멀티코어 머신에서는 모든 CPU 코어에 걸친 누적 합이므로 유휴 시간 값이 전체 가동 시간보다 클 수 있습니다.
Load Average 해석
Load average는 현재 실행 중이거나 실행 대기 중인(runnable) 프로세스 수와, 중단할 수 없는 대기 상태(보통 I/O 대기)인 프로세스 수의 평균을 나타냅니다.
Load와 CPU 활용도
Load average는 CPU 사용률의 직접적인 퍼센트가 아닙니다. 대신 작업 수를 나타냅니다. 예를 들어, 단일 코어 머신에서 1.0의 load average는 100% 활용을 의미합니다. 듀얼 코어 머신에서는 1.0이 50% 활용을 의미합니다.
계산 방식
Load average는 1분, 5분, 15분 간격에 대한 부하 수의 지수 감쇠 이동 평균입니다. 중단할 수 없는 대기(D 상태) 프로세스를 포함하기 때문에, CPU 활용도가 낮아도 시스템은 높은 load average를 보일 수 있으며, 이는 보통 디스크나 네트워크 I/O 병목을 나타냅니다.
프로세스 식별 및 계층 구조
프로세스 ID (PID)
각 프로세스에는 고유한 프로세스 ID(PID)가 할당됩니다. 커널은 /proc/<pid>/에 모든 프로세스에 대한 상세 정보를 노출합니다. 예를 들어, /proc/<pid>/cmdline은 프로세스를 시작한 명령을 보여주고, /proc/<pid>/exe는 실행된 바이너리로의 심볼릭 링크입니다.
프로세스 트리
프로세스는 부모‑자식 계층 구조를 가집니다. 셸(bash 등)이 프로그램을 실행할 때 fork 시스템 콜로 자신을 복제하고 exec 시스템 콜로 새 프로그램을 로드합니다. 이렇게 생성된 트리는 htop에서 F5 키를 눌러 시각화할 수 있습니다.
프로세스 상태 해독
htop의 S 열은 프로세스의 현재 상태를 나타냅니다. 이러한 상태를 이해하는 것은 시스템 정지나 성능 문제를 진단하는 데 중요합니다.
| State | Meaning | Description |
|---|---|---|
| R | Running/Runnable | 프로세스가 실제로 CPU에서 명령을 실행 중이거나 실행 대기열에 있어 차례를 기다리고 있습니다. |
| S | Interruptible Sleep | 프로세스가 이벤트(예: 타이머나 네트워크 패킷)를 기다리고 있으며 시그널에 의해 깨울 수 있습니다. |
| D | Uninterruptible Sleep | 프로세스가 I/O(주로 디스크)를 기다리고 있어 SIGKILL을 포함한 시그널로는 중단될 수 없습니다. |
| Z | Zombie | 프로세스가 종료되었지만 부모가 wait 시스템 콜을 통해 종료 코드를 아직 읽지 않았습니다. |
| T | Stopped | 작업 제어 시그널(예: Ctrl+Z)이나 디버거에 의해 프로세스가 정지되었습니다. |
메모리 사용 지표
Linux는 가상 메모리를 사용해 프로세스를 격리하므로 htop에 표시되는 메모리 수치는 직관적이지 않을 수 있습니다.
- VIRT (Virtual Image): 프로세스가 접근할 수 있는 가상 메모리 전체 양입니다. 여기에는 공유 라이브러리, 스와핑된 페이지, 메모리 매핑 파일이 포함됩니다. 일반적으로 과장된 수치이며 실제 RAM 사용량을 판단하는 데는 가장 덜 유용합니다.
- RES (Resident Size): 현재 작업이 사용 중인 스와핑되지 않은 물리 메모리 양입니다. 프로세스 실제 메모리 사용량을 파악하는 가장 신뢰할 수 있는 지표입니다.
- SHR (Shared Mem): 다른 프로세스와 공유될 수 있는 메모리(예: 공유 라이브러리)입니다.
- MEM%: 프로세스가 사용 중인 물리 RAM 비율로,
RES / Total RAM으로 계산됩니다.
프로세스 우선순위와 Niceness
Linux 스케줄러는 우선순위에 따라 다음에 실행할 프로세스를 결정합니다.
- Niceness (NI): -20(가장 높은 우선순위)부터 19(가장 낮은 우선순위)까지의 사용자 공간 값입니다. "더 친절한" 프로세스는 다른 프로세스에 더 많은 CPU 시간을 양보합니다.
- Priority (PRI): 커널 공간 우선순위이며 일반적으로
PR = 20 + NI관계를 가집니다.
커뮤니티 인사이트
경험 많은 사용자들은 htop을 보다 효율적으로 사용하기 위한 여러 최적화를 제안합니다:
- 뷰 최적화: 사용자 스레드를 비활성화하고 프로세스 트리 뷰를 활성화하면 잡동사니가 줄어들고 프로세스 출처에 대한 컨텍스트가 향상됩니다.
- 대체 도구: 일부 사용자는 GPU 모니터링 및 전력 사용량(와트) 표시를 포함한 보다 현대적인 인터페이스를 제공하는
btop을 추천합니다.htop에는 이러한 기능이 없습니다. - 메모리 해석: 커뮤니티 구성원들은 가상 메모리가 종종 오해를 불러일으킨다고 강조합니다. 예를 들어, 메모리 매핑 파일은 실제 물리 RAM을 많이 차지하지 않으면서
VIRT를 부풀릴 수 있습니다.
"Resident size가 가장 신뢰할 수 있는 지표입니다. 그 외의 다른 수치는 무해한 메모리 매핑 파일처럼 실제로는 큰 영향을 주지 않는 요소에 의해 부풀려질 수 있습니다."
일반적인 시스템 프로세스
표준 Ubuntu Server 설치에서는 여러 핵심 데몬이 htop에 보입니다:
- /sbin/init (systemd): 부팅 시 가장 먼저 시작되는 프로세스(PID 1)로, 모든 다른 시스템 프로세스의 부모 역할을 합니다.
- systemd-journald: 구조화된 로그 데이터를 수집하고 저장합니다.
- sshd: 원격 암호화 연결을 관리하는 OpenSSH 데몬입니다.
- cron: 정기적으로 예약 작업을 실행하는 데몬입니다.