Что такое Hyper-Threading и как он влияет на производительность в Go?

Ответ

Hyper-Threading (HT) — это технология Intel, которая позволяет одному физическому ядру процессора обрабатывать два потока вычислений одновременно. Для операционной системы каждое физическое ядро с включенным HT выглядит как два логических ядра.

Как это работает?
Физическое ядро имеет дублирующиеся наборы регистров, но исполнительные блоки (ALU, FPU) остаются общими. Когда один поток простаивает (например, в ожидании данных из памяти), ядро может переключиться на выполнение другого потока, повышая общую утилизацию ресурсов.

Влияние на Go:

По умолчанию планировщик Go устанавливает GOMAXPROCS равным количеству логических ядер, доступных системе, что можно проверить с помощью runtime.NumCPU().

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // На процессоре с 4 физическими ядрами и Hyper-Threading
    // этот код, скорее всего, выведет 8.
    fmt.Printf("Количество логических ядер: %dn", runtime.NumCPU())
}

Нюансы производительности:

  1. Положительный эффект: Для I/O-bound задач или смешанных нагрузок, где горутины часто блокируются, HT может дать прирост производительности до 30%, так как позволяет полезно использовать простои ядра.
  2. Отрицательный эффект (Contention): Для чисто CPU-bound задач, которые интенсивно используют одни и те же исполнительные блоки или кэш, HT может привести к деградации производительности. Два потока на одном ядре будут конкурировать за ресурсы, мешая друг другу. В таких случаях может быть целесообразно установить GOMAXPROCS равным количеству физических ядер.