Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Network topology model #75

Merged
merged 6 commits into from
Aug 15, 2022
Merged

Network topology model #75

merged 6 commits into from
Aug 15, 2022

Conversation

ZeDRoman
Copy link
Collaborator

No description provided.


// Calculate transfer bandwidths
let mut assigned = vec![false; paths.len()];
for _ in 0..paths.len() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут мы каждый раз мы выбираем путь с минимальным bandwidth. Это то же самое, что выбрать линк с минимальным отношением bandwidth/connections_amount и тогда любой путь, проходящий через этот линк, будет иметь минимальный bandwidth. При этом можно поддерживать множество линков, отсортированных по этому отношению, и обновлять их вдоль нового пути. Тогда итоговая асимптотика вроде получается О(суммарная длина всех путей * логарифм из-за поддержки отсортированного множества линков).
И еще можно заметить, что при добавлении нового пути эти отношения для линков только увеличиваются, поэтому когда мы нашли линк с минимальным отношением, можно строить не один случайный путь через него, а сразу все, но возможно это только усложнит реализацию без улучшения асимптотики.

Можно еще неасимптотически пооптимизировать. Например, допустим, что у нас полный граф, то есть между каждыми двумя хостами есть линк. Тогда хотелось бы, чтобы при добавлении передачи обновлялись только текущие передачи на этом линке, а не везде. В общем виде это можно сделать так -- на каждом линке запомнить множество путей через него, а при добавлении нового пути посмотреть на все линки и на пути в них, потом для всех полученных путей аналогично пройти по линкам и добавить пути с этих линков и т.д. Другими словами, найти компоненту связности в графе путей, где пути связаны когда они пересекаются. И потом пересчитывать все только для этой компоненты. Это, конечно, ничем не поможет, когда все пути проходят через какой-то один линк, но в каких-то случаях может сильно ускорить все.

crates/network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/network/src/topology_resolver.rs Outdated Show resolved Hide resolved
crates/network/src/topology_resolver.rs Outdated Show resolved Hide resolved
examples/network_topology/src/main.rs Outdated Show resolved Hide resolved
examples/network_topology/src/main.rs Outdated Show resolved Hide resolved
examples/network_topology/src/main.rs Outdated Show resolved Hide resolved
crates/network/src/topology.rs Outdated Show resolved Hide resolved
crates/network/src/topology.rs Outdated Show resolved Hide resolved
crates/network/src/topology.rs Outdated Show resolved Hide resolved
crates/network/src/topology.rs Outdated Show resolved Hide resolved
crates/network/src/topology.rs Outdated Show resolved Hide resolved
examples/network-topology/src/main.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology.rs Outdated Show resolved Hide resolved
examples/network-topology/Cargo.toml Show resolved Hide resolved
examples/network-topology/src/main.rs Outdated Show resolved Hide resolved
examples/network-topology/src/main.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Show resolved Hide resolved
@ZeDRoman ZeDRoman force-pushed the network-topology-model branch 2 times, most recently from d5de47d to 6a363c3 Compare July 23, 2022 21:32
crates/dslab-network/src/network.rs Outdated Show resolved Hide resolved
examples/network-topology/src/main.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology.rs Outdated Show resolved Hide resolved
crates/network/src/topology_resolver.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_resolver.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_model.rs Outdated Show resolved Hide resolved
crates/dslab-network/src/topology_resolver.rs Outdated Show resolved Hide resolved
@osukhoroslov
Copy link
Owner

osukhoroslov commented Jul 25, 2022

Попробовал перенести master-workers на TopologyNetwork и задать топологию звезда так:

    let mut topology = Topology::new();
    // network nodes
    for i in 0..host_count {
        topology.add_node(&format!("host{}", i), local_bandwidth as f64, local_latency);
    }
    topology.add_node("switch", local_bandwidth as f64, local_latency);
    // network links
    for i in 0..host_count {
        topology.add_link(&format!("host{}", i), "switch", network_latency, network_bandwidth as f64);
    }
    // init topology
    topology.init();

    let topology_rc = rc!(refcell!(topology));
    let network_model = rc!(refcell!(TopologyNetwork::new(topology_rc.clone())));
    let network =  rc!(refcell!(Network::new_with_topology(network_model, topology_rc.clone(), sim.create_context("net"))));
    sim.add_handler("net", network.clone());
    let hosts = network.borrow().get_nodes();

С новой моделью время сильно выросло в сравнении с SharedBandwidthNetwork:

  • 100 hosts, 10000 tasks: было 0.13s, стало 3.64s
  • 1000 hosts, 10000 tasks: было 0.16s, стало 57.37s

С Дейкстрой результаты примерно такие же.

Надо понять, где тратится время, и попробовать заоптимизировать.

@maksim1744 maksim1744 self-requested a review August 1, 2022 15:43
maksim1744
maksim1744 approved these changes Aug 1, 2022
Copy link
Collaborator

@maksim1744 maksim1744 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Осталась еще оптимизация из второго абзаца первого комментария, но не факт что она сильно ускорит в общем случае, можно пока на будущее оставить.

Add FloydWarshall algorithm to resolve network topology
It is turned on by default
It performs much faster than previous Dijkstra algo
@ZeDRoman ZeDRoman merged commit 9525a90 into main Aug 15, 2022
@osukhoroslov osukhoroslov deleted the network-topology-model branch November 14, 2022 15:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants