Отличный комментарий @Thiago Silveira о первой строке вывода iex. Часть [smp:8:8]
говорит, сколько процессов уровня операционной системы использует Erlang. Вы можете контролировать это с помощью флага --smp
, если хотите его отключить:
iex --erl '-smp disable'
Это гарантирует, что у вас будет только один системный процесс. Вы можете добиться аналогичного результата, оставив включенной симметричную многопроцессорность, но установив напрямую NumberOfShcedulers:NumberOfSchedulersOnline
.
iex --erl '+S 1:1'
У каждого процесса операционной системы должен быть свой собственный планировщик для процессов Erlang, поэтому вы можете легко увидеть, сколько из них у вас сейчас:
:erlang.system_info(:schedulers_online)
Чтобы ответить на ваш вопрос о производительности. Если ваши процессоры не работают на полную мощность (100%) и ни один из них ничего не делает (0%), то, вероятно, более равномерное распределение нагрузки не ускорит процесс. Почему?
Использование ЦП измеряется путем проверки состояния процессора во многие моменты времени. Это состояния либо «работает», либо «простаивает». 82% использования ЦП означает, что вы можете выполнять еще пару задач на этом ЦП, не замедляя выполнение других задач.
Планировщики Erlang стараются быть умными и не переносят процессы Erlang между ядрами, если только они не вынуждены, потому что это требует копирования. Перенос происходит, например, когда один из планировщиков простаивает. Затем он может заимствовать процесс из очереди выполнения другого планировщика.
Следующее, что может вызвать такое большое расхождение между четными и нечетными ядрами, - это Hyper Threading. На моем двухъядерном процессоре htop
показывает 4 логических ядра. В вашем случае у вас, вероятно, есть 4 физических ядра и 8 логических из-за HT. Возможно, вы используете свои физические ядра на 100%.
Другое дело: pmap нужно вычислять результат в отдельном процессе, но в конце он отправляет его вызывающей стороне, что может быть узким местом. Чем больше вы отправляете сообщений, тем меньше вы можете использовать процессор. Вы можете ради развлечения дать процессам задачу, которая действительно потребляет много ресурсов процессора, например вычисление функции Акермана. Вы даже можете рассчитать, какая часть вашей работы является последовательной, а какая параллельной, используя закон Амдала и измеряя выполнение. раз для разного количества ядер.
Подводя итог: загрузка ЦП на скриншоте выглядит просто великолепно! Вам не нужно ничего менять для более ресурсоемких задач.
person
tkowal
schedule
24.04.2016
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
- person user456584   schedule 24.04.2016