크롤러 / 스크래퍼/크롤러 · 헤드리스 브라우저

24시간 가동되는 Playwright 크롤러의 메모리 누수와 좀비 프로세스 제어

헤드리스 브라우저는 본래 단발성 E2E 테스트를 위해 만들어졌기 때문에, 수만 번의 웹 수집을 연속 수행하면 Chromium 프로세스 내부에 캐시와 DOM 트리가 쌓여 결국 OOM(Out of Memory)으로 서버를 다운시킵니다. 프로세스를 죽이지 않고 메모리를 일정하게 제어하는 실전 아키텍처입니다.

클라우드 런타임 스펙
24/7 Active
독립 보안 샌드박스다중 가상화 격리로 프로세스 간 간섭을 원천 차단
영구 볼륨 스토리지 (/app)재배포·재부팅에도 SQLite DB와 세션 데이터 안전 보존
장애 자동 복구 & 알림크래시 및 OOM 감지 시 Discord·Telegram 웹훅 즉시 발송
기본 제공Free 256MB RAM · 1GB 디스크

Playwright 크롤러가 12시간 만에 OOM으로 뻗는 원인

Chromium은 웹페이지를 방문할 때마다 화면 데이터와 캐시를 메모리에 쌓아둡니다. 일반적인 브라우징에서는 탭을 닫으면 해제되지만, 헤드리스 자동화 스크립트에서는 명시적으로 리소스를 수거하지 않으면 메모리 점유율이 수 시간 만에 기하급수적으로 치솟습니다.

결국 서버 메모리가 바닥나 크롤러 프로그램 전체가 갑자기 강제 종료됩니다. 이를 방지하려면 브라우저를 매번 껐다 켜는 대신, 브라우저는 하나만 띄워두고 작업마다 독립된 가벼운 세션을 열고 닫는 라이프사이클 관리가 필수적입니다.

단순 탭 닫기 실수의 위험: 탭만 닫으면 캐시가 남아 메모리 누수가 발생하므로 세션 자체를 정리
불필요한 리소스 차단: 이미지나 미디어 요청을 차단해 대역폭과 메모리를 70% 이상 절감
타임아웃 안전망: 응답 없는 무한 로딩 페이지 감지 시 브라우저 멈춤 방지를 위한 강제 중단 타이머
메모리 상한선 자동 감시: 설정된 메모리 임계치에 도달하면 안전하게 재시작

Chromium 인스턴스 관리 전략 비교

웹 수집 시 브라우저를 어떻게 할당하고 회수하느냐에 따라 처리 속도와 서버 자원 소모량이 10배 이상 차이 납니다.

접근 방식동작 구조메모리 점유율초당 페이지 처리량장기 가동 안정성
수집마다 브라우저 재실행요청 1건마다 브라우저 새로 띄움매우 높음 (CPU/RAM 부하)초당 0.2~0.5페이지 (매우 느림)안정적이나 서버 부하 극심
단일 브라우저 + 무제한 탭브라우저 하나에 탭만 계속 열고 닫음시간 경과 시 지속 누적초당 3~5페이지 (빠름)위험 (메모리 부족으로 다운)
싱글톤 + 컨텍스트 재활용브라우저 1회 가동 후 세션 생성/해제일정 수준(300~500MB) 고정초당 2~4페이지 (최적 밸런스)매우 높음 (24시간 무중단 권장)

멈춘 브라우저 창 자동 감시 및 청소

파이썬 스크립트가 비정상적인 예외로 중단되었을 때, 백그라운드에 열려있던 Chromium 창들이 종료되지 않고 남아 컴퓨터 자원을 100% 점유하는 문제가 흔히 발생합니다.

DashCloud는 메인 수집기가 종료되거나 재시작될 때 백그라운드에 남아 자원을 낭비하는 숨은 브라우저 프로세스들을 컨테이너 단위로 남김없이 깨끗하게 정리합니다.

리눅스 환경 필수 한글 폰트 및 시스템 라이브러리 탑재

일반 리눅스 서버에 Playwright를 설치하면 한글이 모두 사각형(ㅁㅁㅁ)으로 깨져 스크린샷 캡처가 불가능하고, 필수 시스템 라이브러리가 없어 브라우저 실행 자체가 거부되곤 합니다.

STEP 1

Noto Sans 한글 폰트 기본 내장

한국어 폰트가 기본 탑재되어 한글 깨짐 없는 완벽한 스크린샷 수집을 보장합니다.

STEP 2

시스템 렌더링 라이브러리 완비

헤드리스 브라우저 구동에 필요한 모든 시스템 그래픽 라이브러리가 사전 패키징되어 있습니다.

STEP 3

Chromium 바이너리 사전 캐싱

배포할 때마다 무거운 브라우저를 다운로드할 필요 없이 즉시 가동 환경에 마운트됩니다.

관련 가이드 문서

자주 묻는 질문

playwright install 명령어를 배포 스크립트에 넣어야 하나요?+

넣을 필요 없습니다. DashCloud의 크롤러 전용 런타임에는 호환성이 검증된 Chromium 바이너리와 한글 폰트가 이미 내장되어 있으므로, requirements.txt에 playwright만 명시하면 즉시 구동됩니다.

메모리 누수가 누적되면 수동으로 재부팅해야 하나요?+

주기적인 메모리 정리가 필요하다면 1,000페이지 수집 시마다 브라우저 프로세스를 자발적으로 재기동하도록 코드를 구성하거나, DashCloud 대시보드의 정기 리스타트 스케줄을 설정해 둘 수 있습니다.

동시에 여러 페이지를 수집할 때 권장되는 동시 실행 수는 얼마인가요?+

1GB 메모리 플랜 기준으로 동시 활성 탭은 2~3개가 적정합니다. 4개 이상의 탭을 동시에 렌더링하면 메모리 부족 현상이 발생할 수 있으므로, asyncio.Semaphore 세마포어로 동시 실행 탭 수를 제어하는 것을 권장합니다.

크롤러 / 스크래퍼 관련 주요 주제

Get Started

Free 플랜으로 지금 바로 배포해 보세요

휴대폰 인증 후 256MB RAM, 1GB 영구 스토리지, 실시간 로그 콘솔을 무료로 사용할 수 있습니다.