Несколько виртуальных машин Erlang, работающих на Windows Server, как предварительно выделить ядра процессора для каждой виртуальной машины - PullRequest
0 голосов
/ 09 января 2019

У меня есть несколько виртуальных машин Erlang, работающих на компьютере с Windows. Я хочу предварительно выделить количество ядер процессора, которые будут использоваться каждой виртуальной машиной. Для Instance VM1 следует использовать только 2 ядра, а для VM2 - 2 других.

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Самое простое, что нужно сделать, это указать виртуальной машине Erlang, сколько ядер использовать, используя параметр +S :

erl +S 2

Он называется S, потому что виртуальная машина Erlang использует один s cheduler на ядро.

По умолчанию планировщики не привязаны ни к какому ядру. Вы можете проверить это, используя erlang:system_info(scheduler_bindings):

3> erlang:system_info(scheduler_bindings).
{unbound,unbound}

Вы можете попросить виртуальную машину Erlang привязать планировщики к ядрам, передав аргументы +sbt db, но это может иметь неприятные последствия, если вы запустите более одной виртуальной машины на одном компьютере, поскольку они будут привязаны к те же ядра. Таким образом, вам также необходимо использовать +sct параметр , чтобы использовать собственную топологию ЦП. Во-первых, выясните, что виртуальная машина Erlang считает настоящей топологией. Вот что он говорит о моем ноутбуке:

2> erlang:system_info({cpu_topology,detected}).
[{processor,[{core,[{thread,{logical,0}},
                    {thread,{logical,4}}]},
             {core,[{thread,{logical,1}},{thread,{logical,5}}]},
             {core,[{thread,{logical,2}},{thread,{logical,6}}]},
             {core,[{thread,{logical,3}},{thread,{logical,7}}]}]}]

Итак, давайте свяжем первую виртуальную машину с логическими потоками 0 и 4, находящимися в потоке 0 и 1 соответственно, на ядре 0 процессора 0:

erl +S 2 +sbt db +sct L0T0C0P0:L4T1C0P0

И давайте свяжем вторую виртуальную машину с логическими потоками 1 и 5 в потоке 0 и 1 ядра 1 процессора 0:

erl +S 2 +sbt db +sct L1T0C1P0:L5T1C1P0

Если вы используете Elixir, вы можете передать все эти параметры с аргументом --erl в elixir или iex:

iex --erl "+S 2 +sbt db"
0 голосов
/ 09 января 2019

Я бы не рекомендовал делать это, поскольку ОС, вероятно, является лучшим разработчиком для планирования процессов, которые могут эффективно работать на процессорах, и изменение этого может не очень помочь (должно определяться сравнительным тестированием производительности).

Это невозможно сделать, используя только флаги Erlang VM. Для конкретных окон смотрите в этом примере

Ниже приведена команда только для окон.

cmd.exe START /affinity 3 erl +S 2
cmd.exe START /affinity B erl +S 2

Affinity 3 (x0011) запускает процесс Erlang VM OS только в CPU0 и 1. Affinity B (x1100) запускает процесс Erlang VM OS только в CPU2 и 3.

erl + S 2 запускает 2 потока планировщика, которые ОС может запускать на 2 процессорах. Это эффективно использовало бы ЦП, так как выполнение большего количества может привести к переключению контекста, а меньшее выполнение может привести к недостаточному использованию ресурса

...