руководство по архитектуре потоков и задачThread and Task Architecture Guide

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Планирование задач операционной системыOperating system task scheduling

Потоки — это наименьшие единицы обработки, которые могут быть выполнены операционной системой. Они позволяют разделять логику приложения на несколько параллельных путей выполнения.Threads are the smallest units of processing that can be executed by an operating system, and allow the application logic to be separated into several concurrent execution paths. Потоки полезны, когда сложные приложения имеют много задач, которые могут выполняться одновременно.Threads are 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, that set of instructions is handled as a single task, and there is just one execution path (or thread) through the application. Более сложные приложения могут иметь несколько задач, которые могут выполняться одновременно, а не последовательно.More complex applications may have several tasks that can be performed concurrently instead of serially. Для этого приложение может запустить для каждой задачи отдельные процессы, которые являются ресурсоемкими, или запустить отдельные потоки, которые являются относительно менее ресурсоемкими.An application can do this by starting separate processes for each task, which is a resource-intensive operation, or start separate threads, which are relatively less resource-intensive. Кроме этого, каждый поток можно запланировать для выполнения независимо от других потоков, связанных с процессом.Additionally, each thread can be scheduled for execution independently from the other threads associated with a process.

Потоки позволяют сложным приложениям более эффективно использовать ЦП, даже на компьютерах с одним ЦП.Threads allow complex applications to make more effective use of a processor (CPU), even on computers that have a single CPU. С одним ЦП только один поток может выполняться одновременно.With one CPU, only one thread can execute at a time. Если один поток выполняет длительную операцию, которая не использует ЦП, например считывание с диска или запись на диск, другой поток может выполняться, пока первая операция не завершится.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. Возможность выполнять потоки, в то время как другие потоки ожидают завершения операции, позволяет приложению увеличить использование ЦП.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. Компьютеры с несколькими ЦП могут одновременно выполнять один поток для каждого ЦП.Computers that have multiple CPUs can execute one thread per CPU at the same time. Например, если компьютер имеет восемь ЦП, он может выполнять одновременно восемь потоков.For example, if a computer has eight CPUs, it can execute eight threads at the same time.

Планирование задач SQL ServerSQL Server task scheduling

В области SQL ServerSQL Serverзапрос является логическим представлением запроса или пакета.In the scope of SQL ServerSQL Server, a request is the logical representation of a query or batch. Запрос также представляет операции, необходимые системным потокам, таким как контрольная точка или модуль записи журнала.A request also represents operations required by system threads, such as checkpoint or log writer. Запросы находятся в различных состояниях в течение всего времени существования и могут накапливать время ожидания, когда ресурсы, необходимые для выполнения запроса, недоступны, например присутствуют блокировки или кратковременные блокировки.Requests exist in various states throughout their lifetime and can accumulate waits when resources required to execute the request are not available, such as locks or latches. Дополнительные сведения о состояниях запросов см. в статье sys.dm_exec_requests (Transact-SQL).For more information about request states, see sys.dm_exec_requests.

Задача представляет единицу работы, которую необходимо завершить для выполнения запроса.A task represents the unit of work that needs to be completed to fulfill the request. Одному запросу можно назначить одну или несколько задач.One or more tasks can be assigned to a single request.

  • В параллельных запросах существует несколько активных задач, которые выполняются не последовательно, а параллельно, с одной родительской (или координирующей) задачей и несколькими дочерними.Parallel requests will have several active tasks that are executed concurrently instead of serially, with one parent task (or coordinating task) and multiple child tasks. План выполнения для параллельного запроса может иметь последовательные ветви — области плана с операторами, которые не выполняются параллельно.An execution plan for a parallel request may have serial branches - areas of the plan with operators that don't execute in parallel. Родительская задача отвечает и за выполнение этих последовательных операторов.The parent task is also responsible for executing those serial operators.
  • В последовательных запросах в каждый момент времени выполнения будет существовать только одна активная задача.Serial requests will only have one active task at any given point in time during execution.
    Задачи находятся в различных состояниях в течение всего времени существования.Tasks exist in various states throughout their lifetime. Дополнительные сведения о состояниях задач см. в статье sys.dm_os_tasks (Transact-SQL).For more information about task states, see sys.dm_os_tasks. Задачи в приостановленном состоянии ожидают ресурсов, необходимых для выполнения задачи. До того времени они недоступны.Tasks in SUSPENDED state are waiting on resources required to execute the task to become available. Дополнительные сведения об ожидающих задачах см. в разделе sys.dm_os_waiting_tasks.For more information about waiting tasks, see sys.dm_os_waiting_tasks.

