Skip to main content

Daytone: 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.2-py3-none-win_amd64.whl (1.3 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

daytone-0.3.2-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.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

daytone-0.3.2-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.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: daytone-0.3.2-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.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 161e7e234b6c07a8e7707f950ad2bb2a3dd056f08a21e3ed9fe903b751aa2c70
MD5 ad3c11a3a0bd94e42b55ad8919db8975
BLAKE2b-256 dad3c57a0f56540446ac4c98873cc83564785aab2aac11015c39c3a3ee313bd0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: daytone-0.3.2-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.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 dfc1669e1660ff79e6e0e187ff6ca0231248f0afabc689e7b68792a64f6e22a7
MD5 829fdbafe47f18f9558ed9753bf095fd
BLAKE2b-256 63686d0549a24bd8b69c8f8c844394e1219d828f738701e93698e6d0a3db2d6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 61cc26d30f44f7d1d8f44252d7f763e11a5f03b053c9158d84e37275bbcfc482
MD5 b095a4d75fa74a6cb7f5a4608876dae6
BLAKE2b-256 bd55c81c50ef750915e5cd56438e935f6a3e5a853098bd80e61f0feeea700185

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2e2623c78e355f6e5abd1871801f982c67ab267e6984ef89be9ca19983179511
MD5 38569e485406f2a356cd14f41c0ec51d
BLAKE2b-256 a01968c6e06c717b429e12cf45b3105ffeeaee274bf4d230a75914be3c3ecf14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d864e81380362a3dcea19d20bbb1071972b7d31c49889ad1a386d6dc36522853
MD5 292c311435665b2a8993791cfa6d2079
BLAKE2b-256 3a49b1d6785fa2d846e84f55a6a31b68915f4d896b466639c7b89cf112e71f30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fdc656e971858bf4a9b8b607f9bd7b9d89ea5e899509f5aa8b9d9d68b3711f0b
MD5 3e84b4e0a2a9b93b146230e290a147f5
BLAKE2b-256 92a8c643673a8806b8cb51db97fe0e3c1459e6542fa1316aad5b327ad8dc8c1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6b55208cc0a96aacfa502baec1e088f3e0a749818f0af96613e3a4c0b0a2dc8a
MD5 1ce302e3dccef1dbb3d889f01a702cdb
BLAKE2b-256 f2a737f3422b7ce3108e036e6a07a98b7e71eb99287f4f276889cebd83ace6bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 afb8e7116744acc9192335f5be885a4a00def21641667794cbc2756c87d09d8e
MD5 55b7e6b7fe756167bf9af7148a6cd2d4
BLAKE2b-256 1e2c25fbed634b58e3eb01dd82f100160d6a288572b222cd40d75cfa69d419f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for daytone-0.3.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 db2303c6ee2ee916a64dbdb207b270a912cdfc3cbbac1bd64006efe50177713c
MD5 b5161ba0a70c03630ad95c6fdf0e681b
BLAKE2b-256 0fd9da3cd4c779f3b98faa2b056584dccd0363d05ed8464dd897289ead6cc15a

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