Starting from version 1.0.0, the qnetworks toolbox has
been renamed to queueing toolbox and is included in Octave-Forge. This has many
benefits for the users. Installation is much easier: you can type
pkg install -forge queueing at the Octave prompt to
install the package without the need to download anything by
hand. Moreover, all new development happens on the Octave-Forge SVN
repository on SourceForge, so developers can always get the
newest/greatest version of the queueing toolbox without
waiting for an official stable release.
The queueing toolbox is a software package for Markov
chains and queueing networks analysis written in GNU Octave. At the
moment the toolbox includes the following algorithms:
The queueing toolbox requires some knowledge of
queueing network theory; furthermore, it (currently) does not include
a GUI for interactively draw queueing networks. See the additional Resources below for a (non
comprehensive) list of alternatives to queueing.
The queueing toolbox is under active
development. New versions are released frequently, and both the code
and the documentation are being corrected.
queueing is released WITHOUT ANY WARRANTY, see the file
COPYING for details.
I developed the queueing package to support my own
research, and I am releasing the code in the hope it may be useful to
others too. If you use queueing for teaching or research
purposes, I would very much like to hear about your experience with
it. If you use queueing for research, please cite the
following publication:
Note that there is no binary distribution, as
queueing is entirely implemented as Octave scripts;
therefore, queueing should run on any system where GNU
Octave has been ported.
queueing is released under the GNU General Public
License, version 3 or later. See the file COPYING for details; this file is also included in
the software distribution.
The manual is available in the following formats:
To install queueing, download the tarball above and
use the pkg install Octave command. Start GNU Octave (on
certain systems you might need to start Octave as root in order to
gain write access to the site-wide package installation directory),
and type the following at the prompt:
pkg install queueing-1.0.0.tar.gz
Alternatively, you can unpack the tarball above and copy all
.m files from the inst/ directory to a
location where Octave can find them. You can start Octave with the
-p path option to tell it to add path
to its search path, so that it will find the functions automatically
without the need to move them:
octave -p /path/to/queueing/inst
Please refer to the documentation for
the list of functions provided by queueing.
The documentation for each function can be accessed from the Octave
prompt with the help command. For example, you can get the
documentation for function qnclosed with the command:
help qnclosed
Also, most of the functions have inline tests and demos. Tests are
used to check the correctness of the results, while demos provide
snippets of code which demonstrates how the function can be used.
For example, to show and execute the demos for qnclosed,
type the following command:
demo qnclosed
In this section we give some basic usage example for
queueing. Refer to the documentation for more examples.
Suppose that we want to analyze the following closed network:
The routing probabilities are shown in the picture. To analyze this
network we use the qnclosed() function. This function has
the following signature:
[U, R, Q, X] = qnclosed (N, S, V, ...)
where N is the number of requests in the (closed)
network, S and V are arrays such that
S(k) is the service time at center k, and
V(k) is the visit count at center
k. The visit counts V for a closed network
satisfy the equality V*P == V with the additional
constraint V(1) == 1. V can be computed from
the routing probability matrix P using the
qnvisits function, as follows:
P = [0 0.3 0.7; 1 0 0; 1 0 0]; V = qnvisits(P)
V = 1.00000 0.30000 0.70000
Let us suppose that there are N=10 requests in the
system. We let the average service times be S = [1 2 0.8].
We analyze the network as follows:
N = 10; S = [1 2 0.8]; P = [0 0.3 0.7; 1 0 0; 1 0 0]; V = qnvisits(P); [U R Q X] = qnclosed( N, S, V )
U = 0.99139 0.59483 0.55518 R = 7.4360 4.7531 1.7500 Q = 7.3719 1.4136 1.2144 X = 0.99139 0.29742 0.69397
where U is the vector of per-node utilizations,
R is the vector of per-node response times,
Q is the vector of average queue lengths and
X is the vector of throughputs. Thus, the utilization of
service center 1 is U(1)==0.99139, which is very close to
1.0. We can conclude that the service center 1 is the bottleneck
device.
Analyzing open networks is very similar. Consider the open network shown in Fig. 2
Assume that the average service times are as in the previous
example (S = [1 2 0.8]). Furthermore, assume an external
arrival rate of 0.3 requests/s to center 1, and no external arrivals
to other centers.
Again, we need first to compute the visit counts. The function
qnvisits can be used to compute the visit counts as in
the previous example, but in this case we need to pass the vector of
external arrival rates as an additional parameter. The vector of
external arrival rates is lambda = [0.3 0 0]. Thus, we
can issue the following Octave commands:
P = [0 0.3 0.5; 1 0 0; 1 0 0]; lambda = [0.15 0 0]; V = qnvisits(P,lambda)
V = 5.0000 1.5000 2.5000
We might also verify that the external arrival rate is less than the processing capacity of the network, which by definition is the inverse of the maximum service demand:
S = [1 2 0.8]; D = V .* S
D = 5.0000 3.0000 2.0000
1/max(D)
ans = 0.20000
sum(lambda)
ans = 0.15000
Since sum(lambda) < 1/max(D), it is possible to
analyze the steady-state behavior of the network. We use the
qnopen function to compute the results of interest:
[U R Q X] = qnopen( sum(lambda), S, V )
U = 0.75000 0.45000 0.30000 R = 4.0000 3.6364 1.1429 Q = 3.00000 0.81818 0.42857 X = 0.75000 0.22500 0.37500
Since the queueing network shown in Fig. 2 is a Jackson Network, you can also use the
qnjackson function to compute the exact same results
using the routing probability matrix P directly.
[U R Q X] = qnjackson(lambda, S, P)
U = 0.75000 0.45000 0.30000 R = 4.0000 3.6364 1.1429 Q = 3.00000 0.81818 0.42857 X = 0.75000 0.22500 0.37500
Finally, let us see a more complete example. The following is
embedded as a demo function of the qnclosed.m
source file, and you can execute it by issuing this command at the
Octave prompt:
demo("qnclosed.m");
In this demo we want to compute the bounds on the system throughput
for the network in Fig. 3, which
is very similar to the one of Fig. 1, with the only addition of an external
think time. We are going to use the qnclosedab
and qnclosedbsb functions, to compute the bounds on the
system throughput for increasing values of the population size N, and
compare the results with the exact throughput provided by the MVA algorithm.
P = [0 0.3 0.7; 1 0 0; 1 0 0]; # Transition probability matrix
S = [1 0.6 0.2]; # Average service times
m = ones(1,3); # All centers are single-server
Z = 2; # External delay
Nmax = 15; # Maximum population to consider
V = qnvisits(P); # Compute number of visits from P
D = V .* S; # Compute service demand from S and V
X_bsb_lower = X_bsb_upper = zeros(1,Nmax);
X_ab_lower = X_ab_upper = zeros(1,Nmax);
X_mva = zeros(1,Nmax);
for n=1:Nmax
[X_bsb_lower(n) X_bsb_upper(n)] = qnclosedbsb(n, D, Z);
[X_ab_lower(n) X_ab_upper(n)] = qnclosedab(n, D, Z);
[U R Q X] = qnclosed( n, S, V, m, Z );
X_mva(n) = X(1)/V(1);
endfor
close all;
plot(1:Nmax, X_ab_lower,"g;Asymptotic Bounds;", \
1:Nmax, X_bsb_lower,"k;Balanced System Bounds;", \
1:Nmax, X_mva,"b;MVA;", "linewidth", 2, \
1:Nmax, X_bsb_upper,"k", \
1:Nmax, X_ab_upper,"g" );
title("MVA vs Balanced System Bounds");
axis([1,Nmax,0,1]);
xlabel("Request Population Size N");
ylabel("System Throughput X(N)");
legend("location","southeast");
The result is shown in Fig. 4.
Fig. 4: Balanced System Bounds and Asymptotic Bounds on the system throughput X(N) as a function of the population size N for the three-node, closed network in Fig. 3.
Finally, starting from version 0.8.0 of queueing,
there are a couple of functions which facilitate the definition and
analysis of QN models. These functions are qnmknode and
qnsolve. The first one is used to create appropriate data
structures describing certain kind of QN nodes; the second one is used
to analyze a model represented by those data structures. It should be
observed that qnsolve (re)implements the same algorithms
used by other functions such as qnopensingle,
qnclosedsingle and so on; only the input parameters are
different.
Consider again the closed network shown in Fig. 3. Using the new functions, the network can be described and analyzed as follows:
P = [0 0.3 0.7; 1 0 0; 1 0 0];
V = qnvisits(P);
QQ = { qnmknode("m/m/m-fcfs", 1), \
qnmknode("m/m/m-fcfs", 0.6), \
qnmknode("m/m/m-fcfs", 0.2) };
Z = 2; # external delay
N = 10; # population
[U R Q X] = qnsolve("closed", N, QQ, V, Z);
The qnmknode function can be used to instantiate
different kind of nodes (see the documentation for details). If can
also be used to create multi-class nodes, or general load-dependent
nodes, which can be analyzed with qnsolve. Again, see the
documentation for details.
The software can be improved in many ways:
MQNA is a software tool to model and obtain the stationary solution of a large class of Queueing Networks. It can directly solve open and closed product-form queueing networks using classic algorithms. For finite capacity queueing models, MQNA generates Markovian description in Stochastic Automata Networks (SAN) and Stochastic Petri Nets (SPN) formalisms.