Рабочий поток SQL ServerSQL Server, также известный как рабочая роль или поток, является логическим представлением потока операционной системы.A SQL ServerSQL Server worker thread, also known as worker or thread, is a logical representation of an operating system thread. При выполнении последовательных запросов Компонент SQL Server Database EngineSQL Server Database Engine порождает рабочую роль для выполнения активной задачи (1:1).When executing serial requests, the Компонент SQL Server Database EngineSQL Server Database Engine will spawn a worker to execute the active task (1:1). При выполнении параллельных запросов в построчном режиме Компонент SQL Server Database EngineSQL Server Database Engine назначает рабочую роль для координации дочерних рабочих ролей, ответственных за выполнение назначенных им задач (также 1:1), которая называется родительским потоком (или координирующим потоком).When executing parallel requests in row mode, the Компонент SQL Server Database EngineSQL Server Database Engine assigns a worker to coordinate the child workers responsible for completing tasks assigned to them (also 1:1), called the parent thread (or coordinating thread). Родительский поток имеет связанную с ним родительскую задачу.The parent thread has a parent task associated with it. Родительский поток — это точка входа запроса, и она существует даже до того, как ядро начало анализировать запрос.The parent thread is the point of entry of the request and exists even before engine parses a query. Основные задачи родительского потока:The main responsibilities of the parent thread are:

  • Координирование параллельного сканирования.Coordinate a parallel scan.
  • Запуск дочерних параллельных рабочих ролей.Start child parallel workers.
  • Сбор строк из параллельных потоков и их отправка клиенту.Collect rows from parallel threads and send to the client.
  • Выполнение локальных и глобальных операций агрегирования.Perform local and global aggregations.

Примечание

Если план запроса содержит последовательные и параллельные ветви, то одна из параллельных задач будет отвечать за выполнение последовательной ветви.If a query plan has serial and parallel branches, one of the parallel tasks will be responsible for executing the serial branch.

Количество рабочих потоков, порожденных для каждой задачи, зависит от следующих факторов:The number of worker threads spawned for each task depends on:

  • Имеет ли запрос право на параллелизм, что определяется оптимизатором запросов.Whether the request was eligible for parallelism as determined by the Query Optimizer.
  • Какова действительная доступная степень параллелизма (DOP) в системе на основе текущей нагрузки.What is the actual available degree of parallelism (DOP) in the system based on current load. Она может отличаться от предполагаемой степени параллелизма, оценка которой выполняется на основе конфигурации сервера для максимальной степени параллелизма (MAXDOP).This may differ from estimated DOP, which is based on the server configuration for max degree of parallelism (MAXDOP). Например, конфигурация сервера для MAXDOP может составлять 8, но доступное значение DOP в среде выполнения может составлять только 2, что влияет на производительность запросов.For example, the server configuration for MAXDOP may be 8 but the available DOP at runtime can be only 2, which affects query performance.

Примечание

Ограничение параметра max degree of parallelism (MAXDOP) задается для каждой задачи, а не для каждого запроса.The max degree of parallelism (MAXDOP) limit is set per task, not per request. Это означает, что при выполнении параллельных запросов один запрос может порождать несколько задач вплоть до ограничения MAXDOP и каждая задача будет использовать одну рабочую роль.This means that during a parallel query execution, a single request can spawn multiple tasks up to the MAXDOP limit, and each task will use one worker. Дополнительные сведения о MAXDOP см. в статье Настройка параметра конфигурации сервера max degree of parallelism.For more information about MAXDOP, see Configure the max degree of parallelism Server Configuration Option.

Планировщик, также известный как планировщик SOS, управляет рабочими потоками, требующими времени обработки для выполнения работы от имени задач.A scheduler, also known as SOS scheduler, manages worker threads that require processing time to carry out work on behalf of tasks. Каждый планировщик сопоставляется с отдельным процессором (ЦП).Each scheduler is mapped to an individual processor (CPU). Время, в течение которого рабочая роль может оставаться активной в планировщике, называется квантом времени операционной системы (не более 4 мс).The time a worker can remain active in a scheduler is called the OS quantum, with a maximum of 4 ms. По истечении кванта времени рабочая роль передает время другим рабочим ролям, которым требуется доступ к ресурсам ЦП, и изменяет свое состояние.After its quantum time expires, a worker yields its time to other workers that need to access CPU resources, and changes its state. Это сотрудничество между рабочими ролями для повышения уровня доступа к ресурсам ЦП называется совместное планирование, также известное как планирование в режиме без вытеснения.This cooperation between workers to maximize access to CPU resources is called cooperative scheduling, also known as non-preemptive scheduling. В свою очередь, изменение состояния рабочей роли распространяется на задачу, связанную с этой рабочей ролью, и на запрос, связанный с задачей.In turn, the change in worker state is propagated to the task associated with that worker, and to the request associated with the task. Дополнительные сведения о состояниях рабочих ролей см. в статье sys.dm_os_workers (Transact-SQL).For more information about worker states, see sys.dm_os_workers. Дополнительные сведения о планировщиках см. в статье sys.dm_os_schedulers (Transact-SQL).For more information about schedulers, see sys.dm_os_schedulers .

Таким образом, запрос может порождать одну или несколько задач для выполнения единиц работы.In summary, a request may spawn one or more tasks to carry out units of work. Каждая задача назначается рабочему потоку, который отвечает за выполнение этой задачи.Each task is assigned to a worker thread who is responsible for completing the task. Каждый рабочий поток должен быть запланирован (помещен в планировщик) для активного выполнения задачи.Each worker thread must be scheduled (placed on a scheduler) for active execution of the task.

Примечание

Рассмотрим следующий сценарий.Consider the following scenario:

  • Рабочая роль 1 — это длительно выполняемая задача, например запрос на чтение с упреждающим чтением таблиц, основанных на памяти.Worker 1 is a long-running task, for example a read query using read-ahead over in-memory based tables. Рабочая роль 1 находит необходимые страницы данных в буферном пуле, поэтому она не должна ждать операций ввода-вывода и может использовать полный квант времени до приостановки.Worker 1 finds its required data pages are already in Buffer Pool, so it doesn't have to yield to wait for I/O operations, and can consume its full quantum before yielding.
  • Рабочая роль 2 выполняет более кратковременные задачи на уровне долей миллисекунд и поэтому должна ожидать исчерпания своего полного кванта времени.Worker 2 is doing shorter sub-millisecond tasks and therefore is required to yield before its full quantum is exhausted.

