Skip to main content

A Performant Discrete-Event Simulator for Network Simulations

Project description

Daytone: A Performant Discrete-Event Simulator for Network Simulations

Developed with the Rust programming language, Daytone has been designed as a performant discrete-event simulator for network simulations. It uses stackless coroutines in asynchronous Rust to implement the actor model, where each actor can only interact with its counterparts using message passing. It excels at both small-scale and large-scale network simulations due to its ability to use either a single-threaded or a multi-threaded runtime; the single-threaded runtime minimizes overhead, while the multi-threaded runtime utilizes multiple CPU cores concurrently in the same simulation run.

To run a network simulation session using a configuration file, run:

RUST_LOG=debug daytone configs/simple.toml

where RUST_LOG levels can be error, warn, info, debug, and trace.

Configuration Settings

In Daytone, all configuration settings are read from a configuration file when a simulation session starts, and the configuration file follows the TOML format for the sake of simplicity and readability.

Here is an example configuration file simple.toml:

# An example configuration file that shows a basic setup.

seed = 1000
edges = [[0, 1], [0, 2]]
hosts = [0, 1, 2]
duration = 20.0
ui_interval = 1.0
report_interval = 2.0
num_threads = 1
log_path = "./simple"

[switch]
port_rate = 8000
capacity = 100
weights = [1]
discipline = "FIFO"
drop = "RED"

[[flow]]
flow_type = "PacketDistribution"
graph = [[0, 1]]
[flow.traffic]
    initial_delay = 1.0
    size = 10000
    arr_dist = {type = "Exp", lambda = 1.0}
    pkt_size_dist = {type = "Uniform", low = 1000, high = 1500}

[[flow]]
flow_type = "PacketDistribution"
graph = [[1, 0]]
[flow.traffic]
    initial_delay = 2.0
    duration = 10.0
    arr_dist = {type = "Uniform", low = 1, high = 1}
    pkt_size_dist = {type = "Uniform", low = 1000, high = 1500}

[[collective]]
collective_type = "Broadcast"
flow_type = "PacketDistribution"
flow_count = 2
graph = [[0, 1], [0, 2]]
sources = [0]
sinks = [1, 2]
[collective.traffic]
    initial_delay = 1.0
    duration = 10.0
    arr_dist = {type = "Uniform", low = 1, high = 1}
    pkt_size_dist = {type = "Uniform", low = 1000, high = 1500}

The following introduces all the possible settings in the configuration file.

General

seed

The seed for the random number generator to ensure reproducibility of the simulation results.

  • Valid value: Integer

  • Required: Yes

  • Example:

    seed = 1000
    

duration

The total duration of the simulation in seconds.

  • Valid value: Floating point number

  • Required: No

  • Default: 1500.0

  • Example:

    duration = 20.0
    

report_interval

The report_interval parameter specifies the time interval to log reports from all elements in the simulation.

  • Valid value: Floating point number

  • Required: No

  • Default: f64::MAX (No reports when the simulation is in progress, all reports are logged at the end.)

  • Example:

    report_interval = 1.0
    

ui_interval

Daytone provides a user interface, which for now includes a progress bar to visualize the progression of a simulation session. This ui_interval element specifies the time interval to advance the position of the progress bar.

  • Valid value: Floating point number

  • Required: No

  • Default: duration / 100

  • Example:

    ui_interval = 1.0
    

num_threads

The number of threads to be used in the simulation run. By setting this value to 1, the single-threaded runtime will be used instead of the default multi-threaded runtime.

log_path

Daytone generates three CSV files, sources.csv, sinks.csv, and switches.csv, containing statistics of a simulation session. log_path specifies the directory of the three CSV files.

  • Valid value: String

  • Required: No

  • Default: ./output

  • Example:

    log_path = "./test"
    

topology

