This page contains results from an ETS benchmark showcasing the performance and scalability of a new ETS ordered_set implementation. The new ETS ordered_set implementation is only enabled when the option {write_concurrency, true} is passed to the ets:new function. The write_concurrency option had no effect on the created table when used in combination with ordered_set before the new implementation was added. The following papers describe the data structure that the new ETS ordered_set implementation is based on (the contention adapting search tree):

A Contention Adapting Approach to Concurrent Ordered Sets. Journal of Parallel and Distributed Computing, 2018. Kjell Winblad and Konstantinos Sagonas. (publisher, preprint)

More Scalable Ordered Set for ETS Using Adaptation. In Thirteenth ACM SIGPLAN workshop on Erlang (2014). Kjell Winblad and Konstantinos Sagonas. (publisher, preprint)

Benchmark Description

The benchmark measures how many ETS operations per second X Erlang processes can perform on a single table. Each of the X processes repeatedly selects an operation to do from a given set of operations. The likelihood that a certain operation will be selected is also given to the benchmark. The table that the processes operate on is prefilled with 500K items before each benchmark run starts. The source code for the benchmark is located in the function ets_SUITE:throughput_benchmark/0 (see "$ERL_TOP/lib/stdlib/test/ets_SUITE.erl"). Below is a list with brief descriptions of the operations:

Benchmark Machine and Erlang Parameters

Processor: NUMA machine with four Intel(R) Xeon(R) CPU E5-4650 CPUs (2.70GHz), eight cores each (i.e., the machine has a total of 32 physical cores, each with hyperthreading, which makes a total of 64 logical cores).
Memory: 128GB of RAM
OS: Debian GNU/Linux 9, Linux 4.9.0-8-amd64
Erlang Version: Based on the master branch 2018-08-24, commit 4d1422e1d5423725bd5e72e1b1ac1d8c0804ea3a
Erlang Parameters: "+sbt nnts" = up to 16 processes run on a single NUMA node, 32 processes run on two NUMA nodes and 64 processes run on all four NUMA nodes

Benchmark Results

ETS Benchmark Result Viewer

This page generates graphs from data produced by the ETS benchmark which is defined in the function ets_SUITE:throughput_benchmark/0 (see "$ERL_TOP/lib/stdlib/test/ets_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. This makes comparisons of different versions easy.

Note also that that lines can be hidden by clicking on the corresponding label.

Paste the data in the field below and press the Render button:

Bar Plot
Same X Spacing Between Points
Show [ordered_set,public]
Show [ordered_set,public,{write_concurrency,true}]
Show [ordered_set,public,{read_concurrency,true}]
Show [ordered_set,public,{write_concurrency,true},{read_concurrency,true}]
Show [set,public]
Show [set,public,{write_concurrency,true}]
Show [set,public,{read_concurrency,true}]
Show [set,public,{write_concurrency,true},{read_concurrency,true}]