В этом сценарии и до SQL Server 2014 (12.x)SQL Server 2014 (12.x)рабочей роли 1 разрешено монопольно использовать планировщик за счет большего общего времени квантов.In this scenario and up to SQL Server 2014 (12.x)SQL Server 2014 (12.x), Worker 1 is allowed to basically monopolize the scheduler by having more overall quantum time.
Начиная с SQL Server 2016 (13.x);SQL Server 2016 (13.x), совместное планирование включает в себя планирование по методу Large Deficit First (LDF, преимущество при дефиците).Starting with SQL Server 2016 (13.x);SQL Server 2016 (13.x), cooperative scheduling includes Large Deficit First (LDF) scheduling. Планирование LDF позволяет отслеживать модели использования квантов, при этом планировщик не используется монопольно ни одним рабочим потоком.With LDF scheduling, quantum usage patterns are monitored and one worker thread doesn't monopolize a scheduler. В этом случае рабочей роли 2 разрешается использовать квант повторно до того, как рабочей роли 1 будет разрешено использовать дополнительный квант, поэтому рабочая роль 1 не сможет монопольно использовать планировщик в недружественной модели.In the same scenario, Worker 2 is allowed to consume repeated quantum’s before Worker 1 is allowed more quantum, therefore preventing Worker 1 from monopolizing the scheduler in an unfriendly pattern.

Планирование параллельных задачScheduling parallel tasks

Представьте, что SQL ServerSQL Server настроен с MaxDOP 8 и сходство ЦП настроено для 24 ЦП (планировщиков) в узлах NUMA 0 и 1.Imagine a SQL ServerSQL Server configured with MaxDOP 8, and CPU Affinity is configured for 24 CPUs (schedulers) across NUMA nodes 0 and 1. Планировщики с 0 по 11 относятся к узлу NUMA 0, планировщики с 12 по 23 относятся к узлу NUMA 1.Schedulers 0 through 11 belong to NUMA node 0, schedulers 12 through 23 belong to NUMA node 1. Приложение отправляет в Компонент Database EngineDatabase Engine следующий запрос:An application sends the following query (request) to the Компонент Database EngineDatabase Engine:

SELECT h.SalesOrderID, h.OrderDate, h.DueDate, h.ShipDate
FROM Sales.SalesOrderHeaderBulk AS h 
INNER JOIN Sales.SalesOrderDetailBulk AS d ON h.SalesOrderID = d.SalesOrderID 
WHERE (h.OrderDate >= '2014-3-28 00:00:00');

Совет

Этот пример запроса можно выполнить с помощью примера базы данных AdventureWorks2016_EXT.The example query can be executed using the AdventureWorks2016_EXT sample database database. Таблицы Sales.SalesOrderHeader и Sales.SalesOrderDetail увеличены 50 раз и переименованы в Sales.SalesOrderHeaderBulk и Sales.SalesOrderDetailBulk.The tables Sales.SalesOrderHeader and Sales.SalesOrderDetail were enlarged 50 times and renamed to Sales.SalesOrderHeaderBulk and Sales.SalesOrderDetailBulk.

План выполнения показывает хэш-соединение между двумя таблицами и каждый из операторов, выполняемый параллельно, что указывается желтым кругом с двумя стрелками.The execution plan shows a Hash Join between two tables, and each of the operators executed in parallel, as indicated by the yellow circle with two arrows. Каждый оператор параллелизма представляет собой отдельную ветвь в плане.Each Parallelism operator is a different branch in the plan. Таким образом, в следующем плане выполнения есть три ветви.Therefore, there are three branches in the execution plan below.

План параллельного запроса

Примечание

Если представить план выполнения как дерево, то ветвь — это область плана, которая группирует один или несколько операторов между операторами параллелизма, также называемыми итераторами обмена.If you think of an execution plan as a tree, a branch is an area of the plan that groups one or more operators between Parallelism operators, also called Exchange Iterators. Дополнительные сведения об операторах плана см. в справочнике логических и физических операторов Showplan.For more information about plan operators, see Showplan Logical and Physical Operators Reference.

Хотя в этом плане выполнения есть три ветви, в любой момент выполнения в этом плане могут одновременно выполняться только две ветви.While there are three branches in the execution plan, at any point during execution only two branches can execute concurrently in this execution plan:

  1. Ветвь, в которой сканирование кластеризованного индекса используется в Sales.SalesOrderHeaderBulk (во входных данных сборки соединения), выполняется отдельно.The branch where a Clustered Index Scan is used on the Sales.SalesOrderHeaderBulk (build input of the join) executes alone.
  2. Ветвь, в которой сканирование кластеризованного индекса используется в Sales.SalesOrderDetailBulk (во входных данных пробы соединения), выполняется параллельно с ветвью, в которой был создан объект Bitmap и сейчас выполняется оператор Hash Match.Then, the branch where a Clustered Index Scan is used on the Sales.SalesOrderDetailBulk (probe input of the join) executes concurrently with the branch where the Bitmap was created and currently the Hash Match is executing.

Showplan XML показывает, что в узле NUMA 0 было зарезервировано и использовано 16 рабочих потоков:The Showplan XML shows that 16 worker threads were reserved and used on NUMA node 0:

