리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 33 / 50 · Part 4. 프로세스·서비스·리소스
실습 환경: Rocky Linux 9 (10.0.0.200) · 상단 요약은 실습 환경 실제 출력
이전 글: 32. ps로 프로세스 분석
32편의 ps는 실행한 순간의 스냅샷 이다. 그런데 자원 문제는 대개 시간에 따라 변한다. CPU가 순간적으로 튀는지, 계속 높은지, 어떤 프로세스가 번갈아 자원을 먹는지 보려면 실시간 도구가 필요하다. 이것이 top이다.
관제 관점에서 top이 중요한 이유는 자원 이상이 침해의 첫 신호 인 경우가 많기 때문이다.
이번 글은 top 상단 5줄의 의미를 정확히 읽는 방법에 집중한다.
| 영역 | 내용 |
|---|---|
| 1행 | 현재 시각, 가동 시간(up), 로그인 사용자 수, load average |
| 2행 | 프로세스 수: 전체, 실행(R), 대기(S), 정지(T), 좀비(Z) |
| 3행 | CPU 시간 비율: us, sy, ni, id, wa, hi, si, st |
| 4~5행 | 메모리·스왑: total, free, used, buff/cache, avail |
| 아래 | 프로세스 목록 (기본 %CPU 순) |
실행 중(R)이거나 CPU를 기다리는 프로세스와 D 상태(I/O 대기) 프로세스의 평균 개수 를 1분·5분·15분 단위로 보여준다. 기준은 CPU 코어 수다.
| 코어 수 | load 2.0 | load 8.0 |
|---|---|---|
| 2 | 가득 참 (100%) | 4배 과부하 |
| 8 | 25% | 가득 참 |
그래서 load average만 보고 판단하지 말고 반드시 nproc로 코어 수를 함께 본다. 또 Linux의 load에는 D 상태가 포함 되므로 CPU는 한가한데 load가 높다면 디스크·NFS 문제일 수 있다.
| 항목 | 의미 | 높을 때 의심 |
|---|---|---|
us | 사용자 공간 코드 | 채굴, 무거운 애플리케이션 |
sy | 커널 코드 (System Call 처리 등) | 대량 연결·파일 작업 |
ni | nice로 우선순위를 낮춘 프로세스 | 채굴기가 들키지 않으려 nice를 쓰기도 함 |
id | 유휴 | |
wa | I/O 대기 | 디스크 병목, 대량 암호화·복사 |
hi / si | 하드웨어 / 소프트웨어 인터럽트 | 네트워크 트래픽 폭증 |
st | 하이퍼바이저에 뺏긴 시간 (VM) | 호스트 과부하 |
| 컬럼 | 의미 |
|---|---|
PR / NI | 우선순위 / nice 값 (-20 높음 ~ 19 낮음) |
VIRT / RES / SHR | 가상 / 실제 / 공유 메모리 |
S | 상태 (31편) |
TIME+ | 누적 CPU 시간 (1/100초 단위) |

