Tutorial 4: Round-Robin Load Balancing
This example considers a system of two parallel processor-sharing queues and studies the effect of load-balancing on the average performance of an open class of jobs. A Router node controls the routing using different strategies (random, round-robin).
% Example 4: Round robin load balancing
model = Network('RRLB');
source = Source(model, 'Source');
lb = Router(model, 'LB');
queue1 = Queue(model, 'Queue1', SchedStrategy.PS);
queue2 = Queue(model, 'Queue2', SchedStrategy.PS);
sink = Sink(model, 'Sink');
oclass = OpenClass(model, 'Class1');
source.setArrival(oclass, Exp(1));
queue1.setService(oclass, Exp(2));
queue2.setService(oclass, Exp(2));
model.addLink(source, lb);
model.addLink(lb, queue1);
model.addLink(lb, queue2);
model.addLink(queue1, sink);
model.addLink(queue2, sink);
lb.setRouting(oclass, RoutingStrategy.RAND);
ldesAvgTable = LDES(model,'seed',23000,'samples',10000).avgTable()
lb.setRouting(oclass, RoutingStrategy.RROBIN);
model.reset();
ldesAvgTableRR = LDES(model,'seed',23000,'samples',10000).avgTable()
from line_solver import *
model = Network('RRLB')
source = Source(model, 'Source')
lb = Router(model, 'LB')
queue1 = Queue(model, 'Queue1', SchedStrategy.PS)
queue2 = Queue(model, 'Queue2', SchedStrategy.PS)
sink = Sink(model, 'Sink')
oclass = OpenClass(model, 'Class1')
source.set_arrival(oclass, Exp(1))
queue1.set_service(oclass, Exp(2))
queue2.set_service(oclass, Exp(2))
model.add_link(source, lb)
model.add_link(lb, queue1)
model.add_link(lb, queue2)
model.add_link(queue1, sink)
model.add_link(queue2, sink)
lb.set_routing(oclass, RoutingStrategy.RAND)
ldesAvgTable = LDES(model, seed=23000, samples=10000).avg_table()
model.reset()
lb.set_routing(oclass, RoutingStrategy.RROBIN)
ldesAvgTableRR = LDES(model, seed=23000, samples=10000).avg_table()
import jline.lang.constant.RoutingStrategy;
import jline.lang.nodes.Node;
import jline.lang.nodes.Router;
import jline.solvers.ldes.LDES;
Network model = new Network("RRLB");
Source source = new Source(model, "Source");
Router lb = new Router(model, "LB");
Queue queue1 = new Queue(model, "Queue1", SchedStrategy.PS);
Queue queue2 = new Queue(model, "Queue2", SchedStrategy.PS);
Sink sink = new Sink(model, "Sink");
OpenClass jobclass = new OpenClass(model, "Class1");
source.setArrival(jobclass, new Exp(1.0));
queue1.setService(jobclass, new Exp(2.0));
queue2.setService(jobclass, new Exp(2.0));
model.addLinks(new Node[][]{{source, lb}, {lb, queue1}, {lb, queue2},
{queue1, sink}, {queue2, sink}});
lb.setRouting(jobclass, RoutingStrategy.RAND);
new LDES(model, "seed", 23000, "samples", 10000).avgTable().print();
model.reset();
lb.setRouting(jobclass, RoutingStrategy.RROBIN);
new LDES(model, "seed", 23000, "samples", 10000).avgTable().print();
#include "line/solvers/wrappers/ldes/solver_ldes.h"
Network model("RRLB");
Source source(model, "Source");
Router lb(model, "LB");
Queue queue1(model, "Queue1", SchedStrategy::PS);
Queue queue2(model, "Queue2", SchedStrategy::PS);
Sink sink(model, "Sink");
OpenClass jobclass(model, "Class1");
source.set_arrival(jobclass, Exp(1.0));
queue1.set_service(jobclass, Exp(2.0));
queue2.set_service(jobclass, Exp(2.0));
Routing P;
P.set(source, lb, 1.0);
P.set(lb, queue1, 0.5);
P.set(lb, queue2, 0.5);
P.set(queue1, sink, 1.0);
P.set(queue2, sink, 1.0);
model.link(P);
// Change the router from the default random split to round-robin.
model.set_routing(lb, jobclass, RoutingStrategy::RROBIN);
// Solve with the LDES client: only a simulator tells the two policies apart.
ldes::LdesOptions options;
options.seed = 23000;
options.samples = 10000;
const ldes::LdesResult result =
ldes::solver_ldes(model.get_struct(), options);
Expected Output (Random Routing)
ldesAvgTable =
Station JobClass QLen Util RespT ResidT ArvR Tput
_______ ________ _______ _______ _______ _______ _______ _______
Source Class1 0 0 0 0 0 1
Queue1 Class1 0.32106 0.24457 0.65206 0.32603 0.49285 0.49236
Queue2 Class1 0.31951 0.24333 0.63701 0.31851 0.50201 0.50151
Expected Output (Round-Robin Routing)
ldesAvgTableRR =
Station JobClass QLen Util RespT ResidT ArvR Tput
_______ ________ _______ _______ _______ _______ _______ ______
Source Class1 0 0 0 0 0 1
Queue1 Class1 0.28284 0.24697 0.5691 0.28455 0.49749 0.4969
Queue2 Class1 0.27521 0.2408 0.55377 0.27689 0.49739 0.4969