[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자

Preview:

Citation preview

PostgreSQL

DB Tuning 기업사례

PGDay.Seoul 2017

송춘자(cjsong@naver.com)

송춘자 cjsong@naver.com

ChemEssen,Inc 개발부서장

고려대학교 컴퓨터정보통신대학원 소프트웨어공학과

‘16 PostgreSQL DB 시작

‘99 web program 시작

‘97 Oracle Process Monitoring tool 제작 by PB

‘96 OCP-DBA 7.3 취득

‘93 UNIX & C System program 시작

About ChemEssen, Inc

2006 설립, 40개 기술특허, 글로벌 웹서비스

화학기술과 정보기술의 융합 서비스 제공

Chemical Quantum Application + Mathematical Modeling + IT

검색 속도 개선 상황 발생

신규 자료 입력 발생

Master data 285만건 1억6백만건, 37배 증가

Master data size 25 GB 1 TB, 40배 증가

검색속도 저하 발생

651 msec 10분 17초, 948 배 증가 (ID)

1.2 초 7분 20초, 367 배 증가 (name)

773 msec 10분, 776 배 증가 (smiles)

Chemical data 특수성

IUPAC Name

• (3R,6R,7R)-2,3,7-trimethyl-6-(propan-2-yl)tetradecane

• N'-[(2E)-3-(3,4-dimethoxyphenyl)prop-2-enoyl]-2-phenylacetohydrazide

Smiles

• CC(C)CCCC(C)C3CCC4C2CC=C1CC(O)CCC1(C)C2CCC34C

Formula

• C27H46O

• C11H14O3S2

속도 개선 결과

구분 Column type 285만건 1억6백만건

개선전

1억6백만건

개선후

ID VC(12) 651 msec 10분 17초 32 msec

Name VC(4890) 1.2 sec 6분 16초 7 sec

Smiles Text 773 msec 10분 25초 547 msec

Formula VC(50) 1.2 sec 10분 33초 32 msec

InChIKey VC(50) 930 msec 10분 22초 46 msec

속도개선방법

개발소스에서 사용중인 SQL query 변경

업무규칙 변경 가능 부분 협의 적용

Index 재생성

Text Search 기능 적용

DBMS Parameter 조정

Text Search 기능 적용 순서

검색 전용 tsvector 컬럼 추가

ALTER TABLE chemicalsc.tb_chem_info

ADD COLUMN textsearchable_index_col tsvector;

Data update

UPDATE chemicalsc.tb_chem_info SET textsearchable_index_col

= to_tsvector('english', coalesce(replace(upper(iupac_name), ' ', ''), ''));

Gin 인덱스 생성

CREATE INDEX idx_chem_info_textsearchable_index_col

ON chemicalsc.tb_chem_info USING gin (textsearchable_index_col)

TABLESPACE tbs_chemical_idx00;

Sql query - 개선 전

SELECT chem_info_id, iupac_name,

(length('Benzene') - length(iupac_name) + 100) as jaro

FROM chemicalsc.tb_chem_info

WHERE iupac_name_upper_stuck like replace(upper( '%Benzene%' ), ' ', '' )

ORDER BY jaro desc, iupac_name asc

LIMIT 2000;

Sql query - 개선 후

SET work_mem to '100MB';

SELECT chem_info_id, iupac_name,

(length('benzen’) - length(iupac_name)+100) as jaro

FROM chemicalsc.tb_chem_info

WHERE textsearchable_index_col @@ to_tsquery('english', 'benzen')

ORDER BY jaro desc, iupac_name asc

LIMIT 2000;

DB Server Spec

Version: PostgreSQL 9.5.8 on x86_64-pc-linux-gnu

CPU : XeonE5-2643 3.3GHz*8

RAM : 32 GB

Disk : 24 TB (1+0)

Max Connection : 100

postgresql.conf

effective_cache_size

데이터 캐싱에 사용할 수 있는 메모리 양

인덱스 사용여부 결정

shaed_buffers할당메모리+사용가능한OS캐시 메모리

시스템 전체메모리 *(50% ~ 75%)

32GB * 50% = 16GB, 32GB * 75% = 24GB

maintenance_work_mem

Vacuum, create index 작업시 사용

1GB당50MB

32 * 50MB = 1,600 MB

shared_buffers

Disk IO최소화 목적

시스템 전체 메모리 *25%

32 GB * 0.25 = 8 GB

postgresql.conf

work_mem

sort, bitmap작업,hash join, merge join작업

최대크기=total RAM /max_connections/ 4

안전크기=total RAM /max_connections/ 16

세션마다 다르게 설정 가능

32 GB / 100 / 4 = 0.08 GB = 80 MB

32 GB / 100 / 16 = 0.02 GB = 20 MB

wal_buffers

DB변경사항을 임시 저장하는 버퍼

16MB

max_wal_size / min_wal_size

2GB / 1GB

stats_temp_directory

/run/shm

Data update하면서…

인덱스 생성은 data insert / update 이후 생성

인덱스 생성된 상태에서

data file 301개 update 처리진행 42일 소요

Vaccum 설정 check 필수 – 1억건 이상

data file 301개 auto vaccum 처리 10일 소요

데이터 insert 시 COPY command 이용

set command 이후 copy command

Source data 파일 여러 개 분할하여 COPY 진행

입력 실패시 재작업 최소화

Q & A

감사합니다

Recommended