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