Daytone supports arbitrary topologies. Besides widely-used topologies FatTree and Torus, any topology that can be specified as an undirected graph can be supported as well.

  • FatTree

    To specify the FatTree topology, it is required to specific k. k is a multiple of 2.

    Example:

    [topology]
    category = "FatTree"
    
    [topology.torus]
      	k = 8
    
  • Torus

    To specify the Torus topology, it is required to specific dimension dim, and node per dimension n. Only 1D, 2D, and 3D Torus topologies are supported. That is, valid values of dim are 1, 2, 3.

    Example:

    [topology]
    category = "Torus"
    
    [topology.torus]
      	dim = 2
      	n = 3
    
  • Custom topology

    Use edges to specify an undirected graph as the topology, and hosts to specify hosts in the topology.

    edges is a vector of [integer, integer]. An [integer, integer] pair presents an edge in the undirected graph.

    hosts is a vector of integers

    Example:

    edges = [[0, 1], [0, 2]]
    hosts = [0, 1, 2]
    

Switch

In Daytone, all switches use the same setting which can be specified with the following attributes.

port_rate

The bit rate of each outbound port.

  • Valid value: Floating point number

  • Required: Yes

  • Example:

    port_rate = 8000
    

capacity

The capacity (buffer size) of each outbound port.

  • Valid value: Integer

  • Required: Yes

  • Example:

    capacity = 100
    

drop

The packet drop strategy that drops packets when the buffer is full.

  • Valid value:

    Value Meaning
    TailDrop Dropping packets at the tail of the queue
    RED Random Early Detection
  • Required: Yes

  • Example:

    capacity = 100
    

discipline

The scheduling discipline.

  • Valid value:

    Value Meaning Notes
    FIFO First In First Out
    DRR Deficit Round Robin Required to specify weights
    WFQ Weighted Fair Queueing Required to specify weights
    SP Static Priority Required to specify priorities
    VC Virtual Clock Required to specify vticks
  • Required: Yes

  • Example:

    discipline = "FIFO"
    

weights

  • Valid value: Vector of integers

  • Required: Yes if dispcipline = "DRR" or dispcipline = "WFQ"

  • Example:

    weights = [1, 2, 3]
    

priorities

  • Valid value: Vector of (integer, integer), where the first integer is the flow class and the second integer is the priority of this flow class

  • Required: Yes if dispcipline = "SP"

  • Example:

    priorities = [(0, 2), (1, 1)]
    

vticks

  • Valid value: Vector of (integer, integer), where the first integer is the flow class and the second integer is the inverse of the desired rates for the corresponding flows, in bits per second

  • Required: Yes if dispcipline = "VC"

  • Example:

    vticks = [(0, 2), (1, 1)]
    

Flow

In Daytone, flows can be specified one by one:

[[flow]]
flow_id = 2
starts_before = [3]
starts_after = [1]
flow_type = "PacketDistribution"
graph = [[0, 1]]
[flow.traffic]
    initial_delay = 1.0
    duration = 2.0
    arr_dist = {type = "Uniform", low = 1, high = 1}
    pkt_size_dist = {type = "Uniform", low = 1000, high = 1500}

or by sets:

[[flow_set]]
first_flow_id = 10
flow_type = "PacketDistribution"
flow_count = 10
[flow_set.traffic]
    initial_delay = 0.0
    duration = 10.0
    arr_dist = {type = "Uniform", low = 0.0008, high = 0.0008}  # 10Mbps
    pkt_size_dist = {type = "Uniform", low = 1024, high = 1024}

The following table lists required, optional, or not supported attributes of a flow or a flow set.

Attribute Meaning flow flow_set
flow_id The id of the flow optional no
first_flow_id The smallest flow id of the flow set no optional
starts_before The ids of flows that cannot start until this flow / flow set ends optional optional
starts_after The ids of flows that this flow / flow set must wait for them to end before it starts optional optional
flow_type The type of the flow or flows of the flow set required required
flow_count The number of flows in the flow set no required
graph The pair of the source host and the sink host of the flow required no
path The path of the flow optional no
traffic The traffic of the flow / flow set required required

flow_id

The id of the flow. If not specified, the id of the first flow specified in the configuration file will be 0, and the subsequent ids of flows increase by 1.

  • Valid value: Integer

  • Required: No

  • Example:

    flow_id = 1
    

first_flow_id

The smallest flow id of the flow set.

  • Valid value: Integer

  • Required: No

  • Example:

    flow_first_id = 1
    

