Я подумаю, что вы сделали должную осмотрительность и подтвердили, что потребление ЦП принадлежит процессу sqlservr.exe, поэтому мы не преследуем красную селедку здесь. Если нет, убедитесь, что процессор потребляется sqlservr.exe, проверив счетчики производительности Process \% Processor.
Вам необходимо понять модель планирования процессора SQL Server, как описано в Thread and Task Architecture. SQL Server распространяет запросы (sys.dm_exec_requests) через планировщики (sys.dm_os_schedulers), назначая каждому запросу задачу (sys.dm_os_tasks), которую выполняет рабочий (sys.dm_os_workers). Работник опирается на нить или волокно ОС (sys.dm_os_threads). Большинство запросов (пакет, отправленных на SQL Server) порождают только одну задачу, некоторые запросы могут порождать несколько задач (наиболее часто встречающиеся запросы).
Нормальное поведение планирования SQL Server 2005 должно быть равномерно распределено между всеми планировщиками. Каждый планировщик соответствует одному ядру ЦП. Результатом должна быть четная нагрузка на все ядра ЦП. Но я видел проблему, которую вы описали несколько раз в лабораториях, когда физическая нагрузка распределялась неравномерно только на нескольких процессорах. Вы должны понимать, что SQL Server не управляет связью потоков своих работников, но вместо этого использует алгоритм привязки ОС для локализации потоков. Это означает, что даже если SQL Server распространяет запросы по 16 планировщикам, ОС может решить запустить потоки только на 4 ядрах. В связи с этим вопросом есть две проблемы, которые могут вызвать или усугубить это поведение:
- Hyperthreading. Если вы включили hyperthreading, выключите его. SQL Server и гиперпоточность should never mix.
- Плохие водители. Убедитесь, что у вас установлены правильные драйверы системных устройств (например, для основной платы и т. Д.).
Также убедитесь, что ваш SQL 2005, по крайней мере, на уровне SP2, желательно с последними SP и всеми CU. То же самое касается Windows (вы запускаете Windows 2003 или Windows 2008?).
Теоретически поведение также может быть объяснено очень своеобразной рабочей нагрузкой, т.е. SQL видит лишь несколько очень длинных запросов и запросов к процессору, которые не имеют опции parallle. Но это будет экстремально перекос нагрузки, и я никогда не видел что-то подобное в реальной жизни.
Это замечательно! Большое спасибо за эти ссылки! Я искал повсюду для всеобъемлющей диаграммы планирования процессора или чего-то еще. – Eric
Вы найдете много внутренних дел, описанных в блоге Slava по адресу http://blogs.msdn.com/slavao/ –
. Я думаю на этом этапе, что, как вы говорите, возможно, ОС действительно вызывает проблему, и это только назначая потоки четырем из процессоров. – Eric