데이터베이스 개발자 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
» CLR 사용시 CPU 사용률 증가 현상 jevida(강성욱) 2016.09.29 1763
1810 DMV를 이용한 CPU 사용량 높은 쿼리 찾기 jevida(강성욱) 2016.09.29 4453
1809 DMV를 이용한 인덱스 크기 및 조각화 정보 반환 jevida(강성욱) 2016.09.29 1158
1808 Checkpoint 추적하기 jevida(강성욱) 2016.09.29 1287
1807 중복 인덱스와 성능(Duplicate Indexes with Performance) jevida(강성욱) 2016.09.29 2299
1806 823, 824, 825, 832 오류 (DISK IO 오류) jevida(강성욱) 2016.09.29 2186
1805 DISK I/O 병목 확인 jevida(강성욱) 2016.09.29 3837
1804 SQL Server 2012에서 비상계정 생성하기 - 비밀번호를 잊어 버렸을 경우 대처하기 jevida(강성욱) 2016.09.29 1253
1803 SQL Server 차단 최소화 jevida(강성욱) 2016.09.29 1131
1802 자주 사용되는 System 함수 jevida(강성욱) 2016.09.29 1072
1801 프로시저와 임시테이블, 그리고 리컴파일 jevida(강성욱) 2016.09.29 2451
1800 access check cache 크기에 따른 성능 문제 jevida(강성욱) 2016.09.29 1051
1799 Hot Add CPU jevida(강성욱) 2016.09.29 851
1798 스레드 및 파이버 실행 jevida(강성욱) 2016.09.29 1018
1797 CPU에 스레드 할당 및 lightweight pooling 옵션 사용 jevida(강성욱) 2016.09.29 1731
1796 스레드 및 태스크 아키텍처 jevida(강성욱) 2016.09.29 1414
1795 메모리 관리 아키텍처 – NUMA 버퍼 풀 증가 및 축소 jevida(강성욱) 2016.09.29 1232
1794 메모리 관리 아키텍처 – NUMA 지원 방법 jevida(강성욱) 2016.09.29 1555
1793 메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해 jevida(강성욱) 2016.09.29 1417
1792 메모리 관리 아키텍처 – Hot Add 메모리 jevida(강성욱) 2016.09.28 929





XE Login