SQL Server/SQL Server Tip

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

SungWookKang 2015. 7. 22. 10:48
반응형

가상 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로 변경되어 있는것을 확인 할 수 있다.

 

 

 

[참고자료]

 

 

 

 

2013-10-14 / 강성욱 / http://sqlmvp.kr

 

 

 

 

반응형