91
Node.JS 성능 이야기 2017.4 WhaTap Labs www.whatap.io

Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

  • Upload
    hathien

  • View
    246

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.JS 성능 이야기

2017.4 WhaTap Labs www.whatap.io

Page 2: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Part I.

소개

Page 3: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js 장점

Node Package Manager

모듈이 45만개 육박

Page 4: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

각 언어의 모듈 성장세

http://www.modulecounts.com/

Page 5: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js 사용한 어플리케이션

Page 6: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처] https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

Double the requests per second vs. the Java application. This is even more interesting because our initial performance results were using a single core for the node.js application compared to five cores in Java. We expect to increase this divide further.

35% decrease in the average response time for the same page. This resulted in the pages being served 200ms faster— something users will definitely notice.

Page 7: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal

Page 8: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal

Page 9: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal

Page 10: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal

Page 11: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Paypal

[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal

Page 12: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js 좋은 활용

• REST + JSON APIs• Single-page web app• Real-time web app• 빠른 prototyping• 많은 I/O 처리

Page 13: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js 나쁜활용

• CPU 부하걸리는작업• Multi-thread app

• 큰데이터연산• 복잡한비지니스로직

Page 14: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

• Server side Javascript

• Event driven

• Asynchronous

• Non-Blocking I/O

• Single Threaded

• Lightweight

• Fast

#02. Node.js의철학및아키텍처

Page 15: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Event LoopThread pool

Event loop

Thread1

Thread 2

Threadn

Task 1

Task 2

Task n

Return 1

Task 4

Node.js Application

Callback() 1

Page 16: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js - Architecture

Node.js bindings( socket, http, etc )

V8

Node.js standard libaray

Thread pool

(libeio)

Event loop

(libev)

DNS(c-ares)

crypto(OpenSSL)

libuv

Javascript

C/C++

Page 17: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js - Architecture

Node.js bindings( socket, http, etc )

V8

Node.js standard libaray

Javascript

C/C++libuv

libeio libev IOCP

WindowsKernel

Unix/Linux Kernel

epoll, kqueue, event ports

Page 18: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js의엔진 libuv

• libuv is a multi-platform support library with a focus on asynchronous I/O.

• It was primarily developed for use by Node.js, but it's also used by Luvit, Julia, pyuv, and others.

Page 19: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Reactor – select , epoll

Page 20: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Proactor – IOCP

Page 21: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js System

Application

V8( Javascript engine )

Node.jsBindings

Libuv( Asyncronous I/O )

EventQueue

WorkerThreads

Event loop

Page 22: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Event Loop

var fs = require('fs');

fs.readFile('./data.txt', function(err, data) {if( err ) { throw err; }

console.log(data);});

Node.js bindings( socket, http, etc )

V8

Node.js standard libaray

libuv

Thread pool

Thread1

Task 1

return 1

call callback()

Page 23: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Memory Usage : Nginx vs Apache

Page 24: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Performance : Nginx vs Apache

Page 25: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Single Thread가 성능이나요?CPU가 놀지 않나요?

Page 26: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node.js Production 레벨에서는CPU 갯수 +@ 만큼 Single Thread를 뛰워요!

외부의도움을받아 eventloop도 core별로늘릴수있다.

Page 27: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Benchmark 1

json 1초에 hello world 반환하는 실험

• node.js 225,328

• spring : 97,354

• php : 167,888

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=json

Page 28: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Benchmark 2 : 간단한 http 요청http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/

Page 29: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Part 2. Node.JS 성능 분석 도구

Page 30: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

V8( Javascript engine )

ApplicationNode.jsBindings

Libuv( Asyncronous I/O )

EventQueue

WorkerThreads

Event loop

V8 Engine

Node. JS 성능포인트

Page 31: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

메모리 문제 잡기 (heap dump로)

Page 32: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

process.memoryUsage()

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }

Page 33: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache
Page 34: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

V8 GC 동작원리

http://d2.naver.com/helloworld/329631 http://bit.ly/2qAqJ9u by Irina Shestack

Page 35: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

V8 GC –

by Irina Shestack

http://bit.ly/2qAqJ9u

Page 36: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

heap snapshot 얻는 방법

• npm v8-profiler (코드에 instrument 코드를 삽입)

• npm node-inspector

• StrongLoop arc

• NodeSource N|Solid

Page 37: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Heap Snapshot

Page 38: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache
Page 39: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache
Page 40: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

NSolid Heap Snapshot

Page 41: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

CPU Profiling으로문제잡기

Page 42: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

