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

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

가상 SQL Server에 Hot Add vCPU 사용하기

 

  • Version : Windows Server 2008 Ent, SQL Server 2008, 2008R2, 2012 Ent

 

SQL Server 2008 부터 Hot Add CPU 및 Hot Add Memory를 지원한다. 이는 운영중인 물리적인 서버에 시스템 중단 없이 CPU 및 Memory를 추가 할 수 있는 것을 의미한다.

 

 

SQL Server가 가상화 환경이라도 실행중인 프로세스 중단 없이 가상서버에 실시간으로 vCPU를 추가 할 수 있다. vCPU는 가상 머신에 할당된 CPU를 의미하여 vCPU를 추가하는 방법은 물리적인 Hot Add CPU를 사용하는 방법과 동일하다.

 

이번 포스트는 MSSQLTip.com에 게시된 포스트이며 필자가 읽고 이해한 내용을 정리하였다. 번역의 오류나 기술적 오류가 있음을 미리 알려두며 자세한 내용은 원문을 참고하길 바란다.

 

가상 머신의 SQL Sever에 대한 부하 작업을 시뮬레이션 하기 위해 Windows Server 2008 R2 SP1 호스트 환경에 VM게스트는 SQL Server 2012 SP1 엔터프라이즈 에디션, vCPU 1개로 구성 하여 워크로드를 생성하였다.

IF OBJECT_ID('tempdb..#temp', 'U') IS NOT NULL DROP TABLE #temp

GO

SELECT a.*

into #temp

FROM master.dbo.spt_values a

    CROSS JOIN master.dbo.spt_values b

    CROSS JOIN master.dbo.spt_values c

    CROSS JOIN master.dbo.spt_values d

GO

 

 

 

SQL Server 프로세서 선호도를 확인해 보자. SSMS에서 인스턴스 이름을 선택. 마우스 오른쪽을 클릭하여 속성에서 확인 가능 하다. 현재 사용 가능한 vCPU는 1개이기 때문에 SQL Server는 프로세서 선호도를 허용하지 않으며 체크박스는 모든 프로세서에 회색으로 표시 된다.

 

 

다음 DMV를 사용하여 스케줄러를 확인해 보자. SQL Server의 스케줄러당 하나의 행을 반환하고 각 스케줄러가 개별 프로세서에 매핑되어 있다. Schedule_id가 1048576미만의 번호는 관리자 전용연결로 내부적으로 사용되는 id 이다.

SELECT * FROM sys.dm_os_schedulers

GO

 

 

 

SP_Configure에서 선호도 상태를 확인하여 0으로 지정되어 있으면 모든 vCPU를 사용하도록 구성되어 있는 것이다.

EXEC sp_configure 'show advanced options', 1

RECONFIGURE

EXEC sp_configure 'affinity mask'

GO

 

 

 

가상 SQL Server 머신에 새로운 vCPU를 추가하여 보자. 실행 중인 프로세스를 영향을 주지 않고 온라인으로 수행할 수 있다. vCPU를 추가하고 나면 Windows 작업 관리자에서 추가된 CPU를 확인 할 수 있다.

 

위에서 실행한 워크로드 생성 작업을 중지하고 다시 쿼리를 실행하여 보자. 두 개의 CPU가 균형을 이루어 사용하는 것처럼 보이지만 전체의 50%만 활용되고 있다. 이는 현재 SQL Server는 여전히 추가된 vCPU를 사용하지 않기 때문인 것으로 예상 된다.

 

 

 

SSMS에서 인스턴스 속성에서 프로세서를 확인해 보면 현재 2개의 vCPU를 보여주는 것을 확인 할 수 있다.

 

 

SQL Server 스케줄은 SQLOS 스케줄 작업에 포함되어 있다. 추가된 vCPU에 대한 스케줄러가 없기 때문에 작업을 할당 하지 못하여 활용할 수 없다. 아래 명령어로 SQL Server 재구성을 실행하여 Hot Add vCPU를 참조하도록 한다.

RECONFIGURE

GO

 

 

 

다시 스케줄러를 확인하는 DMV를 실행하여 보자. SQL Server는 VISIBLED ONLINE HOT_ADDED 에 대한 스케줄러(schedule_id 1)를 만든 것을 확인 할 수 있다.

SELECT * FROM sys.dm_os_schedulers

GO

 

 

 

워크로드를 발생하는 쿼리를 다시 실행하였다. 여전히 CPU는 전체의 50%만 사용하였다. 우리는 다른 곳에 병목이 있는지 확인 하였다.

 

 

다음 스크립트를 사용하여 워크로드를 발생시키기 위한 쿼리가 싱글 스레드로 실행 되고 있는 것을 확인 할 수 있었다.

