월요일 아침 출근길, 병원 한 곳에서 웹사이트가 열리지 않는다는 긴급 전화를 받았습니다. 화면에는 ‘Error Establishing a Database Connection’이라는 문구만 떠 있었습니다. 원인은 물리 메모리 고갈로 리눅스 커널이 MySQL을 강제로 죽인 OOM(Out Of Memory) 현상이었습니다. 3곳의 병원 홈페이지(워드프레스 기반)를 직접 운영하면서 가장 흔하게 겪는 비상사태입니다. 임시방편으 로 재시작만 해서는 해결이 안 됩니다. 근본적인 악순환을 끊기 위해 직접 서버 메모리 부족 원인 찾기 작업에 나섰던 경험 을 공유합니다.## 1단계: OOM 킬러의 흔적과 메모리 상태 확인하기
우선 서버가 죽은 증거를 확보해야 합니다. SSH로 접속해 커널 로그에서 OOM 킬러의 작동 여부를 검사했습니다.
dmesg -T | grep -i -E 'oom|kill'
로그에 MySQL과 PHP-FPM이 종료된 기록을 확인했다면, 현재 메모리 상태를 점검합니다.
free -h
동시 접속이 몰릴 때, 워드프레스의 PHP-FPM 프로세스가 개당 50~100MB씩 메모리를 차지하며 전체 물리 메모리를 고갈시키는 구 조였습니다.
근본 원인은 두 가지였습니다. 첫째는 과도하게 설치된 무거운 플러그인이었고, 둘째는 PHP-FPM의 pm.max_children 값이 서버
스펙에 비해 너무 높게 잡힌 것이었습니다.
불필요한 플러그인을 정리하고, /etc/php/8.x/fpm/pool.d/www.conf 설정 파일에서 자원 제한 값을 조정해 메모리 누수를 막았
습니다.
pm = dynamic
pm.max_children =15
pm.max_requests = 500
특히 pm.max_requests를 500으로 제한해, 일정 요청을 처리한 프로세스가 메모리를 반환하고 새로 시작되도록 유도하여 미세한
한 메모리 누수를 해결했습니다.
병원 사이트를 안정적으로 굴리기 위한 경험에서 우러나온 실무 팁입니다.
서버 운영은 화려한 기술보다 사소한 대비책이 모여 안정성을 만든다는것을 오늘도 배웁니다.
AI가 초안을 생성하고, 의료기관 인프라 운영자가 1차 데이터 기반으로 최종 검수·승인합니다.
작성·검수: WavePix 운영자 (의료기관 3곳 인프라 전담)