VM 환경의 SQL Server에서 할당된 CPU 모두 사용하지 못하는 현상

 

·       Version : SQL Server

 

Virtual Machine (VM) 성능이 향상됨에 따라 많은 시스템들이 Physical 서버에서 VM 머신으로 마이그레이션을 진행하고 있다. 이번 포스트는 Physical머신에서 VM으로 마이그레이션 SQL Server에서 할당된 CPU 모두 사용하지 못하는 성능 문제에 대해서 다룬다.

 

Host Server

OS

Windows Server 2019 Standard

CPU

2 socket (64 Core)

RAM

128GB

 

VM Server

OS

Windows Server 2019 Standard

SQL Server

SQL Server 2016 Standard

CPU

8 Core

RAM

32GB

 

아래 그림을 보면 가상머신에 할당된 CPU 8 Core 에서 4 Core 사용하는것을 확인할 있다.

 

아래 쿼리를 사용하여 실제 SQL Server 사용중인 CPU 확인할 있다. 역시 할당된 8개의 코어중에 4개만 사용하고 있음이 표시되었다.

SELECT scheduler_id, cpu_id, status, is_online FROM sys.dm_os_schedulers

 

 

원인을 확인결과 VM 머신의 세팅에 문제가 있다는 것을 확인하였다. 필자가 구성한 VM환경을 보면, 8 소켓에 8Core 설정되어 있는것을 확인할 있다. 뜻은 1소켓 1 코어가 8 할당되었다는 의미이다. SQL 공식 다큐먼트를 보면 Standard 경우 4소켓 또는 24코어까지만 지원된다고 되어 있다. 소켓의 개수가 8개로 세팅되어, 실제 4 소켓만 동작을 하기 때문에 4Core 동작을 하게 된것이다.

VM 환경을 변경하여, 1소켓 8 Core 설정을 변경한 정상적으로 모든 CPU 사용하는 것을 확인하였다.

 

VM 환경을 변경하는것은 시스템 운영에 문제가 발생할 있으므로 반드시 시스템 담당자와 상의해서 진행할 있도록 한다.

 

아래 스크립트는 현재 구성된 VM 환경에서 SQL Server 할당된 CPU 모두 사용가능한지 쉽게 확인한다.

----------------------------------------------------------------------------------------------------------------

-- CPU VISIABLE ONLINE CHECK

----------------------------------------------------------------------------------------------------------------

DECLARE @OnlineCpuCount int

DECLARE @LogicalCpuCount int

 

SELECT @OnlineCpuCount = COUNT(*) FROM sys.dm_os_schedulers WHERE status = 'VISIBLE ONLINE'

SELECT @LogicalCpuCount = cpu_count FROM sys.dm_os_sys_info

 

SELECT @LogicalCpuCount AS 'ASSIGNED ONLINE CPU #', @OnlineCpuCount AS 'VISIBLE ONLINE CPU #',

   CASE

     WHEN @OnlineCpuCount < @LogicalCpuCount

     THEN 'You are not using all CPU assigned to O/S! If it is VM, review your VM configuration to make sure you are not maxout Socket'

     ELSE 'You are using all CPUs assigned to O/S. GOOD!'

   END as 'CPU Usage Desc'

----------------------------------------------------------------------------------------------------------------

GO

 

 

 

2020-03-03/ Sungwook Kang / http://sungwookkang.com

 

 

 

SQL Server, MS SQL, VM, Virtual Machine, CPU 할당, 가상머신 SQL, SQL on VM, dm_os_schedulers, dm_os_sys_info

Docker 무엇인가?

 

·         Version : Docker

 

도커(Docker) 응용프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈소스 프로젝트이다. 도커 컨테이너는 소프트웨어 실행에 필요한 모든 것을 포함하여 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 서버에 설치되는 무엇이든 포함한다.

 


도커와 기존의 가상머신 방식과 차이점은 OS 가상화 여부이다.  VMWare, Hyper-V, VirtualBOX같은 가상머신은 호스트 OS위에 게스트 OS 전체를 가상화 하여 사용하는 방식이다. 이러한 방식은 여러가지 OS 가상화 있고 사용방법이 비교적 간단하지만 많은 리소스가 필요하다.

 


하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM 사용하는 느낌을 준다. 컨테이너는 운영체제에서 애플리케이션을 분리 시키기 때문에 컨테이너 런타임 환경을 지원하는 모든 리눅스 서버로 컨테이너를 옮길 수도 있다. 실행 중인 컨테이너에 접속하여 명령어를 입력할 수도 있고 다양한 패키지를 설치할 수도 있으며 사용자 추가도 가능하다. 또한 여러 개의 프로세스를 백그라운드로 실행할 수도 있다. CPU 메모리 사용량을 제한할 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉터리를 내부 디렉터리처럼 사용할 수도 있다.

 

도커는 고급API 구현함으로써 프로세스들을 별도의 장소에서 실행할 있는 가벼운 컨테이너들을 제공한다. 리눅스 커널이 제공하는 기능들(주로 cgroups 이름공간)위에 빌드 되기 때문에 도커 컨테이너는 가상머신과 달리 별도의 운영체제를 요구하거나 포함하지 않는다. 그대신, 커널의 기능에 의존하며 리소스 격리 격리된 이름 공간을 사용하여 운영체제에 대한 응용 프로그램의 관점을 격리시킨다.

 

 

도커 컨테이너는 많은 장점이 있지만 모든 것을 해결할 없다. 컨테이너는 가상머신과는 메커니즘 자체가 다르기 때문이다. 가상머신은 호스트 OS 에서 자신의 인스턴스로 실행되기 때문에 높은 수준의 프로세스 분리 기능을 제공한다. 운영체제 또한 호스트OS 따라갈 필요도 없다. 컨테이너는 호스트 운영체제에 종속되며 통제된 영역을 사용한다. 많은 애플리케이션이 동일한 운영체제 커널을 공유한다. 컨테이너로 분리된 앱은 가상머신처럼 철저히 분리되어 있지 않다. 컨테이너가 가상머신에 비해 오버헤드가 적다고는 하지만 베어-메탈 수준의 속도를 제공하지는 않는다.

 

컨테이너는 이미지로부터 부팅 실행이 된다. 이미지는 기본적으로 변경이 불가능하며 일단 생성되면 바뀌지 않는다. , 컨테이너는 영속성(Persistency) 가지고 있지 않는다. 컨테이너 인스턴스를 시작하면 기존 컨테이너가 사라지고 새로운 컨테이너가 시작된다. 가상머신의 경우 세션에 대한 영속성을 갖고 있지만 컨테이너 경우 영속성은 부팅에 사용되는 이미지이다. 도커는 이미지의 바뀐 부분을 유니온 파일 시스템 형식(aufs, btrfs, devicemapper) 이용하여 관리한다. 도커는 베이스 이미지에서 바뀐 부분만 이미지로 생성하며 컨테이너로 실행할 때는 베이스 이미지와 바뀐 부분을 합쳐서 실행 한다.




[참고자료]

·         https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

·         https://seunguklee.github.io/2018/02/13/what-is-docker/

·         https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

 

 

2018-12-11 / Sungwook Kang / http://sqlmvp.kr

 

Docker, Docker Image, Virtual Machine, 도커






'SW Engineering > Docker Kubernetes' 카테고리의 다른 글

Docker Stack  (0) 2019.03.26
Docker Swarms  (0) 2019.03.26
Docker Services  (0) 2019.03.26
Build an image and run it as one container  (0) 2019.03.26
Docker Orientation and Setup  (0) 2019.03.26
Docker란 무엇인가?  (0) 2019.03.26

SQL Server 논리 물리 프로세서를 결정하는 방법

 

Version : SQL Server

 

SQL Server  하드웨어 레이아웃 정보를 바탕으로 NUMA 노드를 구성한다. SQL Server 2016 부터는 레이아웃 정보를 바탕으로 자동으로 NUMA 노드를 구성을 한다.

·         SQL Server 2016 Automatic Soft NUMA : http://sqlmvp.kr/220806805474

그렇다면 SQL Server Native(bare metal) 또는 VM 환경과 같이 가상화 환경에서 구성된다면 어떻게 노드를 구성할까. 과정의 핵심은getlogicalprocessorinformation (windows API)  API이며 논리적으로는 bare metal VM 기반이 동일하다.  VM(Virtual Machine) 설치하는경우 지원 기능에 대해서는 벤더의 정보를 참고할 있도록 한다. SQL Server Windows API 사용하여 프로세서와 패키지간의 상호 작용을 결정한다.

·         GetSystemInfo https://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(v=vs.85).aspx

·         GetLogicalProcessorInformation https://msdn.microsoft.com/en-us/library/windows/desktop/ms683194(v=vs.85).aspx

 

