You are in: Home > Software > qnetworks

qnetworks—a Queueing Networks analysis package for GNU Octave

[ About qnetworks | Download and Installation | Usage examples | Todo | Resources ]

About qnetworks

qnetworks is a Queueing Networks analysis package written in GNU Octave. It includes implementations of some QN algorithms. At the moment, the following algorithms are available:

qnetworks is released under the GNU General Public License, version 3 or later.

Please note that qnetworks is under active development. New versions are released frequently, and both the code and the documentation are being corrected.

Download and Installation

Please note: qnetworks version 0.8.2.2 fixes a serious bug which was introduced in version 0.8.2.1 which resulted in many internal tests failing. Please update to the latest version as soon as possible.

qnetworks downloads
Description Size (bytes) Date updated
qnetworks-0.8.2.2.tar.gz 483669 February 02 2010
qnetworks documentation (PDF format) 420804 February 02 2010
qnetworks documentation (HTML format) 233013 February 02 2010

Download qnetworks-0.8.2.2.tar.gz, unpack it somewhere and copy all .m files from the inst/ directory to a location where Octave can find them. You can also 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/qnetworks/inst

Alternatively, you can use the pkg install Octave command to install the tarball directly. Start GNU Octave, and at the prompt type the following command:

pkg install qnetworks-0.8.2.2.tar.gz

For the list of functions provided by the qnetworks package, please see the package documentation, which is available in pdf and html format. The user manual can be automatically generated from the source files by issuing the make command from the top level directory.

The documentation for each function can also be accessed from the Octave prompt using the help Octave command. For example, you can get the documentation for qnclosedmultimva by issuing this command at the Octave prompt:

help qnclosedmultimva

Moreover, most of the functions have inline test and demo functions. Test functions can be used to check the correctness of the computed results on some test cases, while demo functions provide snippets of code which demonstrates how the functions can be used. See the test and demo Octave commands for more information.

Usage examples

Suppose that we want to analyze the following closed network:

Three-nodes Central Server Closed Queueing Network Model

Fig. 1: Three-nodes Central Server Queueing Network Model (closed network)

The routing probabilities are shown in the picture. To analyze this network we use the qnclose function. This function requires the visit counts (average number of visits) for each node as one of its parameters. The visit count can be computed from the routing matrix 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

The visit counts V for a closed network satisfy the equality V*P == V with the additional constraint V(1) == 1.

Now, let us suppose that there are N=10 requests in the system. We let the average service times S = [1 2 0.8]. To analyze the network we use the following commands:

N = 10; S = [1 2 0.8]; V = [1 0.3 0.7]; [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 lenghts and X is the vector of thorughputs. 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

Three-nodes Central Server Open Queueing Network Model

Fig. 2: Three-nodes Central Server Queueing Network Model (Open network)

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");
Three-nodes Central Server Closed Queueing Model, with terminals

Fig. 3: Three-nodes Central Server Queueing Model (Closed network), with terminals

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]; V = qnvisits(P); S = [1 0.6 0.2]; m = ones(1,3); Z = 2; D = V .* S; Nmax = 15; X_bsb_lower = zeros(1,Nmax); X_bsb_upper = zeros(1,Nmax); X_ab_lower = zeros(1,Nmax); 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_bsb_lower,"k"); hold on; plot(X_ab_lower,"g"); plot(1:Nmax, X_mva,"b"); plot(1:Nmax, X_bsb_upper,"k"); plot(X_ab_upper,"g"); title("MVA vs Bounds"); axis([0,Nmax,0,1]); xlabel("Request Population Size N"); ylabel("System Throughput X(N)"); legend({"Balanced System Bound", "Asymptotic Bound", "MVA"}, "location", "southeast");

The results are shown in Fig. 4.

Bounds for the three-nodes closed network

Fig. 4: Balanced Systems 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 qnetworks, 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.

TODO

The software can be improved in many ways:

Resources

This page validates as XHTML 1.0 strict This page validates as CSS Check the accessibility of this page with WAVE
This page was last updated on February 02 2010