CLR 사용시 CPU 사용률 증가 현상

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

SQL Server에서 여러 인스턴스를 운영할 때 비즈니스 환경에 따라 NUMA 구성 및 Affinity mask 옵션을 설정하여 다른 데이터베이스에 영향을 최소화 하도록 구성하여 사용한다.

 

이번 포스팅은 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 :

http://blogs.msdn.com/b/psssql/archive/2013/06/11/a-performance-issue-involving-clr-garbage-collection-and-sql-cpu-affinity-setting.aspx

 

 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38111
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20672
1814 SWITCHOFFSET 내장함수의 잘 못된 예측 - 미리 계산한 값을 쿼리에 연결하여 최적화 하기 jevida(강성욱) 2016.09.30 1429
1813 테이블 반환 매개변수 사용과 SQL 2012의 향상된 캐싱 기능 jevida(강성욱) 2016.09.30 1323
1812 디스크 섹터 크기와 데이터베이스 성능 jevida(강성욱) 2016.09.29 1732
» CLR 사용시 CPU 사용률 증가 현상 jevida(강성욱) 2016.09.29 1863
1810 DMV를 이용한 CPU 사용량 높은 쿼리 찾기 jevida(강성욱) 2016.09.29 4797
1809 DMV를 이용한 인덱스 크기 및 조각화 정보 반환 jevida(강성욱) 2016.09.29 1223
1808 Checkpoint 추적하기 jevida(강성욱) 2016.09.29 1353
1807 중복 인덱스와 성능(Duplicate Indexes with Performance) jevida(강성욱) 2016.09.29 2456
1806 823, 824, 825, 832 오류 (DISK IO 오류) jevida(강성욱) 2016.09.29 2281
1805 DISK I/O 병목 확인 jevida(강성욱) 2016.09.29 4417
1804 SQL Server 2012에서 비상계정 생성하기 - 비밀번호를 잊어 버렸을 경우 대처하기 jevida(강성욱) 2016.09.29 1538
1803 SQL Server 차단 최소화 jevida(강성욱) 2016.09.29 1214
1802 자주 사용되는 System 함수 jevida(강성욱) 2016.09.29 1115
1801 프로시저와 임시테이블, 그리고 리컴파일 jevida(강성욱) 2016.09.29 2547
1800 access check cache 크기에 따른 성능 문제 jevida(강성욱) 2016.09.29 1158
1799 Hot Add CPU jevida(강성욱) 2016.09.29 911
1798 스레드 및 파이버 실행 jevida(강성욱) 2016.09.29 1107
1797 CPU에 스레드 할당 및 lightweight pooling 옵션 사용 jevida(강성욱) 2016.09.29 1833
1796 스레드 및 태스크 아키텍처 jevida(강성욱) 2016.09.29 1512
1795 메모리 관리 아키텍처 – NUMA 버퍼 풀 증가 및 축소 jevida(강성욱) 2016.09.29 1290





XE Login