스레드 및 태스크 아키텍처 가이드Thread and Task Architecture Guide

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

스레드는 응용 프로그램 논리를 여러 동시 실행 경로로 분리할 수 있게 하는 운영 체제 기능입니다.Threads are an operating system feature that lets application logic be separated into several concurrent execution paths. 이 기능은 여러 태스크를 동시에 수행할 수 있는 복잡한 응용 프로그램에 유용합니다.This feature is useful when complex applications have many tasks that can be performed at the same time.

운영 체제는 응용 프로그램 인스턴스를 실행할 때 인스턴스를 관리하는 프로세스라는 단위를 만듭니다.When an operating system executes an instance of an application, it creates a unit called a process to manage the instance. 프로세스에는 실행 스레드가 하나씩 있습니다.The process has a thread of execution. 실행 스레드는 응용 프로그램 코드가 수행하는 일련의 프로그래밍 명령입니다.This is the series of programming instructions performed by the application code. 예를 들어 차례로 수행되는 단일 명령 집합을 포함하는 단순한 응용 프로그램에는 응용 프로그램에 하나의 실행 경로 또는 스레드만 있습니다.For example, if a simple application has a single set of instructions that can be performed serially, there is just one execution path or thread through the application. 좀 더 복잡한 응용 프로그램은 차례로 진행되지 않고 동시에 수행될 수 있는 여러 태스크를 포함할 수 있습니다.More complex applications may have several tasks that can be performed in tandem, instead of serially. 이 경우 응용 프로그램은 각 태스크에 대해 별도의 프로세스를 시작해야 합니다.The application can do this by starting separate processes for each task. 그러나 프로세스를 시작하는 데는 많은 리소스가 필요합니다.However, starting a process is a resource-intensive operation. 따라서 응용 프로그램은 프로세스를 시작하는 대신 별도의 스레드를 시작할 수 있습니다.Instead, an application can start separate threads. 이렇게 하면 리소스 사용량이 상대적으로 줄어듭니다.These are relatively less resource-intensive. 또한 각 스레드는 프로세스와 관련된 다른 스레드와 독립적으로 실행되도록 예약할 수 있습니다.Additionally, each thread can be scheduled for execution independently from the other threads associated with a process.

스레드는 복잡한 응용 프로그램이 단일 CPU가 있는 컴퓨터에서도 CPU를 더 효율적으로 사용할 수 있게 합니다.Threads allow complex applications to make more effective use of a CPU, even on computers that have a single CPU. 하나의 CPU가 있으면 한 번에 한 스레드만 실행할 수 있습니다.With one CPU, only one thread can execute at a time. 한 스레드가 디스크 읽기 또는 쓰기와 같이 CPU를 사용하지 않는 장기 실행 작업을 실행하는 경우 첫 번째 작업이 완료될 때까지 다른 스레드를 실행할 수 있습니다.If one thread executes a long-running operation that does not use the CPU, such as a disk read or write, another one of the threads can execute until the first operation is completed. 다른 스레드가 작업이 끝날 때까지 기다리는 동안 스레드를 실행할 수 있으면 응용 프로그램이 CPU의 사용을 최대화할 수 있습니다.By being able to execute threads while other threads are waiting for an operation to be completed, an application can maximize its use of the CPU. 이와 같은 이점은 특히 데이터베이스 서버와 같은 여러 사용자가 사용하는 디스크 입출력 집중형 응용 프로그램에서 잘 나타납니다.This is especially true for multi-user, disk I/O intensive applications such as a database server. 여러 마이크로프로세서 또는 CPU가 있는 컴퓨터는 CPU당 하나의 스레드를 실행할 수 있으므로 동시에 여러 스레드를 실행할 수 있습니다.Computers that have multiple microprocessors or CPUs can execute one thread per CPU at the same time. 예를 들어 CPU가 8개 있는 컴퓨터에서는 동시에 8개의 스레드를 실행할 수 있습니다.For example, if a computer has eight CPUs, it can execute eight threads at the same time.

SQL Server 일괄 처리 또는 태스크 일정 예약SQL Server Batch or Task Scheduling

CPU에 스레드 할당Allocating Threads to a CPU

