Что делать, если GOMAXPROCS слишком велик?

Мы все знаем, что runtime.GOMAXPROCS по умолчанию установлено число ядер ЦП, что, если это свойство было установлено слишком большим?

  1. Будет ли в программе больше переключателей контекста?
  2. Будет ли сборщик мусора срабатывать чаще?

Все это зависит от того, что делает ваш код, а не только от значения GOMAXPROC.

Volker 26.07.2019 10:05
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
2
1
1 945
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

GOMAXPROCS по умолчанию установлено количество доступных логических ЦП по той причине, что в большинстве случаев это дает наилучшую производительность.

GOMAXPROCS ограничивает только количество «активных» потоков, если горутина потока блокируется (например, системным вызовом), может быть запущен новый поток. Прямой корреляции нет, см. Количество потоков, используемых средой выполнения Go.

Если GOMAXPROCS больше, чем количество доступных ЦП, то активных потоков будет больше, чем ядер ЦП, а это означает, что активные потоки должны быть «мультиплексированы» с доступными процессорами, поэтому да, будет больше переключателей контекста если есть больше активных потоков, чем ядер, что не всегда так.

Сборка мусора напрямую не связана с количеством потоков, так что об этом можно не беспокоиться. Цитата из пакета runtime:

The GOGC variable sets the initial garbage collection target percentage. A collection is triggered when the ratio of freshly allocated data to live data remaining after the previous collection reaches this percentage. The default is GOGC=100. Setting GOGC=off disables the garbage collector entirely. The runtime/debug package's SetGCPercent function allows changing this percentage at run time. See https://golang.org/pkg/runtime/debug/#SetGCPercent.

Если у вас есть больше потоков, которые не выделяют/не освобождают память, это не должно влиять на то, как часто запускаются коллекции.

Могут быть случаи, когда установка GOMAXPROCS выше количества процессоров увеличивает производительность вашего приложения, но они редки. Измерьте, чтобы узнать, поможет ли это в вашем случае.

Другие вопросы по теме