<ThreadStat Branches="2" UsedThreads="16">
  <ThreadReservation NodeId="0" ReservedThreads="16" />
</ThreadStat>

Резервирование потоков гарантирует, что Компонент Database EngineDatabase Engine будет иметь достаточно рабочих потоков для выполнения всех задач, которые потребуются для запроса.Thread reservation ensures the Компонент Database EngineDatabase Engine has enough worker threads to carry out all the tasks that will be needed for the request. Потоки могут быть зарезервированы на нескольких узлах NUMA или только на одном.Threads can be reserved across several NUMA nodes, or be reserved in just one NUMA node. Резервирование потока происходит во время выполнения до начала выполнения и зависит от нагрузки планировщика.Thread reservation is done at runtime before execution starts, and is dependent on scheduler load. Количество зарезервированных рабочих потоков в целом выводится из формулы **параллельные ветви * *DOP времени выполнения***, и в нем не учитывается родительский рабочий поток.The number of reserved worker threads is generically derived from the formula concurrent branches * runtime DOP and excludes the parent worker thread. Количество рабочих потоков в каждой ветви ограничено значением MaxDOP.Each branch is limited to a number of worker threads that's equal to MaxDOP. В этом примере существуют две параллельные ветви, а для MaxDOP установлено значение 8, поэтому количество рабочих потоков 2 * 8 = 16.In this example there are two concurrent branches and MaxDOP is set to 8, therefore 2 * 8 = 16.

Для справки просмотрите динамический план выполнения из динамической статистики запросов, где одна ветвь завершила выполнение и две ветви выполняются параллельно.For reference, observe the live execution plan from Live Query Statistics, where one branch has completed and two branches are executing concurrently.

Динамический план параллельного запроса

Компонент SQL Server Database EngineSQL Server Database Engine назначит рабочему потоку выполнение активной задачи (1:1), что можно наблюдать во время выполнения запроса, запросив динамическое административное представление sys.dm_os_tasks, как показано в следующем примере.The Компонент SQL Server Database EngineSQL Server Database Engine will assign a worker thread to execute an active task (1:1), which can be observed during query execution by querying the sys.dm_os_tasks DMV, as seen in the following example:

SELECT parent_task_address, task_address, 
       task_state, scheduler_id, worker_address
FROM sys.dm_os_tasks
WHERE session_id = <insert_session_id>
ORDER BY parent_task_address, scheduler_id;

Совет

Столбец parent_task_address всегда имеет значение NULL для родительской задачи.The column parent_task_address is always NULL for the parent task.

Совет

В очень загруженном Компонент SQL Server Database EngineSQL Server Database Engine можно увидеть количество активных задач, превышающее ограничение, установленное зарезервированными потоками.On a very busy Компонент SQL Server Database EngineSQL Server Database Engine, it's possible to see a number of active tasks that's over the limit set by reserved threads. Эти задачи могут относиться к ветви, которая больше не используется и находится в промежуточном состоянии, ожидая очистки.These tasks can belong to a branch that is not being used anymore and are in a transient state, waiting for cleanup.

Результирующий набор:Here is the result set. Обратите внимание, что для выполняемых в настоящий момент ветвей существует 17 активных задач: 16 дочерних задач, соответствующих зарезервированным потокам, и одна родительская, или координирующая, задача.Notice there are 17 active tasks for the branches that are currently executing: 16 child tasks corresponding to the reserved threads, plus the parent task, or coordinating task.

parent_task_addressparent_task_address task_addresstask_address task_statetask_state scheduler_idscheduler_id worker_addressworker_address
NULLNULL 0x000001EF4758ACA80x000001EF4758ACA8 SUSPENDEDSUSPENDED 33 0x000001EFE6CB61600x000001EFE6CB6160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFE43F34680x000001EFE43F3468 SUSPENDEDSUSPENDED 00 0x000001EF6DB701600x000001EF6DB70160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EEB243A4E80x000001EEB243A4E8 SUSPENDEDSUSPENDED 00 0x000001EF6DB7A1600x000001EF6DB7A160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EC862514680x000001EC86251468 SUSPENDEDSUSPENDED 55 0x000001EEC05E81600x000001EEC05E8160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFE30234680x000001EFE3023468 SUSPENDEDSUSPENDED 55 0x000001EF6B46A1600x000001EF6B46A160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFE3AF14680x000001EFE3AF1468 SUSPENDEDSUSPENDED 66 0x000001EF6BD381600x000001EF6BD38160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFE4AFCCA80x000001EFE4AFCCA8 SUSPENDEDSUSPENDED 66 0x000001EF6ACB41600x000001EF6ACB4160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFDE0438480x000001EFDE043848 SUSPENDEDSUSPENDED 77 0x000001EEA18C21600x000001EEA18C2160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EF690381080x000001EF69038108 SUSPENDEDSUSPENDED 77 0x000001EF6AEBA1600x000001EF6AEBA160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFCFDD8CA80x000001EFCFDD8CA8 SUSPENDEDSUSPENDED 88 0x000001EFCB6F01600x000001EFCB6F0160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFCFDD88C80x000001EFCFDD88C8 SUSPENDEDSUSPENDED 88 0x000001EF6DC461600x000001EF6DC46160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFBCC541080x000001EFBCC54108 SUSPENDEDSUSPENDED 99 0x000001EFCB8861600x000001EFCB886160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EC862794680x000001EC86279468 SUSPENDEDSUSPENDED 99 0x000001EF6DE081600x000001EF6DE08160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFDE9018480x000001EFDE901848 SUSPENDEDSUSPENDED 1010 0x000001EFF56E01600x000001EFF56E0160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EF6DB321080x000001EF6DB32108 SUSPENDEDSUSPENDED 1010 0x000001EFCC3D01600x000001EFCC3D0160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EC8628D4680x000001EC8628D468 SUSPENDEDSUSPENDED 1111 0x000001EFBFA4A1600x000001EFBFA4A160
0x000001EF4758ACA80x000001EF4758ACA8 0x000001EFBD3A1C280x000001EFBD3A1C28 SUSPENDEDSUSPENDED 1111 0x000001EF6BD721600x000001EF6BD72160

