리눅스 서버 리소스 부족 해결 방법 및 CPU 메모리 병목 진단 체크리스트
서버 리소스 부족 시 우선 점검해야 할 항목을 미리 숙지하지 못해 곤란을 겪은 적이 있으신가요? 제 경험상, 갑작스러운 트래픽 폭주로 모니터링 알림이 요란하게 울려대고, 터미널 접속 커서조차 껌뻑이며 움직이지 않을 때의 그 등줄기 서늘한 기분은 잊을 수가 없습니다. 당황한 마음에 무조건 `reboot` 명령어부터 입력하고 싶어지지만, 원인을 파악하지 않은 재부팅은 정확히 30분 뒤 똑같은 지옥을 다시 불러올 뿐입니다. 오늘은 시스템 리소스 경고등이 켜졌을 때, 엔지니어가 침착하게 터미널을 열고 확인해야 할 실전 대응 루틴을 단계별로 정리해 드립니다.
1. 현재 상태 진단: CPU, 메모리, 디스크 I/O 중 병목 구간 식별
무엇이 부족한지 아는 것이 문제 해결의 절반입니다. 접속조차 버거운 상황이라면 가장 먼저 전체적인 부하의 원인이 어디에 있는지 숲을 봐야 합니다.
- Load Average 해석: `uptime` 명령어를 입력했을 때 나오는 1분, 5분, 15분 평균 부하 수치를 확인합니다. 이 수치가 현재 서버의 CPU 코어 수보다 높다면 처리를 기다리는 작업이 줄을 서 있다는 뜻입니다.
- wa(Wait) 수치 확인: CPU 사용률 자체는 낮은데 서버가 느리다면 `top` 명령어 상단에서 `wa` 수치를 확인해야 합니다. 이 수치가 높다면 CPU가 아닌 디스크 I/O 처리를 기다리느라 시스템이 멈칫거리는 상황입니다.
- st(Steal) 타임: AWS와 같은 클라우드 환경이라면 호스트 머신의 자원 경합 문제일 수 있으므로 `st` 수치가 튀는지 체크합니다.
2. 프로세스 추적: Top과 Htop을 활용한 리소스 과점유 범인 찾기
병목 구간을 알았다면, 이제 그 자원을 독식하고 있는 프로세스를 색출해야 합니다. 가장 직관적인 도구를 활용해 범인을 찾아냅니다.
- Top 명령어 활용: `top` 실행 후 `Shift + P`를 누르면 CPU 사용량 순으로, `Shift + M`을 누르면 메모리 사용량 순으로 정렬됩니다. 이를 통해 어떤 PID(프로세스 ID)가 자원을 낭비하는지 즉시 식별할 수 있습니다.
- Htop의 시각적 활용: 텍스트만으로 파악이 어렵다면 `htop`을 설치하여 트리 구조로 확인합니다. 부모 프로세스가 문제인지, 파생된 자식 프로세스가 문제인지 관계를 파악하기 용이합니다.
- 주의사항: 무턱대고 `kill -9` 명령어로 프로세스를 종료하기 전, 해당 프로세스가 시스템 운영에 필수적인 핵심 데몬인지 반드시 확인해야 합니다.
3. 로그 및 DB 분석: 슬로우 쿼리와 시스템 로그 대조하기
특정 프로세스의 폭주가 아니라면, 애플리케이션 내부 로직이나 데이터베이스 문제일 확률이 매우 높습니다. 제 경험상 웹 서버 CPU가 튀는 원인의 60% 이상은 비효율적인 쿼리에 있었습니다.
- DB Slow Query: MySQL 등을 사용 중이라면 `slow query log`를 활성화하여 실행 시간이 1초 이상 걸리는 쿼리가 있는지 잡아내야 합니다. 인덱스를 타지 않는 무거운 쿼리 하나가 전체 시스템을 마비시킬 수 있습니다.
- System Logs: `/var/log/syslog` 또는 `/var/log/messages` 파일에서 `error`, `fail`, `critical` 키워드를 `grep`으로 검색합니다. 하드웨어의 물리적 오류나 커널 패닉의 전조증상을 여기서 발견할 수 있습니다.
4. 메모리 최적화: Swap 설정 점검 및 OOM Killer 발생 여부 확인
메모리는 가장 비싸고, 부족할 때 가장 치명적인 자원입니다. 메모리가 바닥나면 리눅스 커널은 시스템 보호를 위해 프로세스를 강제로 죽입니다.
- OOM Killer 확인: 갑자기 멀쩡하던 Mysql이나 Apache 데몬이 죽어버렸다면 `dmesg | grep -i 'killed process'` 명령어를 입력해 보세요. 커널이 메모리 확보를 위해 해당 프로세스를 희생양으로 삼았는지 확인할 수 있습니다.
- Swap 메모리 활용: 물리 메모리 부족을 대비해 Swap 파일이 적절히 설정되어 있는지(`free -h`) 봅니다. 단, Swap 사용량이 급증하면 디스크 I/O 부하가 동반 상승하여 서버가 '거북이' 상태가 될 수 있으므로 주의가 필요합니다.
5. 재발 방지 대책: 모니터링 알림 설정과 스케일업 판단 기준
급한 불을 껐다면, 미래를 위한 방화벽을 세워야 합니다. 장애 복구 후에는 반드시 다음 두 가지를 검토하여 안정적인 운영 환경을 구축하시기 바랍니다.
- 임계치 설정: CPU 사용률 70%, 메모리 사용률 80% 도달 시 슬랙이나 이메일로 즉시 알림이 오도록 Zabbix나 CloudWatch 같은 모니터링 도구를 세팅합니다. 사용자가 "서버 안 돼요"라고 문의하기 전에 먼저 인지해야 합니다.
- 스케일업 vs 스케일아웃: 튜닝과 최적화로도 리소스 부족이 해결되지 않는다면, 비즈니스 관점에서 서버 사양을 높일지(Scale-up), 서버 대수를 늘릴지(Scale-out) 판단해야 합니다. 이 체크리스트를 통해 불필요한 비용 누수를 막고 효율적인 인프라를 운영해 보십시오.