Last active
June 15, 2018 06:50
-
-
Save UA3MQJ/7706a8f24b0930a8428cc5a88ded346b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Сделал модуль | |
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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://github.com/priestjim/gen_rpc