CLR 사용시 CPU 사용률 증가 현상
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server에서 여러 인스턴스를 운영할 때 비즈니스 환경에 따라 NUMA 구성 및 Affinity mask 옵션을 설정하여 다른 데이터베이스에 영향을 최소화 하도록 구성하여 사용한다.
- NUMA 설정 : http://sqlmvp.kr/140150873571
- Affinity mask 설정 : http://sqlmvp.kr/140191320792
- MAX Server Memory : http://sqlmvp.kr/140167266577
이번 포스팅은 Affinity mask(CPU 선호도 설정) 설정이 되어 있음에도 불구하고 CLR 사용시 CPU 사용률로 인한 성능 문제로 CSS SQL Server Engineers 팀블로그에 기재된 내용이다. 필자가 해당 포스트 내용을 이해한 바탕으로 요약하였기 때문에 번역에 대한 오류나 기술적 문제에 오류가 있을 수도 있음을 밝히며 자세한 내용은 아래 참고자료의 원문을 확인하길 바란다.
CSS 팀 블로그의 내용을 요약한 내용이다.
시스템 환경은 SQL Server에서 2개의 인스턴스를 운영중이며 각 인스턴스는 CPU 선호도가 설정(중복되지 않도록)되어 있으며 충분한 물리적 메모리를 가지고 있으며 최대 메모리가 구성되어 있는 상태이다.
문제의 발생은 특정 인스턴스에서 오랜 시간동안 CPU 점유율이 100%인 것을 확인 하였다. DMV(sys.dm_exec_requests), 성능 모니터, 사용자 덤프 등을 확인한 결과 CLR에서 가비지컬렉터(GC)가 실행될 때 발생하였다.
select * from sys.dm_exec_requests |
SQL Server에서 CPU 선호도를 설정하면 실제 프로세스 선호도를 설정하지 않는다. 대신 선호도는 특정 CPU 스케줄러 스레드 생성시 설정 된다. 사용량이 많은 CPU에서 다른 CPU로 스레드를 이동하는 경우도 있다. 반대로 SQL Server 데이터베이스엔진은 스레드를 CPU에 균일하게 분산하는 스케줄러 작업자 스레드를 할당 한다. 선호도가 설정되어 있지 않은 경우 컴퓨터 CPU를 기반으로 힙과 GC 스레드의 수를 생성한다.
interaction이 발생하면서 기본적으로 CLR 힙과 GC 스레드가 격리되지 않는다. 예를 들어 CPU1에 해당하는 CLR과 CPU2에 해당하는 CLR이 있을 것이다. 인스턴스1에 CPU의 사용률이 높을 경우 GC는 인스턴스2의 CPU를 사용. 결국 CPU 퀀텀은 서로 싸우게 된다.
이를 해결 하기 위해서는 CPU 사용률을 확인 하여 문제가 없는지 확인해야 한다. 진정한 분리를 원하는 경우 VM(VM당 1 인스턴스)을 사용하여 독립적인 환경을 구성해야 한다. 또한 CLR 자체가 GC의 잘못 작동되게 하는 원인일 수 있기 때문에 핫픽스를 적용한다.
이 외에도 CLR의 메모리 누수 이슈를 공유 한다.
CRL 사용 환경의 메모리 누수 : http://sqlmvp.kr/140191466784
[참고자료]
- CSS SQL Server Engineers :
2013-07-08 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
테이블 반환 매개변수 사용과 SQL 2012의 향상된 캐싱 기능 (0) | 2015.07.22 |
---|---|
디스크 섹터 크기와 데이터베이스 성능 (0) | 2015.07.22 |
DMV를 이용한 CPU 사용량 높은 쿼리 찾기 (0) | 2015.07.22 |
DMV를 이용한 인덱스 크기 및 조각화 정보 반환 (0) | 2015.07.22 |
Checkpoint 추적하기 (0) | 2015.07.22 |