Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'link-cumload-plugin' into 'master'
[simgrid.git] / examples / s4u / plugin-link-cumload / s4u-plugin-link-cumload.cpp
1 /* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "simgrid/s4u.hpp"
7 #include "simgrid/plugins/load.h"
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
10
11 static void sender(const std::string & mailbox, uint64_t msg_size)
12 {
13     auto mbox = simgrid::s4u::Mailbox::by_name(mailbox);
14     mbox->put((void*)1, msg_size);
15 }
16
17 static void receiver(const std::string & mailbox)
18 {
19     auto mbox = simgrid::s4u::Mailbox::by_name(mailbox);
20     mbox->get();
21 }
22
23 static void run_transfer(simgrid::s4u::Host* src_host, simgrid::s4u::Host* dst_host,
24     const std::string & mailbox, uint64_t msg_size)
25 {
26     XBT_INFO("Launching the transfer of %lu bytes", msg_size);
27     simgrid::s4u::Actor::create("sender", src_host, sender, mailbox, msg_size);
28     simgrid::s4u::Actor::create("receiver", dst_host, receiver, mailbox);
29 }
30
31 static void execute_load_test()
32 {
33   auto host0 = simgrid::s4u::Host::by_name("node-0.simgrid.org");
34   auto host1 = simgrid::s4u::Host::by_name("node-1.simgrid.org");
35
36   simgrid::s4u::this_actor::sleep_for(1);
37   run_transfer(host0, host1, "1", 1000*1000*1000);
38
39   simgrid::s4u::this_actor::sleep_for(10);
40   run_transfer(host0, host1, "2", 1000*1000*1000);
41   simgrid::s4u::this_actor::sleep_for(3);
42   run_transfer(host0, host1, "3", 1000*1000*1000);
43 }
44
45 static void show_link_load(const std::string & link_name, const simgrid::s4u::Link* link)
46 {
47     XBT_INFO("%s link load (cum, avg, min, max): (%g, %g, %g, %g)", link_name.c_str(),
48         sg_link_get_cum_load(link),
49         sg_link_get_avg_load(link),
50         sg_link_get_min_instantaneous_load(link),
51         sg_link_get_max_instantaneous_load(link)
52     );
53 }
54
55 static void monitor()
56 {
57     auto link_backbone = simgrid::s4u::Link::by_name("cluster0_backbone");
58     auto link_host0 = simgrid::s4u::Link::by_name("cluster0_link_0_UP");
59     auto link_host1 = simgrid::s4u::Link::by_name("cluster0_link_1_DOWN");
60
61     XBT_INFO("Tracking desired links");
62     sg_link_cumload_track(link_backbone);
63     sg_link_cumload_track(link_host0);
64     sg_link_cumload_track(link_host1);
65
66     show_link_load("Backbone", link_backbone);
67     while (simgrid::s4u::Engine::get_clock() < 5)
68     {
69         simgrid::s4u::this_actor::sleep_for(1);
70         show_link_load("Backbone", link_backbone);
71     }
72
73     XBT_INFO("Untracking the backbone link");
74     sg_link_cumload_untrack(link_backbone);
75
76     show_link_load("Host0_UP", link_host0);
77     show_link_load("Host1_UP", link_host1);
78
79     XBT_INFO("Now resetting and probing host links each second.");
80
81     while (simgrid::s4u::Engine::get_clock() < 29)
82     {
83         sg_link_cumload_reset(link_host0);
84         sg_link_cumload_reset(link_host1);
85
86         simgrid::s4u::this_actor::sleep_for(1);
87
88         show_link_load("Host0_UP", link_host0);
89         show_link_load("Host1_UP", link_host1);
90     }
91 }
92
93 int main(int argc, char* argv[])
94 {
95   simgrid::s4u::Engine e(&argc, argv);
96   sg_link_cumload_plugin_init();
97
98   xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s ../platforms/energy_platform.xml\n", argv[0], argv[0]);
99   e.load_platform(argv[1]);
100
101   simgrid::s4u::Actor::create("load_test", simgrid::s4u::Host::by_name("node-42.simgrid.org"), execute_load_test);
102   simgrid::s4u::Actor::create("monitor", simgrid::s4u::Host::by_name("node-51.simgrid.org"), monitor);
103
104   e.run();
105
106   XBT_INFO("Total simulation time: %.2f", simgrid::s4u::Engine::get_clock());
107
108   return 0;
109 }