node + Express 서버 성능 실험

다중 프로세스가 없는 상황에서 node의 단일 스레드 모드는 줄을 서는 방식으로 요청을 처리할 수 있다. 요청이 많을 때 CPU 시간을 많이 소모할 것이다. 특히 CPU 밀집형이나 썩은 코드, 예를 들어 사순환을 초래할 수 있는 (생사 자물쇠가 생길지 모르는 상황) 같은 버그는 전체 서버가 바로 다운된다.
app.get('/1',function(req, res) {
    res.json({ title1: 'OK' });
});

app.get('/2', function(req, res) {
    while(true) { /*  CPU  */ }
    res.json({ title2: 'OK' });
});

먼저 접근/1, 서버에 문제가 없음을 증명 접근/2, 브라우저가 계속 빙빙 돌면서 접근/1, 나올 수 없음
실험 결론: node는 CPU 밀집형(예를 들어 죽은 순환을 쓰는 것)에 대해 무력한 것이 아니라 바로 죽는다...
조회 데이터 시간과 각종 자원 스케줄링 시간은 한 사용자가 기다리는 시간을 무시합니다. >= 앞에 있는 모든 작업의 CPU 연산 시간과 브라우저가 자원 응답을 기다리는 시간이 100ms를 초과할 수 없습니다. 여기 인터넷 IO는 50ms, 10000개의 요청을 소모할 수 있습니다. 각각의 연산 시간은 5us=5*10^-6s, 3.2GHz의 CPU를 사용합니다.3.2GHz=3.2*10^9Hz에도 16K개의 지령 주기가 있다. 설명을 하지 않아도 require 때 미리 컴파일한 적이 있다. 기계 코드가 아니기 때문에 어셈블리 차원의 최적화도 할 수 없을 것이다. 그리고 GC시간stop-the-world, 16K도 많지 않다.그러나 현실 상황을 고려하면 데이터를 찾는 시간이 더 길고 DB와 IO를 해야 한다. 연산 시간이 매우 적고 IO는 비동기적이다. 그러면 더 많은 요청을 받아들일 수 있다. 그러면 더 많은 메모리를 캐시 구역으로 분배하고 메모리를 많이 사용하고 페이지를 나누며 가상 메모리를 조정해야 할 수도 있다.

좋은 웹페이지 즐겨찾기