데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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
1830 SQL Server 2012 Sp1 설치 이슈 및 해결 jevida(강성욱) 2016.09.30 1573
1829 SSD에서 DBCC CHECKDB 성능 벤치마킹 jevida(강성욱) 2016.09.30 1931
1828 Collation에 따른 ALTER DATABASE 실패 jevida(강성욱) 2016.09.30 1930
1827 LDF 파일이 잘리지 않는 이유 jevida(강성욱) 2016.09.30 2051
1826 Tempdb 경합 확인 및 해결 (Tempdb Contention) jevida(강성욱) 2016.09.30 2211
1825 SQL Server IO 병목 확인과 오해 jevida(강성욱) 2016.09.30 2497
1824 SQL Version에 따른 sp_prepare 정보 반환 jevida(강성욱) 2016.09.30 1711
1823 DReplay 활성 세션 초과 에러 jevida(강성욱) 2016.09.30 1542
1822 저장 프로시저 내 임시 테이블 사용과 프로시저 재컴파일 jevida(강성욱) 2016.09.30 1862
1821 NUMA 노드와 추척플래그 8048 jevida(강성욱) 2016.09.30 819
1820 온라인 인덱스 리빌드와 조각화 증가 jevida(강성욱) 2016.09.30 1602
1819 VARCHAR(MAX) and NTEXT 쿼리 성능 jevida(강성욱) 2016.09.30 4316
1818 CPU 리소스 상태에 따른 병렬 처리 제한 jevida(강성욱) 2016.09.30 1075
1817 매개변수 값의 변경과 SQL 서버 성능 저하 jevida(강성욱) 2016.09.30 1269
1816 IN 절 사용시 예기치 못한 액세스 위반과 SQL Server 종료 jevida(강성욱) 2016.09.30 1060
1815 SQL 버전과 CLR (.NET Framework 버전에 따른 오류) jevida(강성욱) 2016.09.30 1188
1814 SWITCHOFFSET 내장함수의 잘 못된 예측 - 미리 계산한 값을 쿼리에 연결하여 최적화 하기 jevida(강성욱) 2016.09.30 1311
1813 테이블 반환 매개변수 사용과 SQL 2012의 향상된 캐싱 기능 jevida(강성욱) 2016.09.30 1223
1812 디스크 섹터 크기와 데이터베이스 성능 jevida(강성욱) 2016.09.29 1635
» CLR 사용시 CPU 사용률 증가 현상 jevida(강성욱) 2016.09.29 1757





XE Login