Upload
hathien
View
247
Download
5
Embed Size (px)
Citation preview
Node.JS 성능 이야기
2017.4 WhaTap Labs www.whatap.io
Part I.
소개
Node.js 장점
Node Package Manager
모듈이 45만개 육박
각 언어의 모듈 성장세
http://www.modulecounts.com/
Node.js 사용한 어플리케이션
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.
Node.js Paypal
[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal
Node.js Paypal
[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal
Node.js Paypal
[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal
Node.js Paypal
[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal
Node.js Paypal
[출처]http://www.slideshare.net/lennymarkus/node-js-at-paypal
Node.js 좋은 활용
• REST + JSON APIs• Single-page web app• Real-time web app• 빠른 prototyping• 많은 I/O 처리
Node.js 나쁜활용
• CPU 부하걸리는작업• Multi-thread app
• 큰데이터연산• 복잡한비지니스로직
• Server side Javascript
• Event driven
• Asynchronous
• Non-Blocking I/O
• Single Threaded
• Lightweight
• Fast
#02. Node.js의철학및아키텍처
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
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++
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
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.
Reactor – select , epoll
Proactor – IOCP
Node.js System
Application
V8( Javascript engine )
Node.jsBindings
Libuv( Asyncronous I/O )
EventQueue
WorkerThreads
Event loop
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()
Memory Usage : Nginx vs Apache
Performance : Nginx vs Apache
Single Thread가 성능이나요?CPU가 놀지 않나요?
Node.js Production 레벨에서는CPU 갯수 +@ 만큼 Single Thread를 뛰워요!
외부의도움을받아 eventloop도 core별로늘릴수있다.
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
Benchmark 2 : 간단한 http 요청http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/
Part 2. Node.JS 성능 분석 도구
V8( Javascript engine )
ApplicationNode.jsBindings
Libuv( Asyncronous I/O )
EventQueue
WorkerThreads
Event loop
V8 Engine
Node. JS 성능포인트
메모리 문제 잡기 (heap dump로)
process.memoryUsage()
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }
V8 GC 동작원리
http://d2.naver.com/helloworld/329631 http://bit.ly/2qAqJ9u by Irina Shestack
heap snapshot 얻는 방법
• npm v8-profiler (코드에 instrument 코드를 삽입)
• npm node-inspector
• StrongLoop arc
• NodeSource N|Solid
Heap Snapshot
NSolid Heap Snapshot
CPU Profiling으로문제잡기
cpu profilng 정보를 얻는 방법
• npm v8-profiler (코드에 instrument 코드를 삽입)
• Npm node-inspector
• StrongLoop arc
• NodeSource N|Solid
CPU Profiling
Chrome에서보는 Timeline 뷰
NSolid Flame Graph
Eventloop의성능측정 (I/O)
EventLoop동작원리
EventLoop 동작원리
https://lemycanh.wordpress.com/2015/05/24/node-js-event-loop/
EventLoop 동작원리
http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/
EventLoop문제점
http://www.juhonkoti.net/2015/12/01/problems-with-node-js-event-loop
Single Thread가가져오는성능저하.
성능측정 (handler부하테스트)
Node에서긴작업을하면..
nodejs dashboard (open source) https://github.com/FormidableLabs/nodejs-dashboard
힌트
• 일정한 응답시간을 SLA로 보장하는 서비스라면, Node 서비스가 올라간인스턴스의 자원을 적게 쓰게 만들어라 (60%)
• CPU 사용량이 높은 (복잡한 계산이 들어가 있는) 서비스는 Node가비적합.
• 높은 스펙의 인스턴스에 여러 노드를 서비스를 놓는것 보다는, 낮은스펙의 여러개의 인스턴스를 늘려서 사용하는 것이 훨씬 유리.
• 다른 paas 보다, 비용적으로는 heroku 짱! (traffic 비용, io 비용 없음)
Part 3.
와탭이 제안하는 성능모니터링
성능의 핵심은 트랜잭션..
UserTransaction
SQL SQL
Http
FileResource
`
성능 측정의 핵심은 웹 애플리케이션의 개별 트랜잭션을 모니터링 하는 것입니다. 얼마나 쉽고 빠르게 성능 이슈를 감지하고
분석할 수 있는지가 가장 중요합니다.
APM의 핵심은 무수하게 많은 트랜잭션을 잘 분석하는 것
3:04 3:05 3:06 3:07
40초
80초
10초
웹 서버 성능의 기준은 logNormal
응답시간이0에 수렴할수록 좋은서버
설치형 성능 분석 툴 (APM) 대부분이 분포를 사용
하지만 SaaS형 APM 툴은 분포를 사용하기 힘들다..
▪ 엄청난 데이터 량를 전송▪ TPS (초당 트랜잭션)▪ 트랜잭션당 프로파일링 정보..▪ + …
▪ 보안 문제▪ …
그래서 Tingyun, OneAPM, New Relic 은 분포 포기!! 평균..)
평균 응답시간 – 과연 최적의 표현??
평균 응답시간 – 이렇게 표현 된다면.. 양이 문제를 가린다. (N사)
그에 대한 와탭의 고민.. 분포를 표현하는 이상적인방법
구간(5초 단위) + 빈도 (진하기)이러면 훨씬 적은 데이터로.. 분포 표현
가능
N사를 사용한 고객들의 불만.. 데이터 표현 주기 1분 (와탭은 5초)
N사는 1분평균의데이터를보여주기때문에최근 20초동안애플리케이션에문제가발생하더라도,
나머지 40초간의정상적인트랜잭션으로인해데이터가평균화되면서실제문제를못보는경우가발생한다.
데이터표현방법 (N사의문제)
WhaTap의데이터표현방법
가치 1 : 빠르게 장애를 인지하고 대처할수 있는가? 실시간 분석
가치 2 : 우리 서비스의 피크타임은 언제지?출근후 비 업무 시간에는 문제가 없었나?
24시간을 한눈에 보는 사후 분석.
가치 3 : 전 세계적으로 데이터 수집해서 한 곳에서 볼수 있냐?
가치 4. 1000대의인스턴스를한눈에볼수있다.
Part 4. 고객 성공 사례
A. 모바일게임사성능개선사례
- Express를사용중이며,하루약 800만건의 Request가발생- Request의대부분은 Image 요청
이미지 request
문제인식
- Active Transaction 증가- 응답시간증가- 최대 TPS 26
A 모바일게임사성능개선사례
- 응답시간이 느린 트랜잭션은 대부분 이미지 요청
- Express에서는 default 로 serve-static 이라는 package module을 사용.
- 모바일 게임사로, http request 요청에 Cookie 와 Header를 클라이언트 개발팀 임의로수정하면서 304 리턴이 아닌 매번 새로운 이미지를 받아가는 상황 발생
- 동일한 이미지에 대해서 file open이 매번 요청이 되어 I/O 부하 및 TPS 한계치 도달
대응 방안
1. 클라이언트 업데이트를 통한 해결- 게임 사용자가 업데이트를 하기 전까지는 해결되지 않음
2. Node.JS 에서 미리 파일을 읽어들여 Cache 한 데이터로 리턴- 임시 대응책이긴 하나, 이미지 갯수가 많지 않았으므로 바로 대응 가능
A 모바일 게임사 성능 개선 사례
- 이미지 Cache 이후 응답시간이 현저하게 줄어들었음- Active Transaction 갯수 또한 줄어든 것을 확인
A 모바일 게임사 성능 개선 사례
- 응답시간이 줄어들었으나 HITMAP y축 Scale 을 5초 단위로 변경- 특정한 응답시간 대에 줄이 생기는 것을 확인
문제인식
A 모바일 게임사 성능 개선 사례
- Express 에서는 body-parser package module 을 default로 사용
- Query, Body parameter 등이 해당 module에서 parsing 되어짐
- body-parser의 bodyParser.urlencoded({ extended: false }) 에서 지연되는 것을 확인
대응 방안
1. 클라이언트에서 json 양식으로 request를 보내고 있는 것을 확인하였으므로, 해당 모듈사용 중지하여 응답시간 개선
A 모바일 게임사 성능 개선 사례
개선후 HITMAP 그래프
A 모바일게임사성능개선사례
A모바일서비스사성능개선사례
- 서비스특성상정각, 10분, 30분, 45분특정시간대에가장많은트랜잭션이몰리는상황- 해당시간대에 scale out을통하여트랜잭션처리를하고있음
A모바일서비스사성능개선사례
- HITMAP 을드래그하여프로파일정보조회- 느린트랜잭션분석
A모바일서비스사성능개선사례
Transaction A Transaction B
- Scale out된상황에서MongoDB Connection Pool이아직준비되지않아응답시간이늦어짐- Node process 가실행될때미리 Connection Size를충분히준비하도록권고
고객 사례 A:
빠른 배포를 위해 노드를 선택했지만,무엇이 문제인지 찾지 못해 애를 먹었다.
와탭을 통해 응답시간이 개선되는 경험을 얻고 나서,노드도 응답시간을 SLA로 지원할 수 있다는 것을 알게되었다.
L사 CTO
B. 알람몬 (말랑스튜디오)서비스모니터링
….....
서비스상황
초장기 컨텐츠를제공하면서 Cache도입
분석을하니.. Peaktime때느리다..
원인규명?여러분이라면어떻게??
분석원인:
DB구간:트랜잭션분석후느린 쿼리/명령어튜닝
분석을하니.. Peaktime때느리다..
컨텐츠:캐싱을많이해두었으나터져나감
원인 :고정된컨텐츠의문제기본캐쉬전략이안먹힘.
인기있는 news, shop 관련컨텐츠의우선순위가짧은시간안에변경..
분석을하니.. Peaktime때느리다..
컨텐츠:캐싱을많이해두었으나터져나감
원인 :고정된컨텐츠의문제인기있는 news, shop 관련컨텐츠의우선순위가짧은시간안에변경..
해결방안 :CDN을사용과적절한캐시 expired time을설정
고객 사례 B :
싱글 쓰레드, 비동기라 CPU / Memory / IO 프로파일링위주로 모니터링으로 문제를 찾기 힘들다.
노드도 의미있는 트랜잭션 단위로 튜닝을 해야 한다
최치웅 CTO
Thank You !www.whatap.io