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

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

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

2 ответа

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

erl +S 2

Это называется S потому что Erlang VM использует один 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"

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

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

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

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 процессорах. Это эффективно использовало бы ЦП, поскольку выполнение большего количества может привести к переключению контекста, а меньшее выполнение может привести к недостаточному использованию ресурса.

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