[pgday.seoul 2017] 2. postgresql을 위한 리눅스 커널 최적화 - 김상욱

62
PostgreSQL 위한 리눅스 커널 최적화 김상욱 PgDay.Seoul 2017

Upload: pgdayseoul

Post on 22-Jan-2018

146 views

Category:

Software


3 download

TRANSCRIPT

Page 1: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

PostgreSQL을 위한리눅스 커널 최적화

김상욱

PgDay.Seoul 2017

Page 2: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

2

김상욱

• Co-founder and CEO @ Apposha

• 성균관대컴퓨터공학박사과정

• 4편의 SCI 저널저술, 6편의국제학술대회논문발표

• 클라우드/가상화 분야

• 멀티코어스케줄링 [ASPLOS’13, VEE’14]

• 그룹기반메모리관리 [JPDC’14]

• 데이터베이스/저장장치 분야

• 비휘발성캐시관리 [USENIX ATC’15, ApSys’16]

• 리퀘스트중심 I/O 우선처리 [FAST’17, HotStorage’17]

Page 3: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Apposha?

3

완전 관리형 서비스MySQL 대비 5배 성능

상용 제품 대비 1/10 비용

for

Page 4: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Contents

• PostgreSQL 성능관점에서의리눅스커널최적화

• 백그라운드작업영향최소화

• Full page writes 제거

• Parallel query처리최적화

4

Page 5: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Contents

• PostgreSQL 성능관점에서의리눅스커널최적화

• 백그라운드 작업 영향 최소화

• Full page writes 제거

• Parallel query처리최적화

5

Page 6: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

PostgreSQL구조

6

* 내부 프로세스 종류

- Backend (foreground)

- Checkpointer

- Autovacuum workers

- WAL writer

- Writer

- …Storage Device

Linux Kernel

P1

클라이언트

P2

I/O

P3 P4

요청 응답

I/O I/O I/O

PostgreSQL

DB 성능

Page 7: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

PostgreSQL구조

7

* 내부 프로세스 종류

- Backend (foreground)

- Checkpointer

- Autovacuum workers

- WAL writer

- Writer

- …Storage Device

Linux Kernel

P1

클라이언트

P2

I/O

P3 P4

요청 응답

I/O I/O I/O

PostgreSQL

Page 8: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

PostgreSQL Checkpoint

8

http://www.interdb.jp/pg/pgsql09.html

Page 9: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

PostgreSQL Autovacuum

9

Free Space Map

http://bstar36.tistory.com/308

Page 10: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

백그라운드태스크영향

10

• Dell Poweredge R730

• 32 cores

• 132GB DRAM

• 1 SAS SSD

• PostgreSQL v9.5.6

• 52GB shared_buf

• 10GB max_wal

• TPC-C workload

• 50GB dataset

• 1 hour run

• 50 clients

0

200

400

600

800

1000

1200

0 500 1000 1500 2000 2500 3000

최대응답지연

(ms)

경과시간 (초)

Default

최대 1.1초

Page 11: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

백그라운드태스크영향

11

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

1 50 100 150 200 250 300

처리량

(trx

/sec

)

클라이언트수

Default Aggressive AV

처리량 40%

autovacuum_max_workers3 => 6autovacuum_naptime1min => 15sautovacuum_vacuum_threshold50 => 25autovacuum_analyze_threshold50 => 10autovacuum_vacuum_scale_factor0.2 => 0.1autovacuum_analyze_scale_factor0.1 => 0.05autovacuum_vacuum_cost_delay20ms => -1autovacuum_vacuum_cost_limit-1 => 1000

Page 12: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

백그라운드태스크영향

12

• Dell Poweredge R730

• 32 cores

• 132GB DRAM

• 1 SAS SSD

• PostgreSQL v9.5.6

• 52GB shared_buf

• 10GB max_wal

• TPC-C workload

• 50GB dataset

• 1 hour run

• 50 clients

0

500

1000

1500

2000

2500

0 500 1000 1500 2000 2500 3000

최대응답지연

(ms)

경과시간 (초)

Default Aggressive AV최대 2.5초

Page 13: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

13

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Page 14: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

14

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Buffer Cache

read() write()admission

control