cpu profilng 정보를 얻는 방법

• npm v8-profiler (코드에 instrument 코드를 삽입)

• Npm node-inspector

• StrongLoop arc

• NodeSource N|Solid

Page 43: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

CPU Profiling

Page 44: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Chrome에서보는 Timeline 뷰

Page 45: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

NSolid Flame Graph

Page 46: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Eventloop의성능측정 (I/O)

Page 47: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

EventLoop동작원리

Page 48: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

EventLoop 동작원리

https://lemycanh.wordpress.com/2015/05/24/node-js-event-loop/

Page 49: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

EventLoop 동작원리

http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

Page 50: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

EventLoop문제점

http://www.juhonkoti.net/2015/12/01/problems-with-node-js-event-loop

Page 51: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Single Thread가가져오는성능저하.

Page 52: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

성능측정 (handler부하테스트)

Page 53: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Node에서긴작업을하면..

Page 54: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

nodejs dashboard (open source) https://github.com/FormidableLabs/nodejs-dashboard

Page 55: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

힌트

• 일정한 응답시간을 SLA로 보장하는 서비스라면, Node 서비스가 올라간인스턴스의 자원을 적게 쓰게 만들어라 (60%)

• CPU 사용량이 높은 (복잡한 계산이 들어가 있는) 서비스는 Node가비적합.

• 높은 스펙의 인스턴스에 여러 노드를 서비스를 놓는것 보다는, 낮은스펙의 여러개의 인스턴스를 늘려서 사용하는 것이 훨씬 유리.

• 다른 paas 보다, 비용적으로는 heroku 짱! (traffic 비용, io 비용 없음)

Page 56: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Part 3.

와탭이 제안하는 성능모니터링

Page 57: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

성능의 핵심은 트랜잭션..

UserTransaction

SQL SQL

Http

FileResource