기본적으로 SQL Server 인스턴스마다 각 스레드를 시작합니다.By default, each instance of SQL Server starts each thread. affinity를 사용하는 경우에는 운영 체제에서 각 스레드를 특정 CPU에 할당합니다.If affinity has been enabled, the operating system assigns each thread to a specific CPU. 운영 체제에서는 여러 SQL Server 인스턴스의 스레드를 부하에 따라 컴퓨터의 마이크로프로세서 또는 CPU에 균일하게 분산합니다.The operating system distributes threads from instances of SQL Server among the microprocessors, or CPUs on a computer based on load. 사용량이 많은 CPU에서 다른 CPU로 스레드를 이동하는 경우도 있습니다.Sometimes, the operating system can also move a thread from one CPU with heavy usage to another CPU. 반대로 SQL Server 데이터베이스 엔진은 스레드를 CPU에 균일하게 분산하는 스케줄러에 작업자 스레드를 할당합니다.In contrast, the SQL Server Database Engine assigns worker threads to schedulers that distribute the threads evenly among the CPUs.

affinity mask 옵션은 ALTER SERVER CONFIGURATION를 사용하여 설정합니다.The affinity mask option is set by using ALTER SERVER CONFIGURATION. affinity mask를 설정하지 않으면 SQL Server 인스턴스가 제외되지 않은 스케줄러에 균등하게 작업자 스레드를 할당합니다.When the affinity mask is not set, the instance of SQL Server allocates worker threads evenly among the schedulers that have not been masked off

lightweight pooling 옵션 사용Using the lightweight pooling Option

스레드 컨텍스트 전환과 관련된 오버헤드는 별로 크지 않습니다.The overhead involved in switching thread contexts is not very large. lightweight pooling 옵션을 0으로 설정할 때나 1로 설정할 때 대부분의 SQL Server 인스턴스에는 성능상의 차이가 전혀 없습니다.Most instances of SQL Server will not see any performance differences between setting the lightweight pooling option to 0 or 1. lightweight pooling 을 사용할 경우 성능이 향상될 수 있는 SQL Server 인스턴스는 다음 특성을 가진 컴퓨터에서 실행되는 인스턴스뿐입니다.The only instances of SQL Server that might benefit from lightweight pooling are those that run on a computer having the following characteristics:

  • 대형 다중 CPU 서버입니다.A large multi-CPU server.
  • 모든 CPU가 거의 최대 용량에서 실행됩니다.All the CPUs are running near maximum capacity.
  • 높은 수준의 컨텍스트 전환이 있습니다.There is a high level of context switching.

이러한 시스템의 경우 lightweight pooling 값을 1로 설정하면 성능이 조금 향상됩니다.These systems may see a small increase in performance if the lightweight pooling value is set to 1.

일상 작업을 예약하는 데에는 파이버 모드를 사용하지 않는 것이 좋습니다.We do not recommend that you use fiber mode scheduling for routine operation. 파이버 모드를 사용하면 컨텍스트 전환을 활용하지 못해 성능이 저하될 수 있으며 SQL Server의 일부 구성 요소가 파이버 모드에서 제대로 작동하지 않을 수 있습니다.This is because it can decrease performance by inhibiting the regular benefits of context switching, and because some components of SQL Server cannot function correctly in fiber mode. 자세한 내용은 lightweight pooling을 참조하세요.For more information, see lightweight pooling.

스레드 및 파이버 실행Thread and Fiber Execution

Microsoft Windows에서는 1부터 31까지의 숫자 우선 순위 시스템을 사용하여 스레드 실행 일정을 예약합니다.Microsoft Windows uses a numeric priority system that ranges from 1 through 31 to schedule threads for execution. 0은 운영 체제용으로 예약됩니다.Zero is reserved for operating system use. 여러 스레드가 실행을 위해 대기하고 있을 때 Windows에서는 우선 순위가 가장 높은 스레드를 디스패치합니다.When several threads are waiting to execute, Windows dispatches the thread with the highest priority.

기본적으로 각 SQL Server 인스턴스의 우선 순위는 보통 우선 순위인 7입니다.By default, each instance of SQL Server is a priority of 7, which is referred to as the normal priority. 이 기본값은 다른 응용 프로그램에 나쁜 영향을 주지 않고 SQL Server 스레드가 충분한 CPU 리소스를 얻을 수 있는 우선 순위를 제공합니다.This default gives SQL Server threads a high enough priority to obtain sufficient CPU resources without adversely affecting other applications.