starts_before

The ids of flows that cannot start until this flow / flow set ends.

  • Valid value: Vector of integers

  • Required: No

  • Example:

    starts_before = [3, 4]
    

starts_after

The ids of flows that this flow / flow set must wait for them to end before it starts.

  • Valid value: Vector of integers

  • Required: No

  • Example:

    starts_after = [0, 1]
    

flow_type

The type of the flow or flows of the flow set.

  • Valid value:

    Value Meaning
    PacketDistribution A flow whose packet source sends packets with specific distributions of inter-arrival times and packet sizes
    TCP A flow whose packet source simulate the TCP protocol
  • Required: Yes

  • Example:

    flow_type = "PacketDistribution"
    

flow_count

The number of flows in the flow set.

  • Valid value: Integer

  • Required: Yes for a flow set

  • Example:

    flow_count = 10
    

graph

The pair of the source host and the sink host of the flow.

  • Valid value: [[integer, integer]]

  • Required: Yes for a single flow

  • Example:

    graph = [[0, 2]]
    

path

The path of the flow.

  • Valid value: Vector of integers where each integer is a node in the path

  • Required: No

  • Example:

    path = [0, 1, 2]
    

traffic

For a flow, it must specify its traffic under [flow.traffic]. For a flow set, it must specify the traffic of its flows under [flow_set.traffic].

The following table lists attributes of traffic.

Note:

  • initial_delay, arr_dist, and pkt_size_dist are required.
  • Either size or duration is required.
  • If flow_type = "TCP", [flow.traffic.tcp] or [flow_set.traffic.tcp] must be specified for the flow or flow set.
  • Attributes:

    Attribute Meaning Valid Value
    initial_delay The seconds the flow / flow set waits before producing its first packet Floating point number
    size The total size of packets of the flow / each flow of the flow set in bytes Integer
    duration The duration of the flow / each flow of the flow set in seconds Floating point number
    arr_dist The arrival distribution of packets in seconds Valid distribution info
    pkt_size_dist The distribution of packet sizes in bytes Valid distribution info

Valid distribution info includes uniform distribution and exponential distribution:

  • {type = "Uniform", low = 0.0008, high = 0.0008}
  • {type = "Exp", lambda = 1.0}
  • Required: Yes

  • Example:

    [[flow_set]]
    flow_type = "TCP"
    flow_count = 100
    [flow_set.traffic]
    	initial_delay = 0.0
    	duration = 0.1
    	arr_dist = {type = "Uniform", low = 0.0008, high = 0.0008}
    	pkt_size_dist = {type = "Uniform", low = 1024, high = 1024}
    [flow_set.traffic.tcp]
    	cc_algorithm = "TCPReno"
    

traffic.tcp

For a flow, it must specify its tcp characteristics under [flow.traffic.tcp]. For a flow set, it must specify the tcp characteristics of its flows under [flow_set.traffic.tcp].

  • Attributes:

    Attribute Meaning Valid Value
    cc_algorithm The congestion control algorithm TCPReno, TCPCubic
  • Required: Yes

  • Example:

    [flow.traffic.tcp]
    	cc_algorithm = "TCPReno"
    

Collective

In Daytone, collectives can be specified one by one:

[[collective]]
collective_type = "Broadcast"
flow_type = "PacketDistribution"
flow_count = 2
graph = [[0, 2], [0, 3], [1, 2], [1, 3]]
sources = [0, 1]
sinks = [2, 3]
[collective.traffic]
    initial_delay = 1.0
    duration = 10.0
    arr_dist = {type = "Uniform", low = 1, high = 2}
    pkt_size_dist = {type = "Uniform", low = 1000, high = 1500}

or by sets:

[[collective_set]]
collective_type = "Gather"
collective_count = 2
flow_type = "PacketDistribution"
flow_count = 2
sources = [[0, 1], [1, 2]]
sinks = [[2, 2], [3, 3]]
[collective_set.traffic]
    initial_delay = 1.0
    duration = 10.0
    arr_dist = {type = "Uniform", low = 3, high = 4}
    pkt_size_dist = {type = "Uniform", low = 2000, high = 2500}