`

성능 측정의 핵심은 웹 애플리케이션의 개별 트랜잭션을 모니터링 하는 것입니다. 얼마나 쉽고 빠르게 성능 이슈를 감지하고

분석할 수 있는지가 가장 중요합니다.

Page 58: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

APM의 핵심은 무수하게 많은 트랜잭션을 잘 분석하는 것

3:04 3:05 3:06 3:07

40초

80초

10초

Page 59: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

웹 서버 성능의 기준은 logNormal

응답시간이0에 수렴할수록 좋은서버

Page 60: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

설치형 성능 분석 툴 (APM) 대부분이 분포를 사용

Page 61: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

하지만 SaaS형 APM 툴은 분포를 사용하기 힘들다..

▪ 엄청난 데이터 량를 전송▪ TPS (초당 트랜잭션)▪ 트랜잭션당 프로파일링 정보..▪ + …

▪ 보안 문제▪ …

Page 62: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

그래서 Tingyun, OneAPM, New Relic 은 분포 포기!! 평균..)

Page 63: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

평균 응답시간 – 과연 최적의 표현??

Page 64: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

평균 응답시간 – 이렇게 표현 된다면.. 양이 문제를 가린다. (N사)

Page 65: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

그에 대한 와탭의 고민.. 분포를 표현하는 이상적인방법

구간(5초 단위) + 빈도 (진하기)이러면 훨씬 적은 데이터로.. 분포 표현

가능

Page 66: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

N사를 사용한 고객들의 불만.. 데이터 표현 주기 1분 (와탭은 5초)

N사는 1분평균의데이터를보여주기때문에최근 20초동안애플리케이션에문제가발생하더라도,

나머지 40초간의정상적인트랜잭션으로인해데이터가평균화되면서실제문제를못보는경우가발생한다.

Page 67: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

데이터표현방법 (N사의문제)

Page 68: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

WhaTap의데이터표현방법

Page 69: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

가치 1 : 빠르게 장애를 인지하고 대처할수 있는가? 실시간 분석

Page 70: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

가치 2 : 우리 서비스의 피크타임은 언제지?출근후 비 업무 시간에는 문제가 없었나?

24시간을 한눈에 보는 사후 분석.

Page 71: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

가치 3 : 전 세계적으로 데이터 수집해서 한 곳에서 볼수 있냐?

Page 72: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

가치 4. 1000대의인스턴스를한눈에볼수있다.

Page 73: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Part 4. 고객 성공 사례

Page 74: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

A. 모바일게임사성능개선사례

- Express를사용중이며,하루약 800만건의 Request가발생- Request의대부분은 Image 요청

이미지 request

Page 75: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

문제인식

- Active Transaction 증가- 응답시간증가- 최대 TPS 26

A 모바일게임사성능개선사례

Page 76: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

- 응답시간이 느린 트랜잭션은 대부분 이미지 요청

- Express에서는 default 로 serve-static 이라는 package module을 사용.

- 모바일 게임사로, http request 요청에 Cookie 와 Header를 클라이언트 개발팀 임의로수정하면서 304 리턴이 아닌 매번 새로운 이미지를 받아가는 상황 발생

- 동일한 이미지에 대해서 file open이 매번 요청이 되어 I/O 부하 및 TPS 한계치 도달

대응 방안

1. 클라이언트 업데이트를 통한 해결- 게임 사용자가 업데이트를 하기 전까지는 해결되지 않음

2. Node.JS 에서 미리 파일을 읽어들여 Cache 한 데이터로 리턴- 임시 대응책이긴 하나, 이미지 갯수가 많지 않았으므로 바로 대응 가능

A 모바일 게임사 성능 개선 사례

Page 77: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

- 이미지 Cache 이후 응답시간이 현저하게 줄어들었음- Active Transaction 갯수 또한 줄어든 것을 확인

A 모바일 게임사 성능 개선 사례

Page 78: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

- 응답시간이 줄어들었으나 HITMAP y축 Scale 을 5초 단위로 변경- 특정한 응답시간 대에 줄이 생기는 것을 확인

문제인식

A 모바일 게임사 성능 개선 사례

Page 79: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

- Express 에서는 body-parser package module 을 default로 사용

- Query, Body parameter 등이 해당 module에서 parsing 되어짐

- body-parser의 bodyParser.urlencoded({ extended: false }) 에서 지연되는 것을 확인

대응 방안

1. 클라이언트에서 json 양식으로 request를 보내고 있는 것을 확인하였으므로, 해당 모듈사용 중지하여 응답시간 개선

A 모바일 게임사 성능 개선 사례

Page 80: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

개선후 HITMAP 그래프

A 모바일게임사성능개선사례

Page 81: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

A모바일서비스사성능개선사례

- 서비스특성상정각, 10분, 30분, 45분특정시간대에가장많은트랜잭션이몰리는상황- 해당시간대에 scale out을통하여트랜잭션처리를하고있음

Page 82: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

A모바일서비스사성능개선사례

- HITMAP 을드래그하여프로파일정보조회- 느린트랜잭션분석

Page 83: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

A모바일서비스사성능개선사례

Transaction A Transaction B

- Scale out된상황에서MongoDB Connection Pool이아직준비되지않아응답시간이늦어짐- Node process 가실행될때미리 Connection Size를충분히준비하도록권고

Page 84: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

고객 사례 A:

빠른 배포를 위해 노드를 선택했지만,무엇이 문제인지 찾지 못해 애를 먹었다.

와탭을 통해 응답시간이 개선되는 경험을 얻고 나서,노드도 응답시간을 SLA로 지원할 수 있다는 것을 알게되었다.

L사 CTO

Page 85: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

B. 알람몬 (말랑스튜디오)서비스모니터링

….....

Page 86: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

서비스상황

초장기 컨텐츠를제공하면서 Cache도입

Page 87: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

분석을하니.. Peaktime때느리다..

원인규명?여러분이라면어떻게??

분석원인:

DB구간:트랜잭션분석후느린 쿼리/명령어튜닝

Page 88: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

분석을하니.. Peaktime때느리다..

컨텐츠:캐싱을많이해두었으나터져나감

원인 :고정된컨텐츠의문제기본캐쉬전략이안먹힘.

인기있는 news, shop 관련컨텐츠의우선순위가짧은시간안에변경..

Page 89: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

분석을하니.. Peaktime때느리다..

컨텐츠:캐싱을많이해두었으나터져나감

원인 :고정된컨텐츠의문제인기있는 news, shop 관련컨텐츠의우선순위가짧은시간안에변경..

해결방안 :CDN을사용과적절한캐시 expired time을설정

Page 90: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

고객 사례 B :

싱글 쓰레드, 비동기라 CPU / Memory / IO 프로파일링위주로 모니터링으로 문제를 찾기 힘들다.

노드도 의미있는 트랜잭션 단위로 튜닝을 해야 한다

최치웅 CTO

Page 91: Node.JS 성능이야기 - WhaTap Official Blogblog.whatap.io/wp-content/uploads/2017/06/Node_JS_sonyoungsu.pdf · Memory Usage : Nginx vs Apache . Performance : Nginx vs Apache

Thank You !www.whatap.io