Обратите внимание, что всем 16 дочерним задачам назначены разные рабочие потоки (их можно увидеть в столбце worker_address), но все рабочие роли назначены одному и тому же пулу из восьми планировщиков (0, 5, 6, 7, 8, 9, 10, 11), а родительская задача назначена планировщику, не входящему в этот пул (3).Observe that each of the 16 child tasks has a different worker thread assigned (seen in the worker_address column), but all the workers are assigned to the same pool of eight schedulers (0,5,6,7,8,9,10,11), and that the parent task is assigned to a scheduler outside this pool (3).

Важно!

После планирования первого набора параллельных задач в конкретной ветви Компонент Database EngineDatabase Engine будет использовать тот же пул планировщиков для выполнения дополнительных задач в других ветвях.Once the first set of parallel tasks on a given branch is scheduled, the Компонент Database EngineDatabase Engine will use that same pool of schedulers for any additional tasks on other branches. Это означает, что один и тот же набор планировщиков будет использоваться для всех параллельных задач в рамках всего плана выполнения, ограниченных только значением MaxDOP.This means the same set of schedulers will be used for all the parallel tasks in the entire execution plan, only limited by MaxDOP.
Компонент SQL Server Database EngineSQL Server Database Engine всегда пытается назначить планировщики из одного и того же узла NUMA для выполнения задач и назначать их последовательно (при циклическом переборе), если планировщики доступны.The Компонент SQL Server Database EngineSQL Server Database Engine will always try to assign schedulers from the same NUMA node for task execution, and assign them sequentially (in round-robin fashion) if schedulers are available. Однако рабочий поток, назначенный родительской задаче, может быть помещен в узел NUMA, отличный от используемого для других задач.However, the worker thread assigned to the parent task may be placed in a different NUMA node from other tasks.

Рабочий поток может оставаться активным в планировщике только в течение его кванта времени (4 мс); после истечения этого кванта времени он должен уступить планировщик, чтобы мог стать активным рабочий поток, назначенный другой задаче.A worker thread can only remain active in the scheduler for the duration of its quantum (4 ms) and must yield its scheduler after that quantum has elapsed, so that a worker thread assigned to another task may become active. Когда квант времени истекает и рабочий поток становится неактивным, соответствующая задача помещается в очередь FIFO в состоянии RUNNABLE до тех пор, пока рабочий поток снова не перейдет в состояние RUNNING, при условии что задаче не потребуется доступ к ресурсам, которые на этот момент недоступны, например из-за блокировки. В этом случае задача будет переведена в состояние SUSPENDED вместо RUNNABLE до тех пор, пока эти ресурсы не станут доступны.When a worker's quantum expires and is no longer active, the respective task is placed in a FIFO queue in a RUNNABLE state, until it moves to a RUNNING state again, assuming the task won't require access to resources that are not available at the moment, such as a latch or lock, in which case the task would be placed in a SUSPENDED state instead of RUNNABLE, until such time those resources are available.

Совет

Что касается выходных данных динамического административного представления, показанного выше, все активные задачи находятся в состоянии SUSPENDED.For the output of the DMV seen above, all active tasks are in SUSPENDED state. Дополнительные сведения об ожидающих задачах можно получить, выполнив запрос динамического административного представления sys.dm_os_waiting_tasks.More detail on waiting tasks is available by querying the sys.dm_os_waiting_tasks DMV.

В общей сложности параллельный запрос породит несколько задач.In summary, a parallel request will spawn multiple tasks. Каждая задача должна быть назначена одному рабочему потоку.Each task must be assigned to a single worker thread. Каждый рабочий поток должен быть назначен одному планировщику.Each worker thread must be assigned to a single scheduler. Следовательно, количество используемых планировщиков не может превышать количество параллельных задач для каждой ветви, устанавливаемое конфигурацией MaxDOP или указанием запроса.Therefore, the number of schedulers in use cannot exceed the number of parallel tasks per branch, which is set by the MaxDOP configuration or query hint. Координирующий поток не влияет на ограничение MaxDOP.The coordinating thread does not contribute to the MaxDOP limit.

Распределение потоков ЦПAllocating threads to a CPU

По умолчанию каждый экземпляр SQL ServerSQL Server запускает один поток. Операционная система распределяет потоки экземпляров SQL ServerSQL Server поровну между ЦП компьютера в зависимости от загрузки.By default, each instance of SQL ServerSQL Server starts each thread, and the operating system distributes threads from instances of SQL ServerSQL Server among the processors (CPUs) on a computer, based on load. Если сходство процессов включено на уровне операционной системы, операционная система назначает каждый поток конкретному ЦП.If process affinity has been enabled at the operating system level, then the operating system assigns each thread to a specific CPU. Компонент Компонент SQL Server Database EngineSQL Server Database Engine, в свою очередь, назначает рабочие потоки SQL ServerSQL Server планировщикам, которые равномерно распределяют потоки между ЦП по принципу циклического перебора.In contrast, the Компонент SQL Server Database EngineSQL Server Database Engine assigns SQL ServerSQL Server worker threads to schedulers that distribute the threads evenly among the CPUs, in a round-robin fashion.