The following table lists required, optional, or not supported attributes of a collective or a collective set.

Attribute Meaning collective collective_set
collective_type The type of the collective or collective set required required
first_flow_id The smallest flow id of the collective or collective set optional optional
collective_count The number of collectives in the collective set no required
flow_type The type of the flows of the collective or collective set required required
flow_count The number of flows in the collective or in each collective of the collective set required required
graph The pairs of the source host and the sink host of the collective's flows optional no
paths The paths of the collective's flows optional no
sources The sources of flows optional optional
sinks The sinks of flows optional optional
traffic The traffic of the collective / collective set required required

collective_type

The type of the collective or collective set.

  • Valid value: Brordcast or Gather

  • Required: Yes

  • Example:

    collective_type = "Broadcast"
    

first_flow_id

The smallest flow id of the collective / collective set.

  • Valid value: Integer

  • Required: No

  • Example:

    flow_first_id = 1
    

collective_count

The number of collectives in the collective set.

  • Valid value: Integer

  • Required: Yes for a collective set

  • Example:

    collective_count = 10
    

flow_count

The number of flows in the collective or in each collective of the collective set.

  • Valid value: Integer

  • Required: Yes

  • Example:

    flow_count = 4
    

graph

The pairs of the source hosts and the sink hosts of the collective's flows.

  • Valid value: Vector of [integer, integer]

  • Required: No

  • Example:

    graph = [[0, 1], [0, 2]]
    

paths

The paths of the collective's flows.

  • Valid value: Vector of vectors of integers where each integer is a node in the path

  • Required: No

  • Example:

    paths = [[0, 1], [0, 1, 2]]
    

sources

For a collective, sources is the set of the source hosts of this collective's flows.

  • Valid value: Vector of integers where each integer is a source host

  • Required: No

  • Example:

    sources = [0, 1]
    

For a collective set, sources is set of the source hosts of this collective set's collectives' flows.

  • Valid value: Vector of vectors of integers where each vector is a collective's flows' source hosts

  • Required: No

  • Example:

    sources = [[0, 0], [1, 1]]
    

sinks

For a collective, sinks is the set of the sink hosts of this collective's flows.

  • Valid value: Vector of integers where each integer is a sink host

  • Required: No

  • Example:

    sinks = [0, 1]
    

For a collective set, sinks is set of the sink hosts of this collective set's collectives' flows.

  • Valid value: Vector of vectors of integers where each vector is a collective's flows' sink hosts

  • Required: No

  • Example:

    sinks = [[0, 0], [1, 1]]
    

traffic

For a collective, it must specify the traffic of its flows under [collective.traffic]. For a collective set, it must specify the traffic of its flows under [collective_set.traffic].

The following table lists attributes of traffic.

Note:

  • initial_delay, arr_dist, and pkt_size_dist are required.
  • Either size or duration is required.
  • If flow_type = "TCP", [flow.traffic.tcp] or [flow_set.traffic.tcp] must be specified for the flow or flow set.
  • Attributes:

    Attribute Meaning Valid Value
    initial_delay The seconds the collective / collective set waits before producing its first packet Floating point number
    size The total size of packets of each flow of the collective / collective set in bytes Integer
    duration The duration of each flow of the collective / collective set in seconds Floating point number
    arr_dist The arrival distribution of packets in seconds Valid distribution info
    pkt_size_dist The distribution of packet sizes in bytes Valid distribution info

Valid distribution info includes uniform distribution and exponential distribution:

  • {type = "Uniform", low = 0.0008, high = 0.0008}
  • {type = "Exp", lambda = 1.0}
  • Required: Yes

  • Example:

    [[collective]]
    collective_type = "Broadcast"
    flow_type = "PacketDistribution"
    flow_count = 4
    [collective.traffic]
        initial_delay = 1.0
        duration = 10.0
        arr_dist = {type = "Uniform", low = 3, high = 4}
        pkt_size_dist = {type = "Uniform", low = 2000, high = 2500}
    

traffic.tcp

