엔지니어로 살다 보면 서비스가 갑자기 느려지거나 응답이 없는 절체절명의 순간을 마주하게 됩니다. 9~10편에서 로그를 통해 과거의 흔적을 쫓았다면, 이번에는 **”지금 누가 내 서버의 자원을 갉아먹고 있는가?”**라는 질문에 답할 차례입니다.
오늘은 서버의 건강 상태를 진단하는 top 명령어와 그 대안인 htop, 그리고 문제 프로세스를 검거하고 처단하는 ps, kill의 디테일을 알아보겠습니다.
1. 실시간 시스템 진단 차트: top 읽는 법
top을 실행했을 때 쏟아지는 정보 중 실무에서 반드시 체크해야 할 핵심 지표들을 해부해 보겠습니다.
① 상단 시스템 요약 (Summary Area)
- Load Average: CPU가 처리하기 위해 대기 중인 작업의 평균 개수 (1분, 5분, 15분 단위).
- Tip: CPU 코어 수보다 이 수치가 높다면 서버가 이미 과부하 상태임을 의미합니다.
- %Cpu(s): CPU가 어디에 시간을 쓰고 있는지 보여줍니다.
us(user): 앱(Nginx, DB 등)이 사용하는 비중.sy(system): 커널/시스템이 관리용으로 사용하는 비중.id(idle): 쉬고 있는 비중. (이게 낮을수록 서버가 바쁜 상태입니다.)wa(iowait): 디스크 입출력 대기. 이 수치가 높다면 CPU가 아니라 느린 디스크가 병목의 원인일 확률이 높습니다.
② 하단 프로세스 리스트 (Process List)
- RES (Resident Size): 프로세스가 사용하는 실제 물리 메모리 양입니다. (가상 메모리 수치보다 이 값을 보는 것이 정확합니다.)
- S (Status):
R(실행 중),S(대기 중),Z(좀비 – 종료되었으나 자원이 해제되지 않은 상태).

2. 시각적인 대안: htop
기본 top 화면이 너무 투박하게 느껴진다면 **htop**이라는 훌륭한 대안이 있습니다. 별도의 설치가 필요하지만(yum install htop), CPU 코어별 사용량을 막대그래프로 보여주고 마우스나 방향키로 프로세스를 선택할 수 있어 가독성이 뛰어납니다. 텍스트 기반의 top 지표들을 이해한 뒤, 실무에서 더 편하게 모니터링하고 싶을 때 사용해 보시는 것을 추천합니다.

3. 프로세스 수색의 정석: ps (Process Status)
ps는 특정 시점의 프로세스 상태를 스냅샷처럼 보여줍니다. 실무에서는 크게 두 가지 파벌의 옵션 조합이 쓰입니다.
ps -ef(System V 계열): 모든 프로세스를 계층 구조로 보여줍니다. **부모 프로세스 ID(PPID)**를 확인할 수 있어 어떤 서비스가 이 프로세스를 실행했는지 계보를 파악하기 좋습니다.

ps aux(BSD 계열): CPU와 메모리 점유율을 포함해 출력합니다.top을 켜지 않고도 어떤 프로세스가 자원을 많이 먹는지 즉시 확인할 때 유용합니다.

알아두면 유능해 보이는 ps 심화 팁
- 특정 유저만 필터링:
ps -u [사용자명](예:ps -u nginx)

- 메모리 사용량 순 정렬:
ps aux --sort=-%mem

- 원하는 항목만 골라보기:
ps -eo pid,pcpu,pmem,comm(PID, CPU%, 메모리%, 명령어만 출력)

4. 프로세스 처단의 기술: kill & Signals
kill은 단순히 프로세스를 죽이는 명령어가 아니라, 프로세스에게 **’신호(Signal)’**를 보내는 도구입니다.
| 시그널 번호 | 이름 | 의미 및 실무 용도 |
| 1 | SIGHUP | 재시작(Reload). 서비스를 종료하지 않고 설정 파일만 다시 읽을 때 사용합니다. |
| 15 | SIGTERM | 정중한 종료. 하던 일을 정리하고 안전하게 닫으라고 요청합니다. (기본값) |
| 9 | SIGKILL | 강제 종료. 어떤 정리 과정도 거치지 않고 즉시 사살합니다. 데이터 유실 위험이 있습니다. |
- 이름으로 한 번에 잡기:
pkill -f [패턴]: 이름에 특정 패턴이 포함된 프로세스를 모두 찾아 종료합니다.killall [프로세스명]: 정확히 이름이 일치하는 프로세스를 일괄 종료합니다.
5. [실습] 부하 프로세스 검거와 처단
실제로 CPU에 부하를 주는 가짜 범인을 만들고 검거해 봅시다.
# 1. CPU 부하를 일으키는 프로세스 실행 (백그라운드)
cat /dev/urandom | gzip -9 > /dev/null &
# 2. ps aux로 CPU 점유율이 높은 상위 5개 찾기
ps aux --sort=-%cpu | head -n 5
# 3. 범인 PID 확인 후, 먼저 '정중하게' 종료 시도
kill -15 [PID]
# 4. 5초 뒤에도 살아있다면 '강제로' 처단
kill -9 [PID]


💡 엔지니어의 참견
“실무에서 에러가 난 프로세스를 보면 화가 나서(?) 바로
kill -9부터 날리는 경우가 있습니다. 하지만 이건 퇴근하려는 직원의 뒷덜미를 잡고 기절시키는 것과 같습니다.프로세스는 종료될 때 열려 있던 파일을 닫고 데이터를 저장하는 ‘정리 시간’이 필요합니다.
kill -9는 이 과정을 생략시키기 때문에 데이터 오염이나 DB 인덱스 깨짐이 발생할 수 있죠. 항상kill -15를 먼저 시도하고, 반응이 없을 때만-9를 꺼내는 것이 성숙한 엔지니어의 자세입니다.”
🚀 다음 예고
프로세스 관리를 마스터했다면, 이제 서버가 외부와 소통하는 통로를 점검할 차례입니다. 다음 **[리눅스 실무 기초 #12]**에서는 **네트워크 포트 확인과 고정 IP 설정(nmcli/nmconnection)**을 다룹니다!
“이 글의 영문 버전은 [이곳]에서 확인하실 수 있습니다.”