Page 15: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

15

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Buffer Cache

read() write()

Block-level Q

admission control

Page 16: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

16

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Buffer Cache

read() write()

Block-level Q

reorder

FG FG BGBG

Page 17: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

17

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Buffer Cache

read() write()

Block-level Q

reorder

FG FG BGBG

Device-internal Q

admission control

Page 18: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

• 각계층에서의독립적인 I/O 처리

18

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Buffer Cache

read() write()

Block-level Q

reorder

FG FG BGBG

Device-internal QBG FG BGBG

reorder

Page 19: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

19

• I/O 우선순위역전

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Locks

Condition variables

Page 20: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

20

• I/O 우선순위역전

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Locks

Condition variablesCondition variables

I/OFGlock

BGwait

Page 21: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

21

• I/O 우선순위역전

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Locks

Condition variablesCondition variables

I/OFGlock

BGwait

I/OFGlock

BGwait

FGwait

wait

BGvarwake

Page 22: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

I/O 우선순위적용의어려움

22

• I/O 우선순위역전

Storage Device

Caching Layer

Application

File System Layer

Block LayerAbstr

action

Locks

Condition variablesCondition variables

I/OFGlock

BGwait

I/OFGlock

BGwait

FGwait

wait

BGvarwake

I/O

FGwait

wait

BGuser var

wake

FGwait

Page 23: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

• 솔루션 v1 (사후대책)

• 전체계층에서의우선순위적용 [FAST’17]

• 동적우선순위상속 [USENIX ATC’15, FAST’17]

23

FGlock

BG I/OFG BG

submit

complete

FG BG

FGwait

BG

register

BG

inherit

FG BGI/O

submit

complete

wake

CV CV CV

[USENIX ATC’15] Request-Oriented Durable Write Caching for Application Performance[FAST’17] Enlightening the I/O Path: A Holistic Approach for Application Performance

Page 24: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

• 솔루션 v1 (문제점)

24

Page 25: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

• 솔루션 v2 (사전예방)

25

Device Driver

Noop CFQ Deadline Apposha I/O Scheduler

Block Layer

Ext4 XFS F2FS

VFS

Apposha Front-End File System

Etc

리눅스 커널 I/O 스택

PageCache

- 우선순위기반 I/O 스케줄링

- 디바이스큐혼잡제어

- 우선순위기반쓰기 I/O 제어

- OS 캐싱효율성향상

Page 26: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

26

Apposha 최적화 엔진

MongoDBLibrary

PostgreSQLLibrary

ElasticsearchLibrary

V12-M V12-P V12-E

- 태스크중요도, 파일접근패턴분류

Front-End File System I/O Scheduler

• V12성능최적화엔진

Page 27: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

27

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

1 50 100 150 200 250 300

처리량

(trx

/se

c)

클라이언트수

Default Aggressive AV

Page 28: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

28

0

2000

4000

6000

8000

10000

12000

1 50 100 150 200 250 300

처리량

(trx

/se

c)

클라이언트수

Default Aggressive AV V12-P

처리량71-86%

Page 29: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

리퀘스트중심 I/O 우선처리

29

0

500

1000

1500

2000

2500

0 500 1000 1500 2000 2500 3000

최대응답지연

(ms)

경과시간 (초)

Default Aggressive AV V12-P

최대 0.15초

Page 30: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Contents

• PostgreSQL 성능관점에서의리눅스커널최적화

• 백그라운드작업영향최소화

• Full page writes 제거

• Parallel query처리최적화

30

Page 31: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

31

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 32: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

32

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 33: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

33

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 34: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

34

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 35: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

35

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 36: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

36

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 37: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

37

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 38: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

38

Tuning PostgreSQL for High Write Workloads – Grant McAlister

Page 39: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

• WAL 크기

39

0

2

4

6

8

10

12

14

0 100 200 300 400 500 600

WA

L 크기

(GB

)

경과시간 (초)

Default

• PostgreSQL v9.6.5

• 52GB shared_buf

• 1GB max_wal

• TPC-C workload

• 50GB dataset

• 10 min run

• 200 clients

Page 40: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Full Page Writes

40

