Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Размывание однопоточной нагрузки по ядрам  [new]
tunknown
Member

Откуда:
Сообщений: 709
Дано: сервер только под MSSQL без дополнительных сервисов и процессор, допустим, на 4ГГц с 8 ядрами.
Есть однопоточный запрос или запрос с OPTION (MAXDOP 1). MSSQL выполняет его в один поток, но виндовс его будет выполнять на всех 8 ядрах. В Диспетчере задач будет видна общая загрузка процессора 12.5%=100%/8 и пилообразный график по всем ядрам. Если назначить в MSSQL affinity на одно ядро, то будет 100% загрузки одного и около 0 по остальным. Выглядит так, что поядерный кеш постоянно сбрасывается и процессор не выходит на turbo частоту, как при загрузке только одного ядра. Получаем потерю производительности, большую при мегабайтном поядерном L2 кеше, меньшую при 256 КБ кеше. Например, в моём тестовом случае процессор нагружен на все ядра на частоте 3.32ГГц, хотя мог(?) бы на одно на 4.3ГГц.

Есть ли возможность в виндовсе влиять на размывание загрузки ядер хотя бы косвенным образом?


Во времена Win XP шедулер ядра, кажется, тоже перекидывал один поток с ядра на ядро, но делал это существенно реже. Ясно, что Микрософт заботится о размывании горячего ядра по кристаллу и прочем выравнивании нагрузки на процессоры с разным группированием ядер.
31 окт 19, 17:17    [22007396]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6955
tunknown,

запрос монолитен только у воображении, на самом деле сервер выполняет большое количество разнородных задач. При всем при том происходит переключение workers. Это штатная ситуация, не надо её бояться.
31 окт 19, 17:24    [22007409]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Ну, поставьте в настройках питания сервера производительный режим, чтобы не сбрасывал частоту.

Сообщение было отредактировано: 31 окт 19, 17:38
31 окт 19, 17:37    [22007432]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
tunknown
Member

Откуда:
Сообщений: 709
Гавриленко Сергей Алексеевич
Ну, поставьте в настройках питания сервера производительный режим, чтобы не сбрасывал частоту.
Уже стоит, мин=100% и макс=100%. Даже если бы это помогло, то это не повлияло бы на размытие нагрузки ядер.
31 окт 19, 17:45    [22007442]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
(4.3ГГц - 3.32ГГц) / 3.32ГГц = 30% прироста
(3.32ГГц * 8 - 3.32ГГц) / 3.32ГГц = 700% прироста

Не туда копаете, короче.
31 окт 19, 17:55    [22007458]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
d7i
Member

Откуда:
Сообщений: 463
Ничего Вы тут не поделаете. ОС Windows сама регулирует нагрузку как ей хочется.
Я уже экспериментировал с affinity, но это всего лишь "сходство, родственность", т.е. пожелание, а не жесткое указание.
Поэтому работает только в очень редких случаях и непродолжительное время, а далее Windows просто игнорирует Ваши пожелания.
Се ля ви...
31 окт 19, 17:56    [22007460]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
tunknown
Member

Откуда:
Сообщений: 709
Поскольку кеши L1/L2 заданы на двухпоточное ядро, то при определённой нагрузке с обращением команд к памяти кеши "уменьшаются" в два раза. Немного сгладить влияние упомянутой пилы можно отключив HyperThreading на Intel. На AMD ядра устроены по другому и отключить двухпоточность, как я понял, нельзя.
AMD
Ryzen 7 3700X
The number of CPU cores	8
The number of threads 16
Level 1 cache size 8 x 32 KB 8-way set associative instruction caches
8 x 32 KB 8-way set associative data caches
Level 2 cache size 8 x 512 KB 8-way set associative unified caches
Intel
Core i7-9800X
The number of CPU cores	8
The number of threads 16
Level 1 cache size 8 x 32 KB 8-way set associative instruction caches
8 x 32 KB 8-way set associative data caches
Level 2 cache size 8 x 1 MB 16-way set associative caches


Поэтому, если число одновременно выполняемых запросов (не просто залогиненных пользователей) соответствует числу ядер, то многопоточность нужно отключать. В редких случаях при наличии массовых параллельных планов этот совет не годится.

Хитрости, подобные NtSetTimerResolution, пока оставим в стороне.

Сообщение было отредактировано: 1 ноя 19, 09:40
1 ноя 19, 09:40    [22007754]     Ответить | Цитировать Сообщить модератору
 Re: Размывание однопоточной нагрузки по ядрам  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6955
tunknown,

это теория, в моей практике hyperthreading улучшает ситуацию по нагрузке. Известны ли какие-либо практические тесты с включенной и отключенной многопоточностью?
1 ноя 19, 11:44    [22007929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить