Я хочу изменить предыдущие ответы.
Erlang, или, точнее, система времени исполнения Erlang (erts), по умолчанию устанавливает количество планировщиков (потоков ОС) и количество очередей на количество элементов обработки на вашей платформе. То есть ядра процессоров или аппаратные потоки. Вы можете изменить эти настройки во время выполнения, используя:
erlang:system_flag(schedulers_online, NP) -> PrevNP
Процессы Эрланга еще не связаны ни с какими планировщиками. Логика, балансирующая процессы между планировщиками, следует двум правилам. 1) Голодный планировщик украдет работу у другого планировщика. 2) Миграционные пути настроены так, чтобы проталкивать процессы из планировщиков с большим количеством процессов в планировщики с меньшим количеством работы. Это делается для обеспечения справедливости в подсчете сокращения (времени выполнения) для каждого процесса.
Однако планировщики могут быть привязаны к конкретным элементам обработки. Это не сделано по умолчанию. Чтобы позволить erts делать scheduler-> core affinity, используйте:
erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind
Несколько других типов привязки можно найти в документации. Использование сходства может значительно улучшить производительность в ситуациях с большой нагрузкой! Особенно в ситуациях с высокой блокировкой. Кроме того, ядро Linux не может обрабатывать гиперпотоки по меньшей мере. Если у вас есть гиперпотоки на вашей платформе, вы действительно должны использовать эту функцию в erlang.