https://www.toadworld.com/platforms/postgres/b/weblog/archive/2017/06/07/a-first-look-at-amazon-aurora-with-postgresql-compatibility-benefits-and-drawbacks-part-v

Page 41: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

WAL Compression

• WAL 크기

41

0

2

4

6

8

10

12

14

0 100 200 300 400 500 600

WA

L 크

기(G

B)

경과시간 (초)

Default WAL compression

Page 42: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

WAL Compression

• 성능영향

42

0

2000

4000

6000

8000

10000

12000

처리

량(t

rx/s

ec)

Default WAL compression

Page 43: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

WAL Compression

• CPU 사용률

43

0

10

20

30

40

50

60

70

80

90

100

0 100 200 300 400 500 600

CP

U 사

용률

(%)

경과시간 (초)

Default WAL compression

Page 44: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

44

매핑레이어

PostgreSQL

Linux Kernel

Page 45: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

45

매핑레이어

DB 파일

open()

DB 쉐도우파일

PostgreSQL

Linux Kernel

Page 46: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

46

매핑레이어

DB 파일

write()

DB 쉐도우파일

PostgreSQL

Linux Kernel

Page 47: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

47

매핑레이어

DB 파일

read()

DB 쉐도우파일

PostgreSQL

Linux Kernel

Page 48: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

48

매핑레이어

DB 파일

fsync()

DB 쉐도우파일

체크포인트

PostgreSQL

Linux Kernel

Page 49: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

49

매핑레이어

DB 파일

write()

DB 쉐도우파일

Page 50: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

50

매핑레이어

DB 파일

write()

DB 쉐도우파일

Page 51: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

51

매핑레이어

DB 파일 DB 쉐도우파일

read()

Page 52: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

• WAL 크기 (max_wal_size=1GB)

52

0

2

4

6

8

10

12

14

0 100 200 300 400 500 600

WA

L 크

기(G

B)

경과시간 (초)

Default WAL compression V12-P

Page 53: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

• 성능영향

53

0

2000

4000

6000

8000

10000

12000

처리

량(t

rx/s

ec)

Default WAL compression V12-P

처리량 2X

Page 54: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Atomic Write 지원

• CPU 사용률

54

0

10

20

30

40

50

60

70

80

90

100

0 100 200 300 400 500 600

CP

U 사

용률

(%)

경과시간 (초)

Default WAL compression V12-P

Page 55: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Contents

• PostgreSQL 성능관점에서의리눅스커널최적화

• 백그라운드작업영향최소화

• Full page writes 제거

• Parallel query 처리 최적화

55

Page 56: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query

56

https://blog.2ndquadrant.com/whats-new-in-postgres-xl-9-6/

Page 57: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query

57

느린응답빠른응답

사용자쿼리

백엔드

워커

cache

storage

cache

storage

cache

storage

cache

storage

hit hitmiss!

워커 워커 워커

miss!

Page 58: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query

• 기존문제점

58

Page 59: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query 처리최적화

• 성능영향

59

pgbench –i –s 1000 test1

pgbench –i –s 1000 test2

Q1: SELECT * FROM pgbench_accounts WHERE filler LIKE ‘%x% -d test1

Q2: SELECT * FROM pgbench_accounts WHERE filler LIKE ‘%x% -d test2

QUERY PLAN

--------------------------------------------------------------------------------------

Gather (cost=1000.00..1818916.53 rows=1 width=97)

Workers Planned: 7

-> Parallel Seq Scan on pgbench_accounts (cost=0.00..1817916.43 rows=1 width=97)

Filter: (filler ~~ '%x%'::text)

Page 60: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query 처리최적화

• 성능영향

60

0

5

10

15

20

25

30

35

40

Solo Deadline Noop CFQ Task-aware

응답시간

(초)

Q1 Q2

Page 61: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

Parallel Query 처리최적화

• 성능영향 (디바이스큐 off)

61

0

20

40

60

80

100

Solo Deadline Noop CFQ Task-aware

응답시간

(초)

Q1 Q2 평균 응답30% 향상

Page 62: [Pgday.Seoul 2017] 2. PostgreSQL을 위한 리눅스 커널 최적화 - 김상욱

62

H http://apposha.io

F www.facebook.com/apposha

M [email protected]