24.4.26

Работают ли многоядерные процессоры лучше, чем одноядерные?

Автор: Paul Randal, Search Engine Q&A #5: Do multi-core CPUs perform better than single-core CPUs?

Вот интересный вопрос, который прислал мне мой друг Стив Джонс из SQL Server Central — будет ли один процессор с двумя ядрами работать лучше, чем два одноядерных процессора? Оба варианта имеют два вычислительных ядра, но аппаратная архитектура разная — какой из них обеспечит лучшую производительность SQL Server? Что ж, однозначного ответа нет — всё зависит от многих факторов! Я обсуждал эту тему с Джеромом Халмансом, бывшим коллегой по команде Storage Engine в SQL Server, и с его разрешения я основываю эту статью на нашем обсуждении.

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

  • На  машине с двумя процессорами и одним ядром в каждом  аннулирования строк кэша должны проходить через основную шину между двумя процессорами, что влечёт задержки арбитража шины.
  • На двухъядерной машине аннулирования строк кэша не проходят через шину, потому что оба ядра находятся внутри одного корпуса процессора. Более того, если архитектура достаточно умна, она может просто переотобразить строку кэша с одного ядра на другое, избегая тем самым любого копирования данных. Хотя я не уверен, существует ли такая архитектура.

В документации Intel написано, что в многоядерных системах кэш L2 является общим, но изменения, внесённые разными ядрами в свои частные кэши L1, всё равно должны пройти через общий кэш L2, прежде чем будут загружены другим ядром. Это всё равно будет НАМНОГО быстрее, чем прохождение через основную шину между одноядерными процессорами.

А в похожем документе от AMD об их многоядерной архитектуре Barcelona, в которой описывается, что каждое ядро имеет отдельные кэши L1 и L2, а также дополнительный общий кэш L3. Отдельные кэши L2 своего рода связаны, так что изменения в строке кэша в одном кэше L2 немедленно отражаются в других кэшах L2 (если это необходимо).

Но количество аннулирований кэша (любого типа) зависит от рабочей нагрузки. Рассмотрим два типа рабочей нагрузки:

  • Тип 1: Нагрузка имеет очень независимые характеристики, поэтому данные, обрабатываемые потоком на одном ядре, не связаны с данными, обрабатываемыми потоком на другом ядре. Аннулирований строк кэша должно быть очень мало. В этом случае одноядерные процессоры будут иметь все свои локальные кэши, заполненные данными, относящимися только к работающему потоку. Два ядра на двухъядерном процессоре будут вынуждены совместно использовать некоторый уровень внутрикристального кэша, поэтому в кэше может возникать больше «турбулентности». В этом случае я ожидаю, что одноядерные процессоры будут работать лучше.
  • Тип 2: Нагрузка такова, что данные являются общими, и потоки касаются данных, обрабатываемых другими потоками на других ядрах. В этом случае одноядерные процессоры станут жертвой массового аннулирования строк кэша, тогда как двухъядерные процессоры будут выполнять аннулирование строк кэша на кристалле (того типа, который поддерживается архитектурой). В этом случае я ожидаю, что многоядерный процессор превзойдёт два одноядерных процессора.

Тем не менее, большинство рабочих нагрузок на SQL Server относится ко второму типу, описанному выше. Джером упомянул, что даже синтетические нагрузки (такие как эталонный тест TPC-C) всё равно приводят к тому, что несколько потоков обращаются к одним и тем же страницам данных/индексов и изменяют их.

Итак — каков итог? Я ожидаю, что в большинстве рабочих нагрузок многоядерный процессор превзойдёт эквивалентное количество одноядерных процессоров. И, как заметил Джером, даже если это не так для вашей рабочей нагрузки, вам будет довольно трудно найти систему, которая поставляется с одноядерными процессорами в наши дни.


Комментариев нет:

Отправить комментарий