priority boost 구성 옵션을 사용하면 SQL Server 인스턴스 스레드의 우선 순위를 13으로 높일 수 있습니다.The priority boost configuration option can be used to increase the priority of the threads from an instance of SQL Server to 13. 13으로 높일 수 있습니다.This is referred to as high priority. 이 설정은 대부분의 다른 응용 프로그램보다 높은 우선 순위를 SQL Server 스레드에 제공합니다.This setting gives SQL Server threads a higher priority than most other applications. 따라서 SQL Server 스레드는 일반적으로 실행할 준비가 될 때마다 디스패치되고 다른 응용 프로그램의 스레드에 의해 미리 점유되지 않습니다.Thus, SQL Server threads will generally be dispatched whenever they are ready to run and will not be pre-empted by threads from other applications. 이는 서버가 SQL Server 인스턴스만 실행하고 다른 응용 프로그램은 실행하지 않을 때 성능을 향상시킬 수 있습니다.This can improve performance when a server is running only instances of SQL Server and no other applications. 그러나 메모리 집중형 작업이 SQL Server에서 발생할 경우 대개는 다른 응용 프로그램이 SQL Server 스레드를 미리 점유할 만큼 충분히 높은 우선 순위를 갖고 있지 않습니다.However, if a memory-intensive operation occurs in SQL Server, however, other applications are not likely to have a high-enough priority to pre-empt the SQL Server thread.

컴퓨터에서 SQL Server의 여러 인스턴스를 실행하고 일부 인스턴스에 대해서만 priority boost 옵션이 설정되어 있는 경우 보통 우선 순위에서 실행되는 인스턴스의 성능에 나쁜 영향을 줄 수 있습니다.If you are running multiple instances of SQL Server on a computer, and turn on priority boost for only some of the instances, the performance of any instances running at normal priority can be adversely affected. 또한 priority boost가 설정되어 있으면 서버의 다른 응용 프로그램 및 구성 요소의 성능도 저하될 수 있습니다.Also, the performance of other applications and components on the server can decline if priority boost is turned on. 따라서 엄격하게 제어되는 환경에서만 이 설정을 사용해야 합니다.Therefore, it should only be used under tightly controlled conditions.

Hot Add CPUHot Add CPU

Hot add CPU는 실행 중인 시스템에 CPU를 동적으로 추가할 수 있는 기능입니다.Hot add CPU is the ability to dynamically add CPUs to a running system. CPU는 새 하드웨어를 추가하여 물리적으로 추가하거나, 온라인으로 하드웨어를 분할하여 논리적으로 추가하거나, 가상화 계층을 통해 가상으로 추가할 수 있습니다.Adding CPUs can occur physically by adding new hardware, logically by online hardware partitioning, or virtually through a virtualization layer. SQL Server 2008부터 SQL Server는 hot add CPU를 지원합니다.Starting with SQL Server 2008, SQL Server supports hot add CPU.

hot add CPU 요구 사항Requirements for hot add CPU:

  • hot add CPU를 지원하는 하드웨어Requires hardware that supports hot add CPU.
  • 64비트 버전의 Windows Server 2008 Datacenter 또는 Itanium 기반 시스템 운영 체제용 Windows Server 2008 Enterprise EditionRequires the 64-bit edition of Windows Server 2008 Datacenter or the Windows Server 2008 Enterprise Edition for Itanium-Based Systems operating system.
  • SQL Server EnterpriseRequires SQL Server Enterprise.
  • SQL Server는 소프트 NUMA를 사용하도록 구성할 수 없음.SQL Server cannot be configured to use soft NUMA. 소프트 NUMA에 대한 자세한 내용은 Soft-NUMA(SQL Server)를 참조하세요.For more information about soft NUMA, see Soft-NUMA (SQL Server).

SQL Server는 CPU가 추가된 후에 CPU 사용을 자동으로 시작하지 않습니다.SQL Server does not automatically start to use CPUs after they are added. 따라서 SQL Server에서 다른 용도로 추가되었을 수 있는 CPU를 사용하지 않도록 방지할 수 있습니다.This prevents SQL Server from using CPUs that might be added for some other purpose. CPU를 추가한 후 RECONFIGURE 문을 실행하면 SQL Server에서 새로운 CPU를 사용할 수 있는 리소스로 인식하게 됩니다.After adding CPUs, execute the RECONFIGURE statement, so that SQL Server will recognize the new CPUs as available resources.

참고

affinity64 mask 가 구성된 경우 새로운 CPU를 사용하도록 affinity64 mask를 수정해야 합니다.If the affinity64 mask is configured, the affinity64 mask must be modified to use the new CPUs.