Для обеспечения многозадачности, например, когда несколько приложений используют один и тот же набор ЦП, операционная система иногда распределяет рабочие потоки между разными ЦП.To carry out multitasking, for example when multiple applications access the same set of CPUs, the operating system sometimes moves worker threads among different CPUs. Безусловно, такая организация работы эффективна с точки зрения операционной системы, но может привести к снижению производительности SQL ServerSQL Server при больших нагрузках системы, поскольку в кэше каждого процессора неоднократно перезагружаются данные.Although efficient from an operating system point of view, this activity can reduce SQL ServerSQL Server performance under heavy system loads, as each processor cache is repeatedly reloaded with data. В этих условиях назначение ЦП определенных потоков может повысить производительность, устраняя повторную загрузку процессоров и уменьшая количество переносов потоков между ЦП (а значит, уменьшая число переключений контекста). Такая связь между потоком и процессором называется соответствием процессоров.Assigning CPUs to specific threads can improve performance under these conditions by eliminating processor reloads and reducing thread migration across CPUs (thereby reducing context switching); such an association between a thread and a processor is called processor affinity. Если функция подобия была включена, операционная система назначает поток конкретному ЦП.If affinity has been enabled, the operating system assigns each thread to a specific CPU.

Параметр affinity mask задается с помощью инструкции ALTER SERVER CONFIGURATION.The affinity mask option is set by using ALTER SERVER CONFIGURATION. Если параметр affinity mask не задан, экземпляр SQL ServerSQL Server распределяет рабочие потоки равномерно между планировщиками, которые не были исключены.When the affinity mask is not set, the instance of SQL ServerSQL Server allocates worker threads evenly among the schedulers that have not been masked off.

Внимание!

Не используйте маску сходства процессоров в операционной системе и маску сходства в SQL ServerSQL Serverодновременно.Do not configure CPU affinity in the operating system and also configure the affinity mask in SQL ServerSQL Server. Эти настройки предназначены для достижения одного результата, и если их значения будут несогласованными, результат может быть непредсказуем.These settings are attempting to achieve the same result, and if the configurations are inconsistent, you may have unpredictable results. Дополнительные сведения см. в разделе Параметр affinity mask.For more information, see affinity mask option.

Пул потоков помогает оптимизировать производительность при подключении к серверу большого числа пользователей.Thread pooling helps optimize performance when large numbers of clients are connected to the server. Обычно для каждого запроса в операционной системе создается отдельный поток.Usually, a separate operating system thread is created for each query request. Однако в случае сотен соединений с сервером, использование одного потока на каждый запрос приводит к потреблению большого числа системных ресурсов.However, with hundreds of connections to the server, using one thread per query request can consume large amounts of system resources. Параметр max worker threads позволяет SQL ServerSQL Server создавать пул рабочих потоков, чтобы обслужить большое число запросов, что улучшает производительность.The max worker threads option enables SQL ServerSQL Server to create a pool of worker threads to service a larger number of query requests, which improves performance.

параметр «использование упрощенных пулов»Using the lightweight pooling Option

Нагрузка, возникающая при контекстном переключении потоков, может быть не очень высока.The overhead involved in switching thread contexts may not be very large. Для большинства экземпляров SQL ServerSQL Server установка параметра "использование упрощенных пулов" в значение 0 или 1 не вызовет заметного изменения производительности.Most instances of SQL ServerSQL Server will not see any performance differences between setting the lightweight pooling option to 0 or 1. Выиграть от установки параметра использование упрощенных пулов могут только те экземпляры SQL ServerSQL Server, которые выполняются там, где:The only instances of SQL ServerSQL Server that might benefit from lightweight pooling are those that run on a computer having the following characteristics:

  • установлен производительный многопроцессорный сервер;A large multi-CPU server
  • все процессоры работают почти на пределе производительности;All the CPUs are running near maximum capacity
  • высок уровень переключения контекста.There is a high level of context switching

В таких системах может наблюдаться небольшое повышение эффективности, если для параметра "Использование упрощенных пулов" установлено значение 1.These systems may see a small increase in performance if the lightweight pooling value is set to 1.

Важно!

Не используйте планирование в режиме волокон для выполнения распространенных операций.Do not use fiber mode scheduling for routine operation. Это может привести к снижению производительности, мешая нормальной работе переключения контекста. Кроме того, некоторые компоненты SQL ServerSQL Server не могут работать правильно в режиме волокон.This can decrease performance by inhibiting the regular benefits of context switching, and because some components of SQL ServerSQL Server cannot function correctly in fiber mode. Дополнительные сведения см. в разделе об использовании упрощенных пулов.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 ServerSQL Server по умолчанию имеет уровень приоритета 7, что соответствует стандартному уровню.By default, each instance of SQL ServerSQL Server is a priority of 7, which is referred to as the normal priority. Это значение по умолчанию задает потокам SQL ServerSQL Server достаточно высокий уровень приоритета, позволяющий им получать достаточно ресурсов ЦП, не снижая производительности других приложений.This default gives SQL ServerSQL Server threads a high enough priority to obtain sufficient CPU resources without adversely affecting other applications.

