Количество потоков, используемых средой выполнения Go
Сколько потоков может использовать среда выполнения Go (планировщик, сборщик мусора и т. Д.)? Например, если GOMAXPROCS
является 10
Сколько из этих потоков ядра будет использоваться во время выполнения?
Редактировать:
Я читал обоснование для изменения GOMAXPROCS
в runtime.NumCPU()
в Go 1.5. Было предложение, в котором утверждалось, что "производительность однопрограммных программ может быть улучшена путем повышения GOMAXPROCS
из-за параллелизма времени выполнения, особенно сборщика мусора ".
Мой реальный вопрос: если у меня есть программа с одной загрузкой, запущенная в Docker-контейнере с квотой ЦП, какое минимальное количество логических процессоров мне нужно, чтобы иметь максимальную производительность.
1 ответ
Там нет прямой корреляции. Темы, используемые вашим приложением, могут быть меньше, равны или больше 10.
Цитирование из пакета документов runtime
:
Переменная GOMAXPROCS ограничивает количество потоков операционной системы, которые могут одновременно выполнять код Go на уровне пользователя. Нет ограничений на количество потоков, которые могут быть заблокированы в системных вызовах от имени кода Go; те не считаются с лимитом GOMAXPROCS. Функция GOMAXPROCS этого пакета запрашивает и изменяет ограничение.
Поэтому, если ваше приложение не запускает никаких новых подпрограмм, количество потоков будет меньше 10.
Если ваше приложение запускает много подпрограмм (>10), где ни одна не блокирует (например, при системных вызовах), 10 потоков операционной системы будут выполнять ваши подпрограммы одновременно.
Если ваше приложение запускает много подпрограмм, в которых многие (>10) заблокированы в системных вызовах, будет создано более 10 потоков ОС (но не более 10 будут выполнять код Go уровня пользователя).
См. Этот вопрос для примера и деталей: почему не создается много потоков, когда многие программы заблокированы при записи файла в golang?
Изменить (в ответ на ваше изменение):
Я считаю значение по умолчанию GOMAXPROCS
количество логических процессоров по причине: потому что в целом это обеспечивает самую высокую производительность. Вы можете оставить это на этом. В общем, если у вас есть только 1 процедура и вы уверены, что ваш код больше не появляется, GOMAXPROCS=1
достаточно, но вы должны проверить и не принимать слово для этого.