top도 ps처럼 /proc을 읽는다. /proc/loadavg(load average), /proc/stat(CPU 시간), /proc/meminfo(메모리), /proc/<PID>/stat(프로세스)을 주기적으로(기본 3초) 다시 읽어 차이를 계산한다. CPU 사용률은 "직전 측정 이후 얼마나 CPU 시간을 썼는가"라서, 첫 화면(-n1)의 값은 짧은 구간 기준이다.
실습 환경에서 실행한 실제 상단 요약이다(2 vCPU, 유휴 상태).
top - 22:35:11 up 21 min, 0 user, load average: 0.10, 0.07, 0.01
Tasks: 62 total, 1 running, 61 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8032.1 total, 7053.6 free, 710.2 used, 568.5 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 7321.8 avail Mem
# 1) 기본 실행 (q로 종료)
top
# 2) 대화형 키
# P: CPU 순 M: 메모리 순 1: 코어별 CPU H: 스레드 보기
# c: 전체 명령줄 u: 사용자 필터 k: PID에 시그널 보내기 o: 조건 필터(예: %CPU>50)
# 3) 기록용 — 배치 모드 1회
top -b -n1 -o %CPU | head -20 > top_$(date +%H%M).txt
# 4) 특정 프로세스만 추적
top -p "$(pgrep -d, httpd)"
# 5) 스레드 단위 CPU (어느 스레드가 CPU를 먹는가)
top -H -p <PID>
# 6) 코어 수와 load 함께 보기
nproc; cat /proc/loadavg
# 7) 짧은 간격으로 3회 기록 (추세)
top -b -d 2 -n 3 -o %CPU | grep -A5 '^ PID'
htop을 설치하면 색상·트리·마우스 조작이 가능해 대화형으로는 더 편하다. 하지만 기록·자동화에는 top -b 가 표준이다.
아래 이상 상황 출력은 형식 설명용 예시다.
① 채굴 악성코드 의심 상황 (2코어)
top - 02:40:10 up 12 days, 1 user, load average: 2.10, 1.95, 0.40
Tasks: 142 total, 3 running, 139 sleeping, 0 stopped, 0 zombie
%Cpu(s): 97.5 us, 1.0 sy, 0.0 ni, 1.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7811 apache 20 0 xxxx 24180 xxxx R 196.0 0.3 16:41.2 sysd
| 단서 | 해석 |
|---|---|
| load 1분 2.10 vs 15분 0.40 | 최근 급격히 증가 |
us 97.5% | 사용자 프로그램이 CPU를 거의 독점 |
%CPU 196.0 | 2코어를 둘 다 사용 (100% × 코어 수까지 가능) |
| USER apache, 이름 sysd | 웹 계정이 시스템 프로세스처럼 보이는 이름으로 실행 |
TIME+ 16분 | 최근 시작했는데 CPU 시간이 빠르게 쌓임 |
② I/O 병목 상황
load average: 6.80, 5.10, 3.20
%Cpu(s): 5.0 us, 3.0 sy, 0.0 ni, 12.0 id, 80.0 wa, ...
CPU는 한가한데 wa가 80%, load가 높다. D 상태 프로세스가 디스크를 기다리는 중 이다. 대용량 백업일 수도 있고, 랜섬웨어가 파일을 대량으로 읽고 쓰는 중일 수도 있다(40편 디스크 분석).
| 공격 | top 징후 | 추가 확인 |
|---|---|---|
| 채굴 (T1496) | us 급증, 코어 수만큼 %CPU, 낮은 nice | 외부 채굴 풀 연결 (44편 ss) |
| DDoS 봇 | sy·si 증가, 스레드 다수 | 대량 외부 연결 |
| 랜섬웨어 | wa 급증, D 상태 증가 | 파일 대량 변경 (22편 find -newer) |
| fork bomb | Tasks 급증, load 폭증 | 같은 이름 프로세스 수 |
| 좀비 누적 | zombie 카운트 증가 | 부모 프로그램 (31편) |
채굴기 중에는 top이 실행되면 멈추거나, 사람이 없는 새벽에만 동작하는 것도 있다. 그래서 사람이 top을 보는 것보다 자원 사용률을 지속적으로 수집해 추세로 보는 것 (모니터링 시스템, SIEM의 메트릭)이 더 신뢰할 만하다.
nproc; cat /proc/loadavg # 코어 대비 부하
top -b -n1 -o %CPU | head -15 # CPU 상위
top -b -n1 -o %MEM | head -15 # 메모리 상위
ps -eo pid,ppid,user,etimes,nlwp,args --sort=-%cpu | head -5 # 32편 헌팅 출력
[Alert] 모니터링: CPU 95% 이상 10분 지속, load 2코어에 2.1
↓
[top] us 97% / 1위 프로세스 apache · sysd · %CPU 196
↓
[ps] PPID 1, etimes 1000초, /tmp/.x/sysd, 인자에 채굴 풀 주소
↓
[ss] 외부 3333 포트 ESTAB (44편)
↓
[판단] 웹 취약점 경유 채굴기 → 침해
↓
[Response] kill -STOP → 증적 → 풀 주소 차단 → 설치 경로·지속성 제거 (34편)
top은 /proc을 주기적으로 읽는 실시간 자원 도구다. 기록에는 top -b -n1.nproc)와 비교 한다.us(사용자) 급증 = 채굴 의심, wa(I/O 대기) 급증 = 디스크 병목·대량 파일 작업.%CPU는 코어 수 × 100%까지 올라갈 수 있다.free가 아니라 avail Mem 으로 판단한다.다음 글 「34. Linux Signal과 kill」 에서는 top의 k 키, 29편의 kill -STOP에서 쓴 시그널 을 정리한다. SIGTERM·SIGKILL·SIGSTOP의 차이, 잡을 수 없는 시그널, 그리고 침해 대응에서 증적을 지키며 프로세스를 멈추는 순서 를 다룬다.