For a collective, it must specify the tcp characteristicsc of its flows under [collective.traffic.tcp]. For a collective set, it must specify the tcp characteristics of its collectives' flows under [collective_set.traffic.tcp].

  • Attributes:

    Attribute Meaning Valid Value
    cc_algorithm The congestion control algorithm TCPReno, TCPCubic
  • Required: Yes

  • Example:

    [collective.traffic.tcp]
    	cc_algorithm = "TCPReno"
    

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

daytone-0.3.0-py3-none-win_amd64.whl (1.3 MB view details)

Uploaded Python 3Windows x86-64

daytone-0.3.0-py3-none-win32.whl (1.2 MB view details)

Uploaded Python 3Windows x86

daytone-0.3.0-py3-none-musllinux_1_2_x86_64.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

daytone-0.3.0-py3-none-musllinux_1_2_i686.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

daytone-0.3.0-py3-none-musllinux_1_2_aarch64.whl (1.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

daytone-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

daytone-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

daytone-0.3.0-py3-none-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

daytone-0.3.0-py3-none-macosx_10_12_x86_64.whl (1.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file daytone-0.3.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: daytone-0.3.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.8

File hashes

Hashes for daytone-0.3.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d476d1450cf624fe30b577ce897a69afad089bb16c75db2e0b6a7e5a5a5b4027
MD5 42b1e88367f7ea4b0ba6e0e2b33fd669
BLAKE2b-256 6ac27963130df57f670d68a7b137bad933c300bbc070546d63320bf20c8eb7cd

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-win32.whl.

File metadata

  • Download URL: daytone-0.3.0-py3-none-win32.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.8

File hashes

Hashes for daytone-0.3.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 69f2da5a819714f3b072270ccc8c9c8205feb62962f6e47be43ac9225cd63573
MD5 7b812b2690a2bb2368752424e181e585
BLAKE2b-256 a87cac2487592d2bfa30e97f8e28d0c8fa208348130dd534a233bdbca41d8f0d

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4e8499ca8279fbd48f467ea4cbd2930874b24b6a1e2060884a816adcb54aa2a5
MD5 2ed65b4ba6c7452fd5fdf14504eafe30
BLAKE2b-256 70608da4e4a2a5c97803c5271c4e2b2954fdc66b59a42c49a4129314b340c0dd

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fb687c5e62889694af048e608d6863063ee55ab18cd7ef499449686b363340ad
MD5 d0afe23c9539df431daf47223ce9a557
BLAKE2b-256 21f1d84a344dc8595bf16355d8fedf4ff55fbe20d4fb6093a48789b10088c88b

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1abdc3d916f91f25a1c358f5c4230a085138ed224aa9779883cbc0608929c592
MD5 3f784baaa7253e8f07884755bb4d29e1
BLAKE2b-256 dbaa3618337618c1b44d9269c695e3c8b606e0b4f2b38028e86b5ed812507148

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3cda2a7bc66b3e4fa41782d0572c8a27c31df0c5ff5d1c8d94ec1ada81f42dea
MD5 eb21ab3e076b839615cf6531bf74ff36
BLAKE2b-256 1ca79b84bf3e94e295ea890c39fb23285dfd4ae713e5289cd47e888e93d474d4

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e346eb1362b0cafdac50ae037ff1c6a0b9fa9a6993edbe06031e3883af28cb05
MD5 f5d150d27e3e6e75815299de13f722fd
BLAKE2b-256 8885f9b2c017d7d9c23011faf9123118176a92a28ba4873cf6727621bf70239a

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 12915927833f27d8c7f9af8efafc70a97ce611c468bca3a5092bca16f3d594f3
MD5 26b537c561586b31aebf4e87440d3894
BLAKE2b-256 85a40b013c3587fd464fea018c2a1e733342d73f7519162f47d09da68ecb9313

See more details on using hashes here.

File details

Details for the file daytone-0.3.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for daytone-0.3.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2c413ac61496c7270fd5e2a9da38be28b1515768a6abfeeeda26ab3f186f4ebc
MD5 469cf078d8df1af9a1abcf56ec3935b4
BLAKE2b-256 498cf5a31bfb4f6c50c75ef753d881a253fddd98ecc76db2ee0ee8761de75b9d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page