CPU 개수가 64개를 초과하는 컴퓨터에서 SQL Server를 실행하기 위한 최선의 방법Best Practices for Running SQL Server on Computers That Have More Than 64 CPUs

CPU와 함께 하드웨어 스레드 할당Assigning Hardware Threads with CPUs

특정 스레드에 프로세서를 바인딩하는 데 선호도 마스크 및 affinity64 마스크 서버 구성 옵션을 사용하지 마세요.Do not use the affinity mask and affinity64 mask server configuration options to bind processors to specific threads. 이러한 옵션은 CPU가 최대 64개일 때만 사용할 수 있습니다.These options are limited to 64 CPUs. 대신 ALTER SERVER CONFIGURATION 의 SET PROCESS AFFINITY 옵션을 사용하세요.Use SET PROCESS AFFINITY option of ALTER SERVER CONFIGURATION instead.

트랜잭션 로그 파일 크기 관리Managing the Transaction Log File Size

트랜잭션 로그 파일의 크기를 늘리려면 자동 증가에 의존하지 마십시오.Do not rely on autogrow to increase the size of the transaction log file. 트랜잭션 로그를 늘리는 작업은 직렬 프로세스로 수행되어야 합니다.Increasing the transaction log must be a serial process. 로그를 확장하면 로그 확장이 끝날 때까지 트랜잭션 쓰기 작업이 수행되지 않을 수 있습니다.Extending the log can prevent transaction write operations from proceeding until the log extension is finished. 대신 환경의 일반적인 작업량을 지원할 수 있는 값으로 파일 크기를 설정하여 로그 파일에 충분한 공간을 미리 할당합니다.Instead, preallocate space for the log files by setting the file size to a value large enough to support the typical workload in the environment.

인덱스 작업을 위한 최대 병렬 처리 수준 설정Setting Max Degree of Parallelism for Index Operations

CPU가 여러 개인 컴퓨터에서 데이터베이스의 복구 모델을 임시로 대량 로그 또는 단순 복구 모델로 설정하여 인덱스 만들기 또는 다시 작성과 같은 인덱스 작업의 성능을 향상시킬 수 있습니다.The performance of index operations such as creating or rebuilding indexes can be improved on computers that have many CPUs by temporarily setting the recovery model of the database to either the bulk-logged or simple recovery model. 이러한 인덱스 작업으로 인해 상당한 로그 작업이 수행될 수 있으며 로그 경합으로 인해 SQL Server에서 선택하는 최상의 DOP(병렬 처리 수준)에 영향이 있을 수 있습니다.These index operations can generate significant log activity and log contention can affect the best degree of parallelism (DOP) choice made by SQL Server.

또한 이러한 작업에 맞게 MAXDOP(최대 병렬 처리 수준) 서버 구성 옵션을 조정하는 것이 좋습니다.In addition, consider adjusting the max degree of parallelism (MAXDOP) server configuration option for these operations. 다음 지침은 내부 테스트를 기반으로 하며 일반적인 권장 사항입니다.The following guidelines are based on internal tests and are general recommendations. 몇 가지 MAXDOP 설정을 사용해 보고 사용 환경에 최적인 설정을 확인해야 합니다.You should try several different MAXDOP settings to determine the optimal setting for your environment.

  • 전체 복구 모델의 경우 max degree of parallelism 옵션 값은 8 이하로 설정해야 합니다.For the full recovery model, limit the value of the max degree of parallelism option to eight or less.
  • 대량 로그 모델 또는 단순 복구 모델의 경우에는 max degree of parallelism 옵션 값을 8보다 크게 설정하는 것이 좋습니다.For the bulk-logged model or the simple recovery model, setting the value of the max degree of parallelism option to a value higher than eight should be considered.
  • NUMA가 구성된 서버에서는 최대 병렬 처리 수준이 각 NUMA 노드에 할당된 CPU 수를 초과하면 안 됩니다.For servers that have NUMA configured, the maximum degree of parallelism should not exceed the number of CPUs that are assigned to each NUMA node. 이는 쿼리가 1개의 NUMA 노드에서 로컬 메모리를 사용할 가능성이 높고 이 경우 메모리 액세스 시간을 개선할 수 있기 때문입니다.This is because the query is more likely to use local memory from 1 NUMA node, which can improve memory access time.
  • 하이퍼스레딩을 사용하며 2009년 이전(하이퍼스레딩 기능이 개선되기 전)에 제조된 서버의 경우 MAXDOP 값이 논리 프로세서가 아닌 실제 프로세서 수를 초과하면 안 됩니다.For servers that have hyper-threading enabled and were manufactured in 2009 or earlier (before hyper-threading feature was improved), the MAXDOP value should not exceed the number of physical processors, rather than logical processors.

