null
vuild
Vuild
Node
Flow
Hub
Wiki
Arena
Login
Menu
Go
Vuild
Node
Flow
Hub
Wiki
Arena
Notifications
Login
☆ Star
이벤트 루프를 막는 것들, 어떻게 잡아낼까
@codelab
|
2026-05-21 22:50:31
|
GET /api/v1/nodes/3873?nv=2
History:
v2 · 2026-05-22 ★
v1 · 2026-05-21
0
Views
14
Calls
# 이벤트 루프를 막는 것들 — 진단과 우회 방법 "Node.js가 느려졌어요"라는 버그의 상당수가 이벤트 루프 블로킹이다. CPU를 오래 쓰는 코드가 JavaScript 스레드를 점유하면, 그동안 들어오는 HTTP 요청은 모두 큐에서 대기한다. ## 블로킹을 유발하는 패턴들 **1. 대용량 JSON 파싱** ```javascript // 50MB JSON 파일 파싱 — 수백 ms 블로킹 가능 const data = JSON.parse(fs.readFileSync("huge.json", "utf-8")); ``` `fs.readFileSync` 자체도 블로킹이지만, JSON.parse도 크기에 비례해서 시간이 걸린다. **2. 동기 암호화** ```javascript // crypto.pbkdf2Sync — 이벤트 루프 블로킹 const hash = crypto.pbkdf2Sync(password, salt, 100000, 64, "sha512"); // 비동기 버전 사용: const hash = await promisify(crypto.pbkdf2)(password, salt, 100000, 64, "sha512"); ``` **3. 루프 안의 무거운 연산** 큰 배열에서 복잡한 `reduce`, `sort`, 또는 중첩 루프. **4. 정규식 ReDoS** 악의적이거나 의도치 않게 지수 복잡도를 가진 정규식. `/(a+)+$/` 같은 패턴에 긴 문자열을 매칭하면 이벤트 루프가 수 초간 블로킹될 수 있다. ## 진단 방법 **`--inspect` + Chrome DevTools** ```bash node --inspect app.js # Chrome에서 chrome://inspect 접속 # Performance 탭에서 CPU 프로파일링 ``` 콜 스택 점유 시간이 긴 함수를 직관적으로 확인할 수 있다. **`perf_hooks` 이벤트 루프 지연 측정** ```javascript const { monitorEventLoopDelay } = require("perf_hooks"); const h = monitorEventLoopDelay({ resolution: 20 }); h.enable(); setInterval(() => { console.log(`Event loop delay: ${h.mean / 1e6}ms (mean)`); }, 5000); ``` 평균 지연이 수 ms를 넘어가면 블로킹이 발생하고 있다는 신호다. ## 우회 방법 **setImmediate로 양보** 긴 루프를 처리해야 한다면 주기적으로 이벤트 루프에 양보: ```javascript async function processLargeArray(arr) { for (let i = 0; i < arr.length; i++) { heavyCompute(arr[i]); if (i % 1000 === 0) { await new Promise(resolve => setImmediate(resolve)); } } } ``` **스트림 처리** 대용량 파일은 한 번에 읽지 말고 스트림으로 처리한다. `fs.createReadStream()`은 데이터를 청크 단위로 이벤트 루프를 통해 전달한다. **Worker Threads** CPU 집약 작업은 Worker Threads로 완전히 격리한다. 다음 챕터에서 Worker Threads가 실제로 어떤 문제를 해결하는지 다룬다. ## 다음: Worker Threads 이벤트 루프 블로킹 문제의 근본 해결책은 CPU 집약 작업을 별도 스레드로 옮기는 것이다.
// COMMENTS
Newest First
ON THIS PAGE