평화롭던 주말 저녁, 갑자기 웹사이트 접속이 느려지거나 ‘응답 없음’ 상태에 빠진다면 서버 관리자의 머릿속은 하얗게 변합니다. 클라우드 콘솔에 접속해 모니터링 대시보드를 보니 서버의 CPU나 메모리(RAM) 점유율이 99%를 찍고 있는 붉은색 그래프가 보입니다.
이러한 리소스 폭주 현상은 잘못 짜인 무한 루프 코드, 대규모 악성 봇(Bot)의 크롤링, 혹은 데이터베이스의 악성 쿼리 등 다양한 원인으로 발생합니다. 당장 서버를 재부팅할 수도 있겠지만, 이는 근본적인 해결책이 아닐뿐더러 정상적인 사용자들의 접속까지 완전히 끊어버리는 위험한 선택입니다.
오늘은 서버 장애의 골든타임을 사수하기 위해, 리눅스 환경에서 top 명령어로 범인 프로세스를 찾아내고 kill 명령어로 안전하게 강제 종료하여 서버를 정상화하는 트러블슈팅의 정석을 상세히 알아보겠습니다.
1. 범인 찾기 1단계: top 명령어로 실시간 리소스 모니터링
서버가 느려졌을 때 터미널 창(SSH)에 접속하여 가장 먼저 무조건 타이핑해야 하는 명령어는 바로 **top**입니다. 윈도우의 ‘작업 관리자’와 완전히 같은 역할을 하는 리눅스 내장 프로그램입니다.
[적용 방법]
Bash
top
명령어를 입력하면 화면이 갱신되면서 현재 서버에서 실행 중인 모든 프로세스의 실시간 목록이 나타납니다. 화면 상단에는 서버의 런타임, 현재 접속자 수, 그리고 **Load Average(시스템 부하율)**가 표시되며, 그 아래로 메모리 사용량이 나옵니다.
[실무에서 꼭 쓰는 top 단축키 꿀팁] 처음 top을 실행하면 수백 개의 프로세스가 무작위로 움직여 정신이 없습니다. 이때 아래의 단축키를 누르면 범인을 단숨에 찾아낼 수 있습니다. (대소문자를 구분하므로 Shift 키를 함께 누르세요.)
Shift + P: CPU 사용률이 높은 순서대로 내림차순 정렬합니다. (CPU 점유율 폭주 시 사용)Shift + M: 메모리 사용률이 높은 순서대로 내림차순 정렬합니다. (메모리 부족 현상 시 사용)c: 프로세스의 실행 명령(Command) 전체 경로를 보여줍니다. (어떤 파일이 문제를 일으켰는지 상세히 볼 때 유용)q: top 프로그램을 종료하고 터미널로 빠져나옵니다.
2. (추가 팁) 초보자라면 top 대신 htop을 활용하세요
top 명령어는 강력하지만 흑백 텍스트라 가독성이 떨어집니다. 서버 관리에 갓 입문했다면 시각적으로 훨씬 훌륭한 htop 패키지를 설치해 두는 것을 강력히 추천합니다.
Bash
sudo apt install htop # 우분투 환경 설치 명령어
htop # 실행
htop을 실행하면 CPU 코어별 사용량과 메모리 상태가 직관적인 컬러 막대그래프로 표시되며, 방향키와 마우스 클릭(터미널 환경에 따라 지원)까지 가능하여 문제의 프로세스를 훨씬 쉽게 추적할 수 있습니다.
3. 범인 지목: PID(Process ID) 확보하기
top이나 htop을 통해 CPU를 90% 이상 잡아먹고 있거나, 메모리를 비정상적으로 갉아먹고 있는 악성 프로세스(예: php-fpm, mysqld, 혹은 알 수 없는 채굴 스크립트 등)를 발견하셨나요?
그렇다면 해당 프로세스의 맨 왼쪽 열에 적혀 있는 ‘PID(Process ID)’ 숫자를 반드시 메모해야 합니다. PID는 리눅스가 해당 프로세스에 부여한 고유한 주민등록번호와 같습니다. 이 숫자를 알아야만 정확하게 해당 프로세스만 저격하여 종료시킬 수 있습니다.
4. 범인 처단: kill 명령어로 프로세스 종료하기
PID 번호(예: 12345라고 가정)를 확보하고 q를 눌러 top 화면에서 빠져나왔다면, 이제 kill 명령어로 프로세스에게 종료 명령을 내릴 차례입니다. kill 명령어는 옵션(시그널)에 따라 두 가지 단계로 나뉩니다.
[1단계: 안전하게 종료하기 (SIGTERM, 기본값)]
Bash
sudo kill 12345
# 또는
sudo kill -15 12345
아무 옵션 없이 kill을 입력하거나 -15 옵션을 주면, 프로세스에게 **”하던 작업을 안전하게 마무리하고 정상적으로 종료해 줘”**라는 권고 메시지(SIGTERM)를 보냅니다. 데이터 손상을 막기 위해 실무에서는 무조건 이 방법부터 시도해야 합니다.
[2단계: 강제 처형하기 (SIGKILL, 최후의 수단)] 가끔 서버가 너무 먹통이거나 좀비 프로세스가 된 경우, 15번 시그널을 보내도 프로세스가 말을 듣지 않고 계속 살아있을 때가 있습니다. 이때는 자비 없이 강제 종료를 해야 합니다.
Bash
sudo kill -9 12345
-9 옵션(SIGKILL)은 프로세스의 의사와 상관없이 리눅스 커널이 즉각적으로 해당 프로세스의 목을 베어버리는 강력한 명령입니다. 거의 100% 즉시 종료되며, CPU와 메모리 점유율이 뚝 떨어지는 것을 확인할 수 있습니다.
- 주의사항: 데이터베이스(
mysqld등)를kill -9로 죽이면 쿼리 처리 중이던 데이터가 손상(Corrupt)될 위험이 있으므로, DB 관련 프로세스 강제 종료는 정말 최후의 수단으로만 신중하게 사용해야 합니다.
결론: 원인 분석과 예방이 진짜 실력입니다
kill 명령어를 통해 폭주하던 서버를 진정시켰다면 1차적인 위기는 넘긴 것입니다.
하지만 여기서 만족하고 넘어가면 내일 밤에 또다시 똑같은 장애가 발생합니다. 급한 불을 껐다면 반드시 /var/log 경로에 있는 웹 서버나 애플리케이션의 에러 로그를 분석하여, 어떤 사용자나 어떤 코드가 무한 루프를 유발했는지 찾아내어 소스 코드를 수정해야 합니다.
또한, 메모리가 100% 꽉 차서 리눅스가 스스로 프로세스를 죽여버리는 ‘OOM(Out Of Memory) Killer’ 현상을 막기 위해 하드디스크의 일부를 메모리처럼 쓰는 스왑(Swap) 메모리를 추가로 할당해 두는 것도 좋은 예방책입니다. 당황하지 않고 top과 kill을 자유자재로 다루는 당신은 이미 훌륭한 서버 관리자입니다!