SELECT

STasks.session_id, SThreads.os_thread_id, Txt.text, Sch.scheduler_id

FROM sys.dm_os_tasks AS STasks

INNER JOIN sys.dm_os_threads AS SThreads

ON STasks.worker_address = SThreads.worker_address

INNER JOIN sys.dm_os_schedulers Sch

ON Sch.scheduler_address = SThreads.scheduler_address

INNER JOIN sys.dm_exec_requests Req

ON Req.session_id = Stasks.session_id

CROSS APPLY sys.dm_exec_sql_text(Req.sql_handle) Txt

WHERE STasks.session_id = 59

GO

 

 

이는 실행 하려는 작업이 고부하의 병렬처리를 하지 않는 경우 CPU의 추가로 인한 효울성을 높일 수 없는 것을 의미 한다. 따라서 CPU를 추가할 때 워크로드를 이해하는 것이 매우 중요한 것을 알 수 있다.

 

다음 스크립트는 다중 프로세서를 사용하도록 제작하였다.

-- Execute the query below in 12 separate query windows

CREATE TABLE #test

(

col1 int NOT NULL IDENTITY (1, 1),

col2 varchar(50) DEFAULT 'test values',

col3 datetime DEFAULT GetDATE()

)

GO

SET NOCOUNT ON

WHILE 1 = 1

INSERT INTO #test DEFAULT VALUES

 

 

스케줄러를 확인해 보면 2개의 스케줄러를 통하여 작업을 처리하고 있다.

SELECT

STasks.session_id, SThreads.os_thread_id, Txt.text, Sch.scheduler_id

FROM sys.dm_os_tasks AS STasks

INNER JOIN sys.dm_os_threads AS SThreads

ON STasks.worker_address = SThreads.worker_address

INNER JOIN sys.dm_os_schedulers Sch

ON Sch.scheduler_address = SThreads.scheduler_address

INNER JOIN sys.dm_exec_requests Req

ON Req.session_id = Stasks.session_id

CROSS APPLY sys.dm_exec_sql_text(Req.sql_handle) Txt

WHERE STasks.session_id <> 61

GO

 

 

Windows 작업관리자에서 보면 모든 vCPU에서 사용량이 증가 하였다.

 

 

SQL Server 또는 Windows가 다시 시작되면 아래 그림과 같이 DMV로 스케줄러 상태를 보면 vCPU의 상태가 ONLINE로 변경되어 있는것을 확인 할 수 있다.

 

 

 

[참고자료]

 

 

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

No. Subject Author Date Views
1870 백업 미디어 세트에 압축 백업 추가하기 jevida(강성욱) 2016.10.08 1432
1869 Collation에 따른 실행계획 변경과 성능 문제 jevida(강성욱) 2016.10.08 1666
1868 SQL Connection Timeout 디버깅 with BizTalk Server jevida(강성욱) 2016.10.08 2219
1867 인스턴스 파일 초기화 활성 jevida(강성욱) 2016.10.08 1679
1866 누락된 인덱스 확인하기 jevida(강성욱) 2016.10.08 2785
1865 비클러스터 인덱스 페이지 내용 jevida(강성욱) 2016.10.08 2009
1864 ATTACH DATABASE 오류 1314 jevida(강성욱) 2016.10.08 1160
1863 SQL Server 커넥션 풀링 jevida(강성욱) 2016.10.08 3894
» 가상 SQL Server에 Hot Add vCPU 사용하기 jevida(강성욱) 2016.10.08 1112
1861 DDL 트리거를 활용한 ERRORLOG에 XEVENT 상태 기록하기 jevida(강성욱) 2016.10.08 1344
1860 쉐어포인트의 SQL Server 접속 문제 jevida(강성욱) 2016.10.08 1445
1859 Lazy Log Truncation jevida(강성욱) 2016.10.08 1268
1858 인덱스 구성과 상황에 따른 인덱스 성능 jevida(강성욱) 2016.10.08 1456
1857 Max worker thread 초과 이슈 jevida(강성욱) 2016.10.08 2563
1856 SQL Server Failover 클러스터 설치 트러블슈팅 jevida(강성욱) 2016.10.08 2333
1855 MAXDOP 극대화 하기 jevida(강성욱) 2016.10.08 1963
1854 SQL Server 가상화 팁 jevida(강성욱) 2016.10.08 2015
1853 Net Framework 4.0과 SQL Server 2008 설치 오류 jevida(강성욱) 2016.10.08 1834
1852 SQL Server 인덱스 튜닝 접근 jevida(강성욱) 2016.10.07 3359
1851 Sys.dm_os_performance_counter 해석하기 jevida(강성욱) 2016.10.07 2231





XE Login

테스트 팝업
Close