log file sync 쉽지않다.
본문 바로가기

Database Tech

log file sync 쉽지않다.

728x90
300x250
SMALL

은행, 카드, 증권, 보험 등 대부분의 금융 IT DB담당자에게는
'log file sync' 에 대한 단어가 회자되면 그리 흔쾌히 반길 만한 대상이 아니라는 걸 알 것이다. 
"비단 DBA만이 고민하고 해결할 수 있는 부분이 아니기에..."
DB를 둘러싸고 있는 다른 IT관련 영역에서도 함께 보아야 할 부분이기에, 쉽게 해결할 수 있는 부분이 아닐 것이다.  
 
만약, 이 부분에 이슈나 문제가 발생하면  관계자들의 적지않은 노력과 시간을 쏟을 것이다. 
그러나, 쏟은 노력과 시간에 비하여 결과가 빠르게 명쾌히 나오지 않아 곤혹스러운 부분도 있을 것이다. 
 
금융 IT에서도 특히, 트레이딩 시스템을 운영하는 증권사에서는 더욱 더 ...
장시작과 장마감을 "log file sync로 시작해서, log file sync로 끝난다고" 
 
log file sync 대기 감소는 어떻게?   
 - commit 수 조절 ( 어플리케이션 세션 선정, 분석, 소스 변경 등 쉽지 않은 여정이다. 그러나, 효과가 큰 포인트)
 - 동시 트랜잭션 최소화위한 프로그램단(배치성)의 대기 시간 부여(sleep, 같은 log file sync 대기시간도 퀄리티 존재함)
 - log buffer size 조절 (운영상에서 이 또한 쉽지 않으며, 테스트 구성 시, TR을 운영계처럼 시뮬레이션 어려움)
 - 똘똘한 디스크(메모리디스스크) 사용 (어느정도 완화 가능, 필요 시 대량의 데이터마이그레이션)
 - I/O 분산 최적화 (어느정도 완화 가능)
 - mutli log writer thread (db writer thread처럼 log writer thread도 완화 가능, 12c 버그 경험자들은 망설여지는 포인트)
 - DR 스토리지 Sync 해제 (권장하지는 않지만, write 성능을 위해 가능한 해제시간 결정 필요)  등
 
log file sync 관련 시스템 통계 데이터 수집/분석/예측을 위한 데이터는?
   - 초당 log file sync wait 시간 (단위 : s)
   - 전체 DB transaction 수 (user commit, user rollback, application rollback) 
   - 평균 log file sync 시간/transaction (단위 : ms)  
   - (필요시)세션단의 통계정보를 통해 특정 어플리케이션의 transaction 수
 
   PL/SQL문(sleep, 부하최소화)으로 작성하여, 일일 추이 더 나아가 연간 추이까지 데이터 확보한다. 
 
   이를 위해 준비하고 실천하는 과정은 쉽지 않은 긴 여정이다. 
   그러나, 축적된 데이터를 기반으로 미래를 대비하고 공유하자. 
 
 
[sample script]
해당 스크립트는 log file sync와 관련 데이터를 한건 출력하며, 
이를 지속적으로 출력 혹은 DB에 저장하려면 약간의 수정이 필요하다.
 
set serveroutput on
set timing off
set time off
set feedback off
 
declare
value0 varchar2(30);
value3 number;
value4 number;
value5 number;
value6 number;
time1 timestamp;
time2 timestamp;
 
begin
select systimestamp into time1 from dual; 
select distinct sum(value) over(), (select time_waited_micro from v$system_event where event = 'log file sync') into value5, value3
from v$sysstat where 
where name in ('user commits','user rollbacks','transaction rollbacks');
 
dbms_lock.sleep(0.4);
 
select systimestamp into time2 from dual; 
select distinct sum(value) over(), (select time_waited_micro from v$system_event where event = 'log file sync') into value6, value4
from v$sysstat where 
where name in ('user commits','user rollbacks','transaction rollbacks');
 
dbms_output.put_line(to_char(time1,'YYYYMMDD HH24:MI:SS.FF2')||' ~ '||to_char(time2,'HH24:MI:SS.FF2')||' ('||lpad(extract(SECOND from time2-time1),5)||')'||' log file sync/tx(ms) : '||lpad(to_char(round((value4-value3)/1000/(value6-value5),2),'FM9990.00'),5)||' transaction/s : '||lpad(round((value6-value5)/extract(SECOND from time2-time1),0),5)||' log file sync/s : '||lpad(to_char(round((value4-value3)/1000000/extract(SECOND from time2-time1),2),'FM9990.00'),6));
end;
/

while loop를 이용한 프린트(예)

TPS가 높으면 log file sync도 높다는 것은 필요조건이 아님을 아래에서 확인가능하며, 특정시각에 트랜잭션의집중도가 log file sync에 영향을 주는 것을 전달드립니다.


728x90
반응형
SMALL

'Database Tech' 카테고리의 다른 글