Недавно предложили посмотреть один интересный сервер, работал не очень хорошо, жаловались.
Версия 2012 стандарт, 2 х 14 ядер процессора + Hyper-Threading. То есть, всего 56 логических ядер.
Исследование показало, что сервер поделил буфер на ноды. Но на одну ноду пришлось 28 ядер, а на другую 4. Почему?
Дело в том, что версия имеет ограничение по числу ядер. Допустимо 16 или 32 с HT. Сервер HT распознал, и согласился подключить 16 х 2 =32 ядра, но по очереди! Попытка добавить ядра приводила к браной ругани сервера на лицензионные ядра, заявленная конфигурация оплачена и лицензирована.
Дальше дело техники, в каждой ноде affinity mask по 16 логических ядер или 8 физических выходит. Но закралась такая нехорошая мысль..
У сервера задействованы 32 логических ядра из 56, нерационально.
Что сделал- affinity mask на ЧЕТНЫЕ ядра. 0, 2, 4.. HT делит физическое ядро на две половинки, при этом общая производительность растет на 10-15%. Чудес не происходит, нагрузка второго логического ядра сильно тормозит первое. Вот я эту нагрузку и убрал.
Получилось 28 четных ядер, а нечетные половинки отключил. 28 физических ядер!
Производительность сразу повысилась, ноды были задействованы равномерно, ожидания связанные с распараллеливанием резко снизились. С сервером еще много чего сделать пришлось, но это меня удивило- сервер позволил так распределить процессоры, чтобы под видом логических подложить ему физические ядра.
Каким способом было выявлено неравномерное распределение?
Если речь о ядрах, то
select ‘node ‘+convert(varchar(20),parent_node_id)+’ ‘+convert(varchar(20),COUNT(*))+’ cores’
FROM sys.dm_os_schedulers WHERE scheduler_id<255 AND is_online=1 GROUP BY parent_node_id