최대 병렬 처리 수준 옵션에 대한 자세한 내용은 최대 병렬 처리 수준 서버 구성 옵션 구성을 참조하세요.For more information about the max degree of parallelism option, see Configure the max degree of parallelism Server Configuration Option.

최대 작업자 스레드 수 설정Setting the Maximum Number of Worker Threads

최대 작업자 스레드 수는 항상 최대 병렬 처리 수준에 대한 설정보다 높게 설정합니다.Always set the maximum number of worker threads to be more than the setting for the maximum degree of parallelism. 작업자 스레드 수는 항상 서버에 있는 CPU 수의 7배 이상의 값으로 설정해야 합니다.The number of worker threads must always be set to a value of at least seven times the number of CPUs that are present on the server. 자세한 내용은 Configure the max worker threads Option(최대 작업자 스레드 수 옵션 구성)을 참조하세요.For more information, see Configure the max worker threads Option.

SQL 추적 및 SQL Server Profiler 사용Using SQL Trace and SQL Server Profiler

프로덕션 환경에서는 SQL 추적과 SQL Server Profiler를 사용하지 않는 것이 좋습니다.We recommend that you do not use SQL Trace and SQL Server Profiler in a production environment. CPU 수가 늘어날수록 이러한 도구의 실행으로 인한 오버헤드도 늘어납니다.The overhead for running these tools also increases as the number of CPUs increases. 프로덕션 환경에서 SQL 추적을 사용해야 하는 경우 추적 이벤트의 수를 최소로 제한합니다.If you must use SQL Trace in a production environment, limit the number of trace events to a minimum. 부하를 고려하여 주의 깊게 각 추적 이벤트를 프로파일링 및 테스트해야 하며 성능에 많은 영향을 주는 이벤트를 조합해서 사용하지 마십시오.Carefully profile and test each trace event under load, and avoid using combinations of events that significantly affect performance.

tempdb 데이터 파일 수 설정Setting the Number of tempdb Data Files

일반적으로 tempdb 데이터 파일 수는 CPU 수와 일치해야 합니다.Typically, the number of tempdb data files should match the number of CPUs. 하지만 tempdb에 대한 동시성 요구를 신중하게 고려하면 데이터베이스 관리 작업을 줄일 수 있습니다.However, by carefully considering the concurrency needs of tempdb, you can reduce database management. 예를 들어 시스템에 64개의 CPU가 있고 일반적으로 32개의 쿼리에서만 tempdb를 사용하는 경우 tempdb 파일의 수를 64개로 늘려도 성능이 개선되지 않습니다.For example, if a system has 64 CPUs and usually only 32 queries use tempdb, increasing the number of tempdb files to 64 will not improve performance.

64개를 초과하는 CPU를 사용할 수 있는 SQL Server 구성 요소SQL Server Components That Can Use More Than 64 CPUs

다음 표에서는 SQL Server 구성 요소를 나열하고 이들 구성 요소가 64개를 초과하는 CPU를 사용할 수 있는지를 보여 줍니다.The following table lists SQL Server components and indicates whether they can use more that 64 CPUs.

프로세스 이름Process name 실행 프로그램Executable program 64개를 초과하는 CPU 사용Use more than 64 CPUs
SQL Server 데이터베이스 엔진SQL Server Database Engine Sqlserver.exeSqlserver.exe Yes
Reporting ServicesReporting Services Rs.exeRs.exe 아니오No
Analysis ServicesAnalysis Services As.exeAs.exe 아니오No
Integration ServicesIntegration Services Is.exeIs.exe 아니오No
Service BrokerService Broker Sb.exeSb.exe 아니오No
전체 텍스트 검색Full-Text Search Fts.exeFts.exe 아니오No
SQL Server 에이전트SQL Server Agent Sqlagent.exeSqlagent.exe 아니오No
SQL Server Management StudioSQL Server Management Studio Ssms.exeSsms.exe 아니오No
SQL Server 설치SQL Server Setup Setup.exeSetup.exe 아니오No