Важно!

В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Параметр конфигурации priority boost используется для повышения приоритета потоков экземпляра SQL ServerSQL Server до уровня 13.The priority boost configuration option can be used to increase the priority of the threads from an instance of SQL ServerSQL Server to 13. Это наивысший приоритет.This is referred to as high priority. Этот параметр назначает потокам SQL ServerSQL Server более высокий приоритет по отношению к другим приложениям.This setting gives SQL ServerSQL Server threads a higher priority than most other applications. Таким образом, потоки SQL ServerSQL Server всегда будут обслуживаться в первую очередь, а потоки других приложений не смогут занимать ресурсы системы ранее потоков с более высоким приоритетом.Thus, SQL ServerSQL Server threads will generally be dispatched whenever they are ready to run and will not be preempted by threads from other applications. Представленные выше меры могут повысить производительность сервера, на котором выполняются только экземпляры SQL ServerSQL Server.This can improve performance when a server is running only instances of SQL ServerSQL Server and no other applications. Однако если в приложении SQL ServerSQL Server выполняется ресурсоемкая операция, то не рекомендуется присваивать высокий приоритет другим приложениям, чтобы они не вытесняли поток SQL ServerSQL Server.However, if a memory-intensive operation occurs in SQL ServerSQL Server, however, other applications are not likely to have a high-enough priority to preempt the SQL ServerSQL Server thread.

Если на компьютере выполняется несколько экземпляров SQL ServerSQL Server, то повышение приоритетов одних может привести к снижению производительности других.If you are running multiple instances of SQL ServerSQL 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 CPU

ЦП с поддержкой горячей замены — это возможность динамически добавлять центральные процессоры в запущенную систему.Hot add CPU is the ability to dynamically add CPUs to a running system. Добавление центральных процессоров может осуществляться физически — путем добавления нового оборудования, логически — путем аппаратного секционирования в сети, виртуально — через уровень виртуализации.Adding CPUs can occur physically by adding new hardware, logically by online hardware partitioning, or virtually through a virtualization layer. Начиная с SQL Server 2008SQL Server 2008, SQL ServerSQL Server поддерживает ЦП с поддержкой горячей замены.Starting with SQL Server 2008SQL Server 2008, SQL ServerSQL Server supports hot add CPU.

Требования для ЦП с поддержкой горячей замены:Requirements for hot add CPU:

  • оборудование с поддержкой ЦП с поддержкой горячей замены;Requires hardware that supports hot add CPU.
  • 64-разрядный выпуск Windows Server 2008 Datacenter или Windows Server 2008 Enterprise Edition для операционных систем на платформе Itanium;Requires the 64-bit edition of Windows Server 2008 Datacenter or the Windows Server 2008 Enterprise Edition for Itanium-Based Systems operating system.
  • SQL ServerSQL Server Enterprise.Requires SQL ServerSQL Server Enterprise.
  • SQL ServerSQL Server не может быть настроен на использование программной архитектуры NUMA.cannot be configured to use soft NUMA. Дополнительные сведения о программной архитектуре NUMA см. в разделе Архитектура Soft-NUMA (SQL Server).For more information about soft NUMA, see Soft-NUMA (SQL Server).

После добавления центральных процессоров SQL ServerSQL Server не начинает автоматически использовать их.SQL ServerSQL Server does not automatically start to use CPUs after they are added. Это предотвращает использование SQL ServerSQL Server центральных процессоров, добавленных для каких-либо других целей.This prevents SQL ServerSQL Server from using CPUs that might be added for some other purpose. После добавления ЦП выполните инструкцию RECONFIGURE, что позволит SQL ServerSQL Server распознать новые ЦП в качестве доступных ресурсов.After adding CPUs, execute the RECONFIGURE statement, so that SQL ServerSQL Server will recognize the new CPUs as available resources.

Примечание

Для использования новых ЦП необходимо изменить настройки параметра affinity64 mask .If the affinity64 mask is configured, the affinity64 mask must be modified to use the new CPUs.

Рекомендации по использованию SQL Server на компьютерах, которые имеют более 64 процессоровBest Practices for running SQL Server on computers that have more than 64 CPUs

Назначение аппаратных потоков процессорамAssigning Hardware Threads with CPUs

Не используйте параметры конфигурации сервера affinity mask и affinity64 mask для привязки процессоров к определенным потокам.Do not use the affinity mask and affinity64 mask server configuration options to bind processors to specific threads. Эти параметры ограничены 64 процессорами.These options are limited to 64 CPUs. Вместо этого следует использовать параметр SET PROCESS AFFINITY инструкции ALTER SERVER CONFIGURATION.Use the 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

На компьютерах, имеющих несколько процессоров, с помощью временного изменения модели восстановления базы данных на модель восстановления с неполным протоколированием или простую модель восстановления можно улучшить производительность операций с индексами, таких как создание или перестроение индексов.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 ServerSQL Server наилучшую степень параллелизма.These index operations can generate significant log activity and log contention can affect the best degree of parallelism (DOP) choice made by SQL ServerSQL Server.

