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
감사합니다

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

  • 1.
    PostgreSQL DB Tuning 기업사례 PGDay.Seoul2017 송춘자(cjsong@naver.com)
  • 2.
    송춘자 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 시작
  • 3.
    About ChemEssen, Inc 2006 설립, 40개 기술특허, 글로벌 웹서비스  화학기술과 정보기술의 융합 서비스 제공  Chemical Quantum Application + Mathematical Modeling + IT
  • 4.
    검색 속도 개선상황 발생  신규 자료 입력 발생  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
  • 5.
    속도 개선 결과 구분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
  • 6.
    속도개선방법  개발소스에서 사용중인SQL query 변경  업무규칙 변경 가능 부분 협의 적용  Index 재생성  Text Search 기능 적용  DBMS Parameter 조정
  • 7.
    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;
  • 8.
    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;
  • 9.
    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;
  • 10.
    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
  • 11.
    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
  • 12.
    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
  • 13.
    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 진행  입력 실패시 재작업 최소화
  • 14.