소개
DB튜닝 관련 교육 시 항상 말씀드리는 주제가 있습니다. 대용량 메모리(적어도 수 백GB 이상 특히 1TB 이상)를 사용하게 되면 이전에 없었던 새로운 유형의 성능 이슈들을 접하게 된다고 따라서 그에 따른 진단, 튜닝, 안정화가 필요하다는 것입니다. 이번에 소개하는 Buffer Pool 스캔 이슈도 해당 범위에 포함된다고 생각합니다.
Buffer Pool은 SQL Server가 데이터베이스용으로 사용하는 주 메모리 영역입니다. 아래와 같은 명령들은 메모리 내 데이터를 검사하기 위해Buffer Pool Scan을 수행합니다.
- 데이터베이스 시작
- 데이터베이스 종료 또는 재시작
- 가용성 그룹(AG) Failover
- 데이터베이스 삭제
- 전체 또는 차등 백업
- 데이터베이스 복원
- 트랜잭션 로그 복원
- 온라인 복원
- DBCC CHECKDB or CHECKTABLE 작업
- 또는 CHECKPOINT와 같은 내부 작업
참고 자료
Buffer Pool Scan 작업이 오래걸린다?
이 Scan 작업은 Serial(하나의 CPU 사용)로 동작한다고 알려져있습니다 따라서 대용량 메모리 사용 환경에서는 Scan 작업에 그 만큼 많은 시간이 소요될 수 있는 것이죠 특히 위 작업 유형에서 가용성 그룹의 전환(Failover)이나 데이터베이스 작업 혹은 CHECKPOINT와 같은 내부 작업에 시간이 오래걸릴 수 있다는 것은 중요하게 고려할 관리 포인트가 될 수 있습니다.
Buffer Pool Scan 시간 확인
SQL Server 2016 SP3, 2017 CU23, 2019 CU9 이후에서는 Scan 시간이 10초 이상인 경우 SQL Server Error Log에 다음과 같은 메시지가 추가된다고 소개합니다. (위 링크의 MS 문서 참조)
Buffer Pool scan took 14 seconds: database ID 7, command ‘BACKUP DATABASE’, operation ‘FlushCache’, scanned buffers 115, total iterated buffers 204640239, wait time 0 ms. See ‘https://go.microsoft.com/fwlink/?linkid=2132602’ for more information.또는 확장 이벤트 기능을 이용 “buffer_pool_scan_complete” 이벤트를 추적하면 1초 이상 걸리는 Scan 작업 시 해당 command와 elapsed_time_ms 정보 등을 모니터링 할 수 있습니다. (위 링크의 MS 문서 참조)
이러한 방법으로 여러분이 운영 중인 시스템의 Buffer Pool Scan 시간을 확인해 보시기 바랍니다.
SQL Server 2022 개선
병렬처리를 지원합니다, 64GB(8백만 버퍼) 작업 단위로 병렬처리한다고 합니다, 그러면 더 빠른 처리 속도를 기대할 수 있겠죠. (위 링크 MS 문서 참조) 특히 SQL Server 2022로 업그레이드를 한다면 Before vs. After를 비교해 볼 수 있겠습니다.
위 MS 문서 영상의 6:48s 부분에서 병렬 처리에 따른 성능 테스트 자료를 소개합니다, 자세한 건 영상을 참조해 보시고 간단하게 몇 가지만 비교해 보면
- 2TB 메모리 장비에서 DBCC CHECK 작업에 10~15배, FlushCache 작업에 15배를 언급하고 있습니다.
그리고 직접 확인해 보니 “buffer_pool_scan_stats” 라는 새로운 확장 이벤트가 추가되어 있습니다, 말그대로 통계 정보를 알려주는 것으로 추정됩니다.
정리
자동으로 적용되는 개선 사항이므로 SQL Server 2022 와 대용량 메모리 사용 환경을 가진 고객사를 만나게 되면 한 번 살펴보고 싶은 주제입니다.
모두 건강하세요.
김정선 드림