1. log file sync란?

1) 이벤트 원인

  • 서버 프로세스가 커밋 또는 롤백 수행 시 LGWR은 리두 버퍼에서 가장 최근의 기록이 이루어진 이후 시점부터 커밋 지점까지의 리두 레코드를 리두 로그 파일에 기록하며 이를 'sync write'라고 함.
  • 서버 프로세스는 커밋 명령을 내린 후 LGWR가 성공적으로 기록을 할 때까지 대기하기 되는데, 이 때 'log file sync' 이벤트를 대기함.

2) 이벤트 발생 시 의심 사항

1커밋 회수가 지나치게 많지 않은가?
2I/O 시스템이 느리지 않은가?
3리두 데이터가 불필요하게 생성되지는 않은가?
4리두 버퍼가 지나치게 크지 않은가?

2. 커밋 회수와 log file sync

1) 개요

  • 지나치게 많은 커밋은 'log file sync' 대기의 결정적인 주범.
  • 일반적으로 커밋 1회 수행 시 'log file sync' 대기가 발생하므로, 여러 세션에서 동시에 대량의 커밋 수행하면, 이 이벤트가 광범위하게 나타남

2) group commit

  • 오라클은 커밋에 의해 매번 'sync write'를 수행할 경우 시스템 전체에 악영향을 줄 수 있으므로, 가급적 커밋 요청을 모아 한꺼번에 'sync write'를 수행함.
  • 이를 'group commit'이라 부르며, PL/SQL 블록에서 반복적으로 커밋을 하거나, 'Recursive SQL'에 의한 커밋, 또는 여러 세셔네서 동시에 커밋 요청이 올 경우 사용.
  • 'group commit'이 사용되는 경우에 'user commits' 통계값은 커밋 명령을 호출한 횟수와 동일하게 증가하지만 'log file sync' 대기는 한번만 발생함.

3) 정리

  • 'group commit'을 통해 커밋에 의한 성능저하현상이 어느 정도 해소는 가능하나, 여전히 잦은 커밋은 많은 문제를 일으킴.
  • 그러므로 가급적, 트랜잭션 단위를 합리적으로 묶어서 커밋이 이루어지게 하고, PL/SQL을 활용하는 것이 좋음.

3. I/O 시스템의 성능과 log file sync

1) 개요

  • I/O 시스템 성능이 느린 경우, LGWR의 'sync write' 수행시간이 늘어나고, 이로 인해 'log file sync' 대기시간 증가할 수 있음.
  • 이 때, LGWR은 'log file parallel write' 이벤트를 대기하는데, 커밋 회수 검토 후 이상이 없음에도 이 이벤트가 보일 경우, I/O 성능 개선이 필요함.
  • 일반적으로, 이 이벤트의 원인은 로그 파일이 위치한 I/O 시스템의 성능에 믄제가 있다고 파악할 수 있음.

2) 해결방안

  • 리두 로그 파일을 가장 빠른 디바이스에 위치시킴.
  • 디스크 경합을 피하기 위해 서로 다른 그룹의 리두 로그 파일은 서로 다른 디스크에 분산시킴.
  • 추가로 리두 로그 파일을 데이터파일이나 컨트롤 파일과 다른 디스크에 배치시킴.

4. 리두 데이터의 양과 log file sync

1) 개요

  • 커밋 수행 시 리두 로그 파일에 기록해야 할 데이터양을 줄일 경우 'log file sync' 대기를 줄일 수 있음.
  • 특히, 크고 긴 트랜잭션에서 리두 데이터양을 줄일 경우, LGWR의 백그라운드 기록 작업이 줄면서, 자연스럽게 리두와 관련된 경합 해소 가능

2) 리두 데이터 양을 줄이는 방법

1☞ 'Nologging' 옵션 사용이 가능하다면, 리두 데이터량을 획기적으로 줄일 수 있으므로, 경합 해소 가능.
2☞ SQL*Loader로 대량의 데이터 적재 시, 'Direct load option'을 사용함.
3☞ 임시작업이 필요할 경우, 가급적 'Temporary Table'을 사용함.
☞ 'Temporary Table'을 사용할경우, 비록 언두에 의해 리두는 생성되지만, 데이터에 대한 리두는 생성되지 않기 때문에, 리두 데이터양이 전반적으로 감소함.
4☞ 인덱스가 있는 테이블에 대해 'Direct load' 작업 수행시, 인덱스를 ''Unusable' 상태로 변경 > 데이터 생성 > 인덱스 'Nologging' 모드로 재구성' 할 경우, 리두 생성 방지 가능.
5☞ LOB 데이터의 경우 데이터 크기가 크다면, 가급적 'Nologging' 속성 부여함.

5. 리두 버퍼의 크기와 log file sync

1) 개요

  • 리두버퍼의 크기가 지나치게 큰 경우, 'log file sync' 대기가 증가하는 경향이 있음.
  • 리두 버퍼의 크기가 큰 경우, LGWR에 의한 백그라운드 기록 횟수가 줄어드는데, 이 경우 유저 세션에서 'sync write' 수행 시 기록해야 할 데이터량이 많이지므로, 대기시간 증가함.

2) 해결방안

1. 'log file sync' 대기☞ 리두 버퍼의 크기 감소.
2. 'log buffer space' 대기☞ 리두 버퍼의 크기 증가.
3. 2개가 동시에 보일 경우☞ '_LOG_IO_SIZE' 히든 파라미터는 리두 버퍼의 내용을 리두 로그 파일에 저장하는 임계치 값.
☞ 'log buffer space' 대기를 줄이기 위해, 리두 버퍼 크기를 증가시키고, '_LOG_IO_SIZE' 사이즈를 감소시켜야 함.

문서에 대하여