Помимо настройки параметра конфигурации сервера max degree of parallelism (MAXDOP) , рассмотрите возможность настройки параллелизма для операций с индексами с помощью параметра MAXDOP.In addition to adjusting the max degree of parallelism (MAXDOP) server configuration option, consider adjusting the parallelism for index operations using the MAXDOP option. Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations. Дополнительные сведения и рекомендации по настройке параметра конфигурации сервера max degree of parallelism см. в статье Настройка параметра конфигурации сервера max degree of parallelism.For more information and guidelines about adjusting the max degree of parallelism server configuration option, see Configure the max degree of parallelism Server Configuration Option.

Задание максимального числа рабочих потоковSetting the Maximum Number of Worker Threads

SQL ServerSQL Server динамически настраивает параметр конфигурации сервера max worker threads при запуске.will dynamically configure the max worker threads server configuration option at startup. SQL ServerSQL Server использует количество доступных ЦП и архитектуру системы для определения конфигурации сервера во время запуска с помощью документированной формулы.uses the number of available CPUs and the system architecture to determine this server configuration during startup, using a documented formula.

Это расширенный параметр, и изменять его следует только опытным администраторам баз данных или сертифицированным по SQL Server специалистам.This option is an advanced option and should be changed only by an experienced database administrator or certified SQL Server professional. Если вы считаете, что есть проблема с производительностью, вероятно, причина не в доступности рабочих потоков.If you suspect that there is a performance problem, it is probably not the availability of worker threads. Скорее всего, их ожидание вызвано чем-то наподобие операций ввода-вывода.The cause is more likely something like I/O that is causing the worker threads to wait. Рекомендуется найти причину проблемы производительности, прежде чем изменять параметр max worker threads.It is best to find the root cause of a performance issue before you change the max worker threads setting. Тем не менее, если необходимо вручную задать максимальное число рабочих потоков, это значение конфигурации всегда должно быть в семь раз больше числа ЦП, имеющихся в системе.However, if you need to manually set the maximum number of worker threads, this configuration value must always be set to a value of at least seven times the number of CPUs that are present on the system. Дополнительные сведения см. в статье Настройка параметра max worker threads.For more information, see Configure the max worker threads.

Использование приложения SQL Trace и SQL Server ProfilerUsing SQL Trace and SQL Server Profiler

В рабочей среде использовать трассировку SQL и SQL Profiler не рекомендуется.We recommend that you do not use SQL Trace and SQL Profiler in a production environment. Издержки использования этих средств также увеличиваются по мере увеличения числа ЦП.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.

Важно!

Трассировка SQL и Приложение SQL Server ProfilerSQL Server Profiler являются устаревшими.SQL Trace and Приложение SQL Server ProfilerSQL Server Profiler are deprecated. Пространство имен Microsoft.SqlServer.Management.Trace, которое содержит объекты трассировки Microsoft SQL Server и Replay, также устаревшее.The Microsoft.SqlServer.Management.Trace namespace that contains the Microsoft SQL Server Trace and Replay objects are also deprecated.

В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Вместо этого используйте расширенные события.Use Extended Events instead. Дополнительные сведения о расширенных событиях см. в разделе Быстрое начало. Расширенные события в SQL Server и SSMS XEvent Profiler.For more information on Extended Events, see Quick Start: Extended events in SQL Server and SSMS XEvent Profiler.

Примечание

Приложение SQL Server ProfilerSQL Server Profiler для рабочей нагрузки служб Analysis Services не устарел и будет по-прежнему поддерживаться.for Analysis Services workloads is NOT deprecated, and will continue to be supported.

Установка количества файлов данных базы данных tempdbSetting the number of tempdb data files

Количество файлов зависит от числа (логических) процессоров на компьютере.The number of files depends on the number of (logical) processors on the machine. Как правило, если число логических процессоров меньше или равно восьми, используйте равное ему число файлов данных.As a general rule, if the number of logical processors is less than or equal to eight, use the same number of data files as logical processors. Если число логических процессоров больше восьми, используйте восемь файлов данных, а затем, если состязание сохраняется, увеличивайте число файлов данных на значение, кратное 4, пока состязание не уменьшится до приемлемого уровня, или внесите изменения в рабочую нагрузку или код.If the number of logical processors is greater than eight, use eight data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code. Кроме того, помните о других рекомендациях для tempdb, доступных в разделе Оптимизация производительности базы данных tempdb в SQL Server.Also keep in mind other recommendations for tempdb, available in Optimizing tempdb performance in SQL Server.

Однако можно уменьшить ресурсы, используемые для управления базой данных, внимательно изучив параллелизм базы данных tempdb.However, by carefully considering the concurrency needs of tempdb, you can reduce database management overhead. Например, если в системе используется 64 ЦП, при этом только 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.

Компоненты SQL Server, которые поддерживают более 64 ЦПSQL Server components that can use more than 64 CPUs

В приведенной ниже таблице перечисляются компоненты SQL ServerSQL Server и указывается, поддерживают ли они более 64 процессоров.The following table lists SQL ServerSQL Server components and indicates whether they can use more that 64 CPUs.

Имя процессаProcess name Исполняемая программаExecutable program Использование более 64 процессоровUse more than 64 CPUs
Компонент SQL Server Database EngineSQL 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 SearchFull-Text Search Fts.exeFts.exe НетNo
Агент SQL ServerSQL Server Agent Sqlagent.exeSqlagent.exe НетNo
SQL Server Management StudioSQL Server Management Studio Ssms.exeSsms.exe НетNo
программа установки SQL ServerSQL Server Setup Setup.exeSetup.exe НетNo