GetLogicalProcessorInformation API  RelationProcessorCore RelationProcessorPackage 정보를 검색 있다. 반환된 정보를 사용하여 SQL Server 그에 따라 노드와 스케줄러를 할당 한다. 예를들면  SQL Server 2016에서 자동으로 NUMA 노드가 구성될 같은 패키지의 논리 프로세서가 동일한 소프트NUMA 노드가 할당되는 것을 방지 한다.

 

아래 경우 다양한 시스템 정보에서 코어 패키지가 어떻게 표현되는지 있다. 아래 샘플 결과는 8 processor system 이며 싱글 CPU, 4Core system, HT enabled 상태이다.

Readtrace 또는 ostress 에서 GetLogicalProcessorInformation API 사용하여 프로세서 관계를 출력

Active proc mask(0): 0x000000FF

        Architecture: 9

           Page size: 4096

                CPUs: 8

    Processor groups: 1

        Highest node: 0

  Proximity: 00  Node: 00

—————————————

               Group: 0

—————————————

        Processor(s): 0x00000003 Function units: Shared    <— 이진 값을 변경하면 논리당 2개의 프로세서를 나타냄

        Processor(s): 0x0000000C Function units: Shared    <— 프로세서는 RelationProcessorCore 나타냄

        Processor(s): 0x00000030 Function units: Shared

        Processor(s): 0x000000C0 Function units: Shared

        Package mask: 0x000000FF    <— 패키지는 RelationProcessorPackage 나타냄

        Processor(s): 0x000000FF assigned to Numa node: 0

 

 

MSINFO32 결과

Processor    Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz, 2801 Mhz, 4 Core(s), 8 Logical Processor(s)

 

SQL Error Log

SQL Server detected 1 sockets with 4 cores per socket and 8 logical processors per socket, 8 total logical processors; using 8 logical processors based on SQL Server licensing. This is an informational message; no user action is required.

 

Hyper-V VM에서 동일하게4 프로세서 할당하였을때 결과이다. 구성에서 프로세서는 단일 CPU, 4코어 , 코어당 단일 CPU 시스템으로 표시된다.

 

Active proc mask(0): 0x0000000F

        Architecture: 9

           Page size: 4096

                CPUs: 4

    Processor groups: 1

        Highest node: 0

  Proximity: 00  Node: 00

—————————————

               Group: 0

—————————————

        Processor(s): 0x00000001 Function units: Separated

        Processor(s): 0x00000002 Function units: Separated

        Processor(s): 0x00000004 Function units: Separated

        Processor(s): 0x00000008 Function units: Separated

        Package mask: 0x0000000F

        Processor(s): 0x0000000F assigned to Numa node: 0

 

MSINFO32

Processor    Intel(R) Core(TM) i7-4810MQ CPU @ 2.80GHz, 2794 Mhz, 4 Core(s), 4 Logical Processor(s)

 

API 시스템이 단일 CPIU 패키지의 4CPU 시스템임을 SQL Server에게 알린다. 프로세서를 별도로 보고함으로써 SQL Server 스케줄러와 노드 할당을 결정할 프로세서를 별도로 처리한다.

Bare metal 단일 CPU, 4코어, HT 지원하므로 4개의 CPU 실제로 어떻게 매핑 될까? 기본적으로 Hyper-V  경우 프로세서는 논리적(floating) 엔티티이다. 최적화가 진행되는 동안 VM 노출된 프로세서는 필요에 따라 이동하여 VM CPU 사이클을 제공할 있다.

Hard Affinity 경우 NUMA 스패닝과 같은 추가 옵션이 VM 솔루션에서 지원되거나 지원되지 않을 수있다. SQL Server스케줄러 레이아웃(Error log or DMV) 추가 옵션을 검토하여 VM bare metal 구성에서 레이아웃 최적화를 최적화하는데 필요할 있다.  

 


 

 

[참고자료]

https://blogs.msdn.microsoft.com/bobsql/2016/06/09/how-it-works-how-sql-server-determines-logical-and-physical-processors/

https://en.wikipedia.org/wiki/Bare_machine

 

 

2017-01-05 / 강성욱 / http://sqlmvp.kr

 

SQL Server, Hyper-V, VM, Virtual Machine, Processor, Bare Metal, GetLogicalProcessorInformation, CPU, Hyperthread, MS SQL, 

+ Recent posts