SlideShare a Scribd company logo
1 of 122
Download to read offline
Pinpoint
대규모 분산환경 APM
강운덕
네이버 서비스플랫폼개발센터
Contents
1. 분산환경의 문제점
2. Pinpoint의 특징과 기술
- CallStack Trace
- Distributed Transaction Trace
3. 분산환경의 트러블슈팅
4. RPC Timeline Pattern
5. 신기능 & 발전방향
1.
분산환경의 문제점
가이드페이지-섹션구분
Why
과거
Why
NOW
문제점
상황
수십 수백대의 서버
많은 소프트웨어 모듈
복잡하게 연동된 서비스
문제
어떻게 연동되고 있는지 파악안됨
다른 서비스에 의해 장애가 발생
개별 서버의 모니터링으로는 전체상황의 파악이 안됨
분산되면 더 어려운 이유
Network 의존성
관찰이 매우 어려움
기존방식으로는 문제를 잘 파악하기 힘듬
Logging
Single WAS Monitoring
GC Log, Heap Dump, Thread Dump
System Monitoring
복잡한 시스템의 성능 문제
해외
Proxy
API
GATEWAY
Service
DB,
CACHE,
RPC
CACHE
아키텍쳐 구성도
아무튼 느린 Request 추적해 봅시다
Tomcat에 느린 Log를 찍어 봅시다
HttpClient 호출 Log도 찍어 봅시다
Apache Access Log도 찍어 봅시다
아무튼 느린 Request 추적해 봅시다
때려쳐~ 때려쳐~
분산 아키텍쳐의 현실
분산 아키텍쳐의 현실
분산 아키텍쳐의 현실
분산 아키텍쳐의 현실
통짜
2.
Pinpoint 소개
Pinpoint
대규모 분산 시스템의 성능정보 수집과 문제 분석을 위한 APM 도구
- APM (Application Performance Management)
분산 트랜잭션 추적
애플리케이션 토폴로지 자동 발견 & 가시화
수평확장성
코드수준의 가시성
코드를 수정하지 않고 성능정보 수집
http://github.com/naver/pinpoint
무엇이 가능해졌는가?
과거에는 발견하지도 못했던 문제를 발견가능해짐
문제를 쉽게 빠르게 해결
문제 진단과 수정시간이 대폭 단축
Architecture
Collector
Host 1 Host 2 Host n
Web
Host JVM
JVM Option JavaAgent 명시
프로파일링 머신 대상군
Host Application
Java Agent
…
HBase
HBase
HBase
Send Profile Data
UDP/TCP (Thrift)
HBase Write
HBase Read
Architecture
Collector
Host 1 Host 2 Host n
Web
Host JVM
JVM Option JavaAgent 명시
프로파일링 머신 대상군
Host Application
Java Agent
…
HBase
HBase
HBase
Send Profile Data
UDP/TCP (Thrift)
HBase Write
HBase Read
Architecture
Collector
Host 1 Host 2 Host n
Web
Host JVM
JVM Option JavaAgent 명시
프로파일링 머신 대상군
Host Application
Java Agent
…
HBase
HBase
HBase
Send Profile Data
UDP/TCP (Thrift)
HBase Write
HBase Read
Architecture
Collector
Host 1 Host 2 Host n
Web
Host JVM
JVM Option JavaAgent 명시
프로파일링 머신 대상군
Host Application
Java Agent
…
HBase
HBase
HBase
Send Profile Data
UDP/TCP (Thrift)
HBase Write
HBase Read
TomcatA
TomcatC
TomcatD
TomcatB
TomcatF
Mysql1
Cubrid
Mysql2
Cache
원격지 주소…
원격지 주소…
TomcatA
TomcatA
TomcatA
TomcatC
TomcatD
TomcatB
TomcatF
Mysql1
Cubrid
Mysql2
Cache
원격지 주소…
원격지 주소…
TomcatA
TomcatA
TomcatA
TomcatC
TomcatD
TomcatB
TomcatF
Mysql1
Cubrid
Mysql2
Cache
원격지 주소…
원격지 주소…
TomcatA
TomcatA
TomcatA
TomcatC
TomcatD
TomcatB
TomcatF
Mysql1
Cubrid
Mysql2
Cache
원격지 주소…
원격지 주소…
TomcatA
TomcatA
TomcatA
TomcatC
TomcatD
TomcatB
TomcatF
Mysql1
Cubrid
Mysql2
Cache
원격지 주소…
원격지 주소…
TomcatA
TomcatA
CallStack Trace
Distributed Transaction Trace
Distributed Transaction Trace
HttpClient.execute()
Distributed Transaction Trace
Tomcat.receive();
Tomcat.receive();
Distributed Transaction Trace
TOMCAT A
TOMCAT B
Pinpoint의 핵심기능
CallStack Trace
Distributed Transaction Trace
CallStack Trace
AMethod(); -> BMethod(); -> CMethod();
ClassABC
CallStack Trace
AMethod() {
BMethod() {
CMethod() {
}
}
}
AMethod(); -> BMethod(); -> CMethod();
CallStack Trace
AMethod() {
BMethod() {
CMethod() {
}
}
}
CallStack
CMethod();
BMethod();
AMethod();
AMethod(); -> BMethod(); -> CMethod();
CallStack Trace
JVM Classloader
public void AMethod() {
BMethod();
}
public void AMethod() {
BMethod();
}
AInterceptor.before();
AInterceptor.after();
Class Loading시점에 Code를
가로채 bytecode를 변경
Pinpoint
Agent
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
ROOT -1
New Stack &
Bind ThreadLocal
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
AMethod
Sequence:0
Frame
Pointer
Stack
Frame
Depth
ROOT -1
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
ROOT -1
PUSH
StackFrame
AMethod
Sequence:0
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
0
ROOT -1
AMethod
PUSH
StackFrame
AMethod
Sequence:0
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
1
0
ROOT -1
PUSH
StackFrame
BMethod
Sequence:1
AMethod
BMethod
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
2
1
0
ROOT -1
PUSH
StackFrame
Cmethod
Sequence:2
AMethod
BMethod
CMethod
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
2
1
0
ROOT -1
POP
StackFrame
AMethod
BMethod
CMethod
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
2
1
0
ROOT -1POP
StackFrame
AMethod
BMethod
WriteQueue
C
C
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
1
0
ROOT -1POP
StackFrame
AMethod
BMethod
WriteQueueC
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
1
0
ROOT -1POP
StackFrame
AMethod
WriteQueue
B
C B
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
0
ROOT -1POP
StackFrame
WriteQueue
A
C B A
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
ROOT -1
WriteQueueC B A
Empty
Stack
AMethod() {
AIntercetor.before()
BMethod() {
BInterceptor.before()
CMethod() {
CInterceptor.before();
CInterceptor.after();
}
BInterceptor.after ()
}
AIntercetor.after ()
}
CallStack Trace
Frame
Pointer
Stack
Frame
Depth
ROOT -1
WriteQueueC B AQueue
Flush
Network
Write
CallStack Trace
HBase
C B A
CallStack Trace
Web
HBase
C B A
CallStack Trace
WAS
C
B
A
Sequence
0
1
2
CallStack Trace
WAS
C
B
A 0
1
2
Depth
0
1
2
Sequence
CallStack Trace
WAS
C
B
A 0
1
2
Depth
0
1
1
Sequence
Distributed Transaction Trace
Distributed Transaction Trace
RPC간의 관계를 찾는 방법
Request안에 추적 Tag를 포함시킨다
Http : HttpHeader
Distributed Transaction Trace
TraceId
- TransactionID
- SpanID
- pSpanID
Node 1 Node 2
Node 3
Node 4
TxId:Node1^Time^1
SpanId =1
pSpanId = -1
TxId:Node1^Time^1
SpanId = 3
pSpanId = 2
TxId:Node1^Time^1
SpanId = 4
pSpanId = 2
RPC 1
RPC 2
RPC 3
TxId:Node1^Time^1
SpanId = 2
pSpanId =1
Distributed Transaction Trace
TransactionID : GUID로 전체 메시지 아이디
각 노드마다 동일한 ID가 할당
TxId:Node1^Time^1
SpanId = 4
pSpanId = 2
TxId:Node1^Time^1
SpanId = 3
pSpanId = 2
Node 1 Node 2
Node 3
Node 4
TxId:Node1^Time^1
SpanId =1
pSpanId = -1
RPC 1
RPC 2
RPC 3
TxId:Node1^Time^1
SpanId = 2
pSpanId =1
Distributed Transaction Trace
SpanID, pSpanID : 부모 자식관계 정렬을 위한 ID
Node 1 Node 2
Node 3
Node 4
TxId:Node1^Time^1
SpanId =1
pSpanId = -1
TxId:Node1^Time^1
SpanId = 3
pSpanId = 2
TxId:Node1^Time^1
SpanId = 4
pSpanId = 2
RPC 1
RPC 2
RPC 3
TxId:Node1^Time^1
SpanId = 2
pSpanId =1
Distributed Transaction Trace
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Distributed Transaction Trace
TraceId 생성
TRANSACTION_ID : TomcatA^시작시간^1
SPAN_ID : 10
PARENT_SPAN_ID : -1
Distributed Transaction Trace
Spring Controller Method 정보 레코딩
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Distributed Transaction Trace
HttpClient 호출을 가로채 Next TtraceId 를 저장
TRANSACTION_ID : TomcatA^시작시간^1
SPAN_ID : 20 (신규발급)
PARENT_SPAN_ID : 10 (부모의 SpanId 10)
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Distributed Transaction Trace
Tag
Request
Distributed Transaction Trace
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Tag
Request
TomcatB는 Header에서 TraceId를 인식하여 Child로 동작
TRANSACTION_ID : TomcatA^시작시간^1
SPAN_ID : 20 (신규발급)
PARENT_SPAN_ID : 10 (부모의 SpanId 10)
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Distributed Transaction Trace
HBase
RowKey
TomcatA^시작시간^1
20
10
Hello() 호출정보
TraceData
Collector
TomcatA
@Controller
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() throws IOException {
HttpGet get = new HttpGet("http://TomcatB/hello");
HttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity());
}
}
TomcatB
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "world!";
}
}
Distributed Transaction Trace
HBase
RowKey
TomcatA^시작시간^1
20 10
10
Hello() 호출정보
-1
Test() 호출정보
Collector
TraceData
HBase
RowKey
TomcatA^시작시간^1
20 10
10
Hello() 호출정보
-1
Test() 호출정보
WEB
3.
분산환경의
TroubleShooting
Pinpoint가 없었던 시절
연동 시스템에 장애가 발생한다면…
Pinpoint가 없었던 시절
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
…
Caused by: ◂◊╩◌♪♦♂◘◦▸╫╛╟╤❶╦╧[afg00101101aj..
…
Caused by: …
Pinpoint가 없었던 시절
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
…
Caused by: ◂◊╩◌♪♦♂◘◦▸╫╛╟╤❶╦╧[aDgfRhaj..
…
Caused by: …
Pinpoint사용시
원격지A
B
A
Pinpoint 사용시
A
Pinpoint 사용시
A
Pinpoint 사용시
Pinpoint 사용시
Pinpoint 사용시
어려운 문제
해외
Proxy
API
GATEWAY
Service
DB,
CACHE,
RPC
CACHE
전체 아키텍쳐 가시화
전체 아키텍쳐 가시화
APIGATEWAY1
호주Proxy
미국Proxy
Mobile-app
Server-WEB
APIGATEWAY2
일본Proxy
호주Proxy
미국Proxy
유럽Proxy
남미Proxy
APIGW-1
APIGW-2
Service
DB
RPC
RPC…
Cache
일본Proxy
미국Proxy
유럽Proxy
남미Proxy
APIGW-1
APIGW-2
Service
DB
RPC
RPC…
Cache
호주Proxy
일본Proxy
미국Proxy
유럽Proxy
남미Proxy
APIGW-1
APIGW-2
Service
DB
RPC
RPC…
Cache
호주Proxy
일본Proxy
미국Proxy
유럽Proxy
남미Proxy
APIGW-1
APIGW-2
Service
DB
RPC
RPC…
Cache
호주Proxy
개별 Request 흐름 가시화
미국Proxy
개별 Request 흐름 가시화
해외 Proxy APIGateway Service
RPC-A
RPC-B
RPC-C
MySql
RPC-D
해외 Proxy
6초
APIGateway
6초
해외 Proxy
6초
APIGateway
6초
APIGateway
6초
Service
응답시간
6초
…
Service
응답시간
6초
…
해외 Proxy APIGateway Service
MySql
RPC-A
RPC-B
RPC-C
RPC-D
해외 Proxy APIGateway Service
RPC-A
RPC-B
RPC-C
RPC-D
MySql
Service
6초
…
개별 Request 흐름 가시화
XXX YYY
ABC
http://A.naver
http://B.naver
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
개별 Request 흐름 가시화
APIGateway
해외 Proxy
Service
해외Proxy APIGateway Service
RPC-A
RPC-B
RPC-C
RPC-D
MySql
4.
RPC Timeline Pattern
RPC Timeline Pattern
Rpc Timeline, CallStack의 시간 분포 패턴
TCP connect가 지연된 상황
Socket Option : ConnectTimeout , Socket Backlog
WebServer : Apache, Nginx
Network Switch : LoadBalancer(L4)
Client 특성 : HttpClient의 내부 retry 로직
RPC Timeline Pattern 1
TCP 연결에 문제가 있는 패턴
Client execute
Server
RPC Timeline Pattern 2
Network이 느린 경우
Client execute
Server
해외서버에 서버가 존재하는경우
Network 트래픽, 서버의 위치 점검
HTTP KeepAlive, HTTP2 활용
Gzip과 같은 압축활용
RPC Timeline Pattern 3
Client execute
Server
TargetServer의 처리가 느림
Client의 전면 장애로 파급될 가능성이 있음
Socket Timeout
Circuit breaker : Netflix Hystrix
TargetServer가 느림
RPC Timeline Pattern 4
Client execute
Server
Response 를 받은 후 Stream에서 데이터를 추가로 읽는 경우
- 대용량 파일 다운로드
보통 정상상태
이 상황이 문제를 유발한다면, 별도 서버 구축이 필요
응답데이터가 많음
5.
신기능 &
발전방향
1.5 신기능
Plugin System
사용자가 필요한 API의 정보 수집이 가능
Google Gson Plugin
- com.navercorp.pinpoint.plugin.gson.GsonPlugin
1.5 신기능
Real Time 강화
Was ActiveThread Monitoring
발전방향
예측, 제안, 패턴 분석
JVM 메모리가 OOM 패턴이라면 -> 경고
동일한 WAS의 응답시간 패턴이 다르다면 -> 경고
발전방향
발전방향
발전방향
예측, 제안, 패턴 분석
문제가 있는 Lib를 쓰고 있다면 -> 버전업 제안
JVM Version, Option 이 바람직하지 않다면 -> 권장 설정 제안
발전방향
Java가 아닌 구간도 프로파일링
WebServer구간의 성능 수집
- Apache, Nginx
Q&A
Thank You

More Related Content

What's hot

Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
理弘 山崎
 

What's hot (20)

UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編
 
WebSocketプロトコル
WebSocketプロトコルWebSocketプロトコル
WebSocketプロトコル
 
[D2]pinpoint 개발기
[D2]pinpoint 개발기[D2]pinpoint 개발기
[D2]pinpoint 개발기
 
Consulを頑張って理解する
Consulを頑張って理解するConsulを頑張って理解する
Consulを頑張って理解する
 
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
 
Apache Flink and what it is used for
Apache Flink and what it is used forApache Flink and what it is used for
Apache Flink and what it is used for
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)[오픈소스컨설팅] 서비스 메쉬(Service mesh)
[오픈소스컨설팅] 서비스 메쉬(Service mesh)
 
Linux Systems Performance 2016
Linux Systems Performance 2016Linux Systems Performance 2016
Linux Systems Performance 2016
 
HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법
HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법
HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
Networking in Java with NIO and Netty
Networking in Java with NIO and NettyNetworking in Java with NIO and Netty
Networking in Java with NIO and Netty
 
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
 
Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較
 
Confluent Workshop Series: ksqlDB로 스트리밍 앱 빌드
Confluent Workshop Series: ksqlDB로 스트리밍 앱 빌드Confluent Workshop Series: ksqlDB로 스트리밍 앱 빌드
Confluent Workshop Series: ksqlDB로 스트리밍 앱 빌드
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
Observability
ObservabilityObservability
Observability
 

Viewers also liked

Viewers also liked (20)

[153] apache reef
[153] apache reef[153] apache reef
[153] apache reef
 
[161] 데이터사이언스팀 빌딩
[161] 데이터사이언스팀 빌딩[161] 데이터사이언스팀 빌딩
[161] 데이터사이언스팀 빌딩
 
[113] lessons from realm
[113] lessons from realm[113] lessons from realm
[113] lessons from realm
 
[131] packetbeat과 elasticsearch
[131] packetbeat과 elasticsearch[131] packetbeat과 elasticsearch
[131] packetbeat과 elasticsearch
 
[142] how riot works
[142] how riot works[142] how riot works
[142] how riot works
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
 
[133] 브라우저는 vsync를 어떻게 활용하고 있을까
[133] 브라우저는 vsync를 어떻게 활용하고 있을까[133] 브라우저는 vsync를 어떻게 활용하고 있을까
[133] 브라우저는 vsync를 어떻게 활용하고 있을까
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 
[141] react everywhere
[141] react everywhere[141] react everywhere
[141] react everywhere
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
 
[124] mit cheetah 로봇의 탄생
[124] mit cheetah 로봇의 탄생[124] mit cheetah 로봇의 탄생
[124] mit cheetah 로봇의 탄생
 
[114] DRC hubo technical review
[114] DRC hubo technical review[114] DRC hubo technical review
[114] DRC hubo technical review
 
[132] rust
[132] rust[132] rust
[132] rust
 
[122] line on apple watch
[122] line on apple watch[122] line on apple watch
[122] line on apple watch
 
[111] 네이버효과툰어떻게만들어졌나
[111] 네이버효과툰어떻게만들어졌나[111] 네이버효과툰어떻게만들어졌나
[111] 네이버효과툰어떻게만들어졌나
 
[154] 데이터 센터의 오픈 소스 open compute project (ocp)
[154] 데이터 센터의 오픈 소스 open compute project (ocp)[154] 데이터 센터의 오픈 소스 open compute project (ocp)
[154] 데이터 센터의 오픈 소스 open compute project (ocp)
 
[143] 모바일 혈액진단기기 개발 삽질기
[143] 모바일 혈액진단기기 개발 삽질기[143] 모바일 혈액진단기기 개발 삽질기
[143] 모바일 혈액진단기기 개발 삽질기
 
[144]mobile앱에서 효율적인 storage 접근 방법
[144]mobile앱에서 효율적인 storage 접근 방법[144]mobile앱에서 효율적인 storage 접근 방법
[144]mobile앱에서 효율적인 storage 접근 방법
 
[134] immersive sound vr
[134] immersive sound vr[134] immersive sound vr
[134] immersive sound vr
 

Similar to [164] pinpoint

[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
용민 박
 
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
choi kyumin
 

Similar to [164] pinpoint (20)

Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명
 
Netmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoSNetmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoS
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
네트워크 기본
네트워크 기본네트워크 기본
네트워크 기본
 
Hadoop security DeView 2014
Hadoop security DeView 2014Hadoop security DeView 2014
Hadoop security DeView 2014
 
TXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API ServiceTXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API Service
 
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platform
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
 
Radware Alteon Introduction - new GUI
Radware Alteon Introduction - new GUIRadware Alteon Introduction - new GUI
Radware Alteon Introduction - new GUI
 
Xmpp
XmppXmpp
Xmpp
 
Xmpp 세미나
 Xmpp 세미나 Xmpp 세미나
Xmpp 세미나
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기
 
어려웠다, WebRTC를 활용한 360º 영상통화 트러블 슈팅
어려웠다, WebRTC를 활용한 360º 영상통화 트러블 슈팅어려웠다, WebRTC를 활용한 360º 영상통화 트러블 슈팅
어려웠다, WebRTC를 활용한 360º 영상통화 트러블 슈팅
 
[2018] NHN 모니터링의 현재와 미래 for 인프라 엔지니어
[2018] NHN 모니터링의 현재와 미래 for 인프라 엔지니어[2018] NHN 모니터링의 현재와 미래 for 인프라 엔지니어
[2018] NHN 모니터링의 현재와 미래 for 인프라 엔지니어
 
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
플랫폼데이2013 workflow기반 실시간 스트리밍데이터 수집 및 분석 플랫폼 발표자료
 
퀴즈요약
퀴즈요약퀴즈요약
퀴즈요약
 

More from NAVER D2

More from NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

Recently uploaded

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
Wonjun Hwang
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
Wonjun Hwang
 

Recently uploaded (6)

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

[164] pinpoint