MVA (Mean Value Analysis)

The MVA solver implements both exact and approximate mean value analysis algorithms for product-form queueing networks. The default method uses Linearizer for approximate MVA, with support for extended queueing features including non-exponential service times, multi-servers, non-preemptive priorities, and fork-join networks.

MethodAlgorithmReference
defaultAutomatic method selection
exactExact mean value analysis[1]
bsBard-Schweitzer approximate MVA[3]
linLinearizer approximate MVA[2]
gflinGeneralized Fritzson-Liskiewicz Linearizer
egflinExtended generalized Fritzson-Liskiewicz Linearizer
qdQueue-dependent approximate MVA[4]
qdlinQueue-dependent Linearizer
qliQueue-Linearizer iteration
fliFritzson-Liskiewicz iteration
schmidtSchmidt approximation
schmidt-extExtended Schmidt approximation
abAsymptotic bounds approximation
qnaQueuing Network Analyzer
sqniSingle-server queue approximation iteration
aba.upper/aba.lowerAsymptotic bound analysis[3]
bjb.upper/bjb.lowerBalanced job bounds[5]
gb.upper/gb.lowerGeometric square-root bounds[5]
pb.upper/pb.lowerProportional bounds[5]
sb.upper/sb.lowerSimple bounds[6]

Example

This example demonstrates solving a simple M/M/1 queue using the MVA solver. The queue has an arrival rate of 0.9 jobs/sec and a service rate of 1.0 jobs/sec.

% Create a simple M/M/1 queue
model = Network('M/M/1 Example');
source = Source(model, 'Source');
queue = Queue(model, 'Queue1', SchedStrategy.FCFS);
sink = Sink(model, 'Sink');

jobclass = OpenClass(model, 'Class1');
source.setArrival(jobclass, Exp(0.9));
queue.setService(jobclass, Exp(1.0));

model.link(Network.serialRouting(source, queue, sink));

% Solve with MVA and display average performance metrics
MVA(model).avgTable()

Output:

MVA analysis [method: default, lang: matlab] completed in 0.004175s.

ans =
  2×8 table
    Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
    _______    ________    ____    ____    _____    ______    ____    ____
    Source      Class1      0        0       0         0        0     0.9
    Queue1      Class1      9      0.9      10        10      0.9     0.9 
import jline.lang.*;
import jline.lang.constant.SchedStrategy;
import jline.lang.nodes.*;
import jline.lang.processes.Exp;
import jline.solvers.NetworkAvgTable;
import jline.solvers.mva.MVA;

public class MVAExample {
    public static void main(String[] args) {
        // Create a simple M/M/1 queue
        Network model = new Network("M/M/1 Example");

        Source source = new Source(model, "Source");
        Queue queue = new Queue(model, "Queue1", SchedStrategy.FCFS);
        Sink sink = new Sink(model, "Sink");

        OpenClass jobclass = new OpenClass(model, "Class1");
        source.setArrival(jobclass, Exp.fitRate(0.9));
        queue.setService(jobclass, Exp.fitRate(1.0));

        model.link(Network.serialRouting(source, queue, sink));

        // Solve with MVA and display average performance metrics
        System.out.println(new MVA(model).avgTable);
    }
}

Output:

MVA analysis [method: default, lang: java] completed.

Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
Source     Class1      0.0     0.0     0.0      0.0       0.0     0.9
Queue1     Class1      9.0     0.9     10.0     10.0      0.9     0.9
from line_solver import *

# Create a simple M/M/1 queue
model = Network('M/M/1 Example')

source = Source(model, 'Source')
queue = Queue(model, 'Queue1', SchedStrategy.FCFS)
sink = Sink(model, 'Sink')

jobclass = OpenClass(model, 'Class1')
source.setArrival(jobclass, Exp(0.9))
queue.setService(jobclass, Exp(1.0))

model.link(Network.serialRouting(source, queue, sink))

# Solve with MVA and display average performance metrics
print(MVA(model).avg_table)

Output:

MVA analysis [method: default, lang: python] completed.

  Station  JobClass  QLen  Util  RespT  ResidT  ArvR  Tput
0  Source    Class1   0.0   0.0    0.0     0.0   0.0   0.9
1  Queue1    Class1   9.0   0.9   10.0    10.0   0.9   0.9

References

  1. Reiser, M., & Lavenberg, S. S. (1980). Mean-value analysis of closed multichain queuing networks. Journal of the ACM, 27(2), 313-322.
  2. Chandy, K. M., & Neuse, D. (1982). Linearizer: a heuristic algorithm for queueing network models. Communications of the ACM, 25(2), 126-134.
  3. Bolch, G., Greiner, S., de Meer, H., & Trivedi, K. S. (2006). Queueing Networks and Markov Chains (2nd ed.). Wiley-Interscience.
  4. Casale, G., Pérez, J. F., & Wang, W. (2015). Deconvolving system load from queue length snapshots. ACM SIGMETRICS, 159-171.
  5. Casale, G., Muntz, R. R., & Serazzi, G. (2008). Geometric bounds on queueing systems. IEEE Transactions on Computers, 57(4), 508-521.
  6. Harel, A., Namn, S. M., & Sturm, R. (1999). Performance and reliability of communication networks. Kluwer Academic Publishers.