Skip to content

Instantly share code, notes, and snippets.

@UA3MQJ
Last active June 15, 2018 06:50
Show Gist options
  • Save UA3MQJ/7706a8f24b0930a8428cc5a88ded346b to your computer and use it in GitHub Desktop.
Save UA3MQJ/7706a8f24b0930a8428cc5a88ded346b to your computer and use it in GitHub Desktop.
Сделал модуль
defmodule Tm do
def test(x) do
x + 1
end
end
запуск ноды iex --sname ui
второй ноды на том же хосте iex --sname ui2
запуск ноды на другом хосте - так же
загрузка кода модуля в вм:
Code.load_file("tm.ex")
Tm.test(1)
подсоединить ноду одну к другой :net_kernel.connect_node(:ui@free)
должны быть одинаковые cookies
Варианты потестить:
:timer.tc(fn -> Enum.each(1..1000_000, fn(x)-> :rpc.call(:ui@free, Tm, :test, [x]) end) end)
:timer.tc(fn -> 1..1_000 |> Enum.map(fn(x)-> :rpc.async_call(:ui@free, Tm, :test, [x]) end) |> Enum.map(fn(x)-> :rpc.yield(x) end) end)
синхронный
:timer.tc(fn ->
1..100_000 |> Enum.map(fn(x) ->
Task.async(fn() ->
:rpc.call(:ui@free, Tm, :test, [x])
end)
end) \
|> Enum.each(fn(task) ->
Task.await(task, :infinity)
end) \
end)
асинк
:timer.tc(fn ->
1..100_000 |> Enum.map(fn(x) ->
Task.async(fn() ->
:rpc.async_call(:ui@free, Tm, :test, [x]) |> :rpc.yield()
end)
end) \
|> Enum.each(fn(task) ->
Task.await(task, :infinity)
end) \
end)
ЖЕЛЕЗО
Серверный хост:
hw.model: AMD Athlon(tm) II X2 250 Processor
hw.machine: amd64
hw.ncpu: 2
Клиентский хост: OrangePI
Сеть - проводная 100 мегабит. Обе машины напрямую воткнуты в тупой коммутатор 100 Мбит/с: 148800 пакетов/с (а не задумчивый роутер с линуксом).
РЕЗУЛЬТАТЫ
вызовы CALL это, считай, они по очереди выполняются.
test1 - нода сама к себе
:timer.tc(fn -> Enum.each(1..1000_000, fn(x)-> :rpc.call(:ui@free, Tm, :test, [x]) end) end)
tc - 3778990
264760 rpc_call/sec
test2 - нода к ноде на одном хосте
:timer.tc(fn -> Enum.each(1..1000_000, fn(x)-> :rpc.call(:ui@free, Tm, :test, [x]) end) end)
tc - 75_208_192
13296 rpc_call/sec - оба ядра в 100%
test3 - нода к ноде с другого хоста в кластере.
:timer.tc(fn -> Enum.each(1..1000_000, fn(x)-> :rpc.call(:ui@free, Tm, :test, [x]) end) end)
tc - 360_589_108
2.77 rpc_call/sec - одно ядро сервера в 30%, одно ядро клиента 100%, на коммутаторе активность сети
странно.
вызовы ASYNC_CALL это, считай, они по очереди выполняются.
test4 - нода сама к себе
:timer.tc(fn -> Enum.each(1..100_000, fn(x)-> :rpc.async_call(:ui@free, Tm, :test, [x]) |> :rpc.yield() end) end)
tc - 4_630_360
21598 rpc_call/sec
test5 - нода к ноде на одном хосте - 100к сообщений
:timer.tc(fn -> Enum.each(1..100_000, fn(x)-> :rpc.async_call(:ui@free, Tm, :test, [x]) |> :rpc.yield() end) end)
tc - 7_887_305
12679 rpc_call/sec - одно ядро 100% второе на 30%.
test6 - нода к ноде с другого хоста в кластере.
:timer.tc(fn -> Enum.each(1..100_000, fn(x)-> :rpc.async_call(:ui@free, Tm, :test, [x]) |> :rpc.yield() end) end)
tc - 41_596_122
2404 rpc_call/sec - одно ядро сервера в 30%, одно ядро клиента 100%, на коммутаторе активность сети
процессы через tasks/async в режиме call - еще хуже.
а в режиме async:
асинк
:timer.tc(fn ->
1..100_000 |> Enum.map(fn(x) ->
Task.async(fn() ->
:rpc.async_call(:ui@free, Tm, :test, [x]) |> :rpc.yield()
end)
end) \
|> Enum.each(fn(task) ->
Task.await(task, :infinity)
end) \
end)
test 7 - нода сама к себе
tc - 22_515_768 -> 4441 rpc_call/sec
test 8 - нода к ноде на одном хосте
tc - 20_767_210 -> 4815 rpc_call/sec
test 9 - нода к ноде с другого хоста в кластере.
tc - 67_169_712 -> 1488 rpc_call/sec
@UA3MQJ
Copy link
Author

UA3MQJ commented Jun 15, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment