この記事は、Elixir Advent Calendar 2023 シリーズ12 の22日目です
【本コラムは、5分で読めます】 ※各ライブラリをお試しいただく場合は各自次第で
piacere です、ご覧いただいてありがとございます
下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC+最新Elixirで試すシリーズです
実施PC/Elixir/OTP
- PC
- CPU:i9-9900K 3.60GHz
- メモリ:64 GByte
Erlang/OTP 24 [erts-12.3.2.15] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit]
Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
ソースコード
import Supervisor.Spec
defmodule PassSupervisor do
def start_link( processes ) do
start = Timex.now()
servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
Supervisor.start_link( servers, strategy: :one_for_one )
IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
end
def cat( parameter, name \\ "0" ) do
GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
end
def pwd( name \\ "0" ) do
GenServer.call( :global.whereis_name( name ), :pwd )
end
end
defmodule PassGenServer do
use GenServer
def start_link() do
{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
{ :ok, pid }
end
def handle_call( :pwd, _from, _state ) do
{ :ok, result } = File.cwd()
{ :reply, result, "" }
end
def handle_call( { :cat, path }, _from, _state ) do
{ :ok, result } = File.read( path )
{ :reply, result, "" }
end
end
実施結果
10万プロセス生成に、Elixir 1.13.4/OTP25と同じくらいです
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=787
:ok
限界確認
25万プロセスは、Elixir 1.13.4/OTP25より少し遅いようです
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=2150
:ok