Signal Send/Receive Benchmark Results
This page contains results comparing signal send and receive
throughput before and after the parallel signal send
optimization. See the commit message
of this
commit for more information about the optimization.
Benchmark Description
The benchmark lets N Erlang processes send signals (of configurable
types and sizes) to a single process during a period of T
seconds. Both N and T are configurable variables. A signal with size S
has a payload consisting of a list of length S with word-sized (64
bits) items. The send throughput is calculated by dividing the number
of signals that are sent by T. The receive throughput is calculated by
waiting until all sent signals have been received, and then dividing
the total number of signals sent by the time between when the first
signal was sent and when the last signal was received.
Benchmark Code
Machine Configuration
Machine:
Microsoft Azure VM instance: Standard D64s v3 (64 vcpus, 256 GB memory):
2 * Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz (16 cores with hyper-threading)
2 NUMA nodes
32 cores
64 hardware threads
256GB ram
Operating System:
Description: Ubuntu 18.04.2 LTS
Linux version: 5.4.0-1051-azure
Run-time Parameters
The benchmark was started with the parameter "+sbt tnnps" .
erl +sbt tnnps -eval "parallel_messages_SUITE:large_throughput_benchmark(),erlang:halt()"
Benchmark Configuration
The benchmark configuration used can be found here .
Results
Notice that every second graph contain send throughput and every second contain receive throughput.
_1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 10M 20M 30M 40M 50M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {message_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M 10M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {message_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 5M 10M 15M 20M 25M 30M 35M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {message_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 1M 2M 3M 4M 5M 6M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {message_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {message_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.5M 1M 1.5M 2M 2.5M 3M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {message_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.2M 0.4M 0.6M 0.8M 1M 1.2M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {message_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.2M 0.4M 0.6M 0.8M 1M 1.2M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {message_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 1M 2M 3M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.5M 1M 1.5M 2M 2.5M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.5M 1M 1.5M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.2M 0.4M 0.6M 0.8M 1M
Scenario: Send Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.2M 0.4M 0.6M 0.8M 1M
Scenario: Receive Throughput, send_duration=1000 ms, 100.000000% {exit_signal_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M 10M
Scenario: Send Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,1}, 50.000000% {message_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 1M 2M 3M 4M
Scenario: Receive Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,1}, 50.000000% {message_size,1}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M 8M 10M
Scenario: Send Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,10}, 50.000000% {message_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.5M 1M 1.5M 2M 2.5M
Scenario: Receive Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,10}, 50.000000% {message_size,10}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 2M 4M 6M
Scenario: Send Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,100}, 50.000000% {message_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.5M 1M 1.5M 2M
Scenario: Receive Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,100}, 50.000000% {message_size,100}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 0.2M 0.4M 0.6M 0.8M 1M 1.2M
Scenario: Send Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,1000}, 50.000000% {message_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen _1 _2 _4 _8 _15 _16 _31 _32 _47 _48 _63 _64 0 200k 400k 600k 800k
Scenario: Receive Throughput, send_duration=1000 ms, 50.000000% {exit_signal_size,1000}, 50.000000% {message_size,1000}, Spawn Options=[{message_queue_data,off_heap}] # of Processes Operations/Second master_2ef0c Ver: 2 parallel_sigq_658f8 Fill screen
This page generates graphs from data produced by the Message Send/Receive Benchmark which is defined in the function parallel_messages_SUITE:test_throughput_benchmark/1
(see "$ERL_TOP/erts/test/parallel_messages_SUITE.erl
").
Note that one can paste results from several benchmark runs into the field below. Results from the same scenario but from different benchmark runs will be relabeled and plotted in the same graph automatically.
Note also that that lines can be hidden by clicking on the corresponding label.
Paste the generated data in the field below and press the Render button:
Include Throughput Plot
Include % More Throughput Than Worst Plot
Include % Less Throughput Than Best Plot
Bar Plot
Same X Spacing Between Points
Render