1function [estVal, fObjFun] = estimator_ubo(self,
nodes)
2% UBO Utilization-based optimization
3% This demand estimator
is based on the method proposed in:
5% Liu, Z., Wynter, L., Xia, C. H. and Zhang, F.
6% Parameter inference of queueing models
for IT systems
using end-to-end measurements
7% Performance Evaluation, Elsevier, 2006.
9% Implements the single-experiment QP formulation (Eq. 9-13, Section 4.2)
10% applied as a Bundle over all experiments (Single-QP, Section 4.3).
12% Copyright (c) 2012-2026, Imperial College London
14% This code
is released under the 3-Clause BSD License.
16sn = self.model.getStruct;
18%% Collect measurements
19for n = 1:size(
nodes, 2)
21 if isfinite(node.getNumberOfServers())
22 U = self.getAggrUtil(node);
24 avgU{n} = U.data * node.getNumberOfServers();
29 avgArvR{n, r} = self.getArvR(node, self.model.classes{r});
30 if isempty(avgArvR{n, r})
31 error(
'Arrival rate data for node %d in class %d is missing.', self.model.getNodeIndex(node), r);
33 avgArvR{n, r} = avgArvR{n, r}.data;
35 avgRespT{n, r} = self.getRespT(node, self.model.classes{r});
36 if isempty(avgRespT{n, r})
37 error(
'Response time data for node %d in class %d is missing.', self.model.getNodeIndex(node), r);
39 avgRespT{n, r} = avgRespT{n, r}.data;
45 avgA = cell2mat(avgArvR);
46 avgA = reshape(avgA, size(avgA,1)/size(avgArvR, 1), size(avgArvR, 1), sn.nclasses);
47 avgR = cell2mat(avgRespT);
48 avgR = reshape(avgR, size(avgR,1)/size(avgRespT, 1), size(avgRespT, 1), sn.nclasses);
49 avgU = cell2mat(avgU);
52 case 'MATLAB:catenate:dimensionMismatch'
53 error(
'Sampled metrics have different number of samples, use interpolate() before starting this estimation algorithm.');
57[estVal, fObjFun] = ubo_qp(avgU, avgR, avgA);
60function [demEst, fObjFun] = ubo_qp(cpuUtil, rAvgTimes, avgArvR)
61% Solves the UBO demand estimation as a quadratic program following
62% Liu et al. 2006, Eq. 9-13 (single experiment) applied as Bundle QP
63% (Section 4.3) over all experiments.
66% cpuUtil: N x M - measured aggregate utilization per station
67% rAvgTimes: N x M x R - measured per-station response times
68% avgArvR: N x M x R - measured arrival rates per station per
class
70% The QP minimizes (Eq. 9):
71% sum_j w_j * delta_j^2 + sum_i epsilon_i^2
73% delta_j = E_j^e - E_j^m (end-to-end delay error, Eq. 12)
74% epsilon_i = rho_i^e - rho_i^m (utilization error, Eq. 11)
75% w_j = lambda_j / sum(lambda) (class weights)
76% subject to s_ji >= 0 (Eq. 13)
79a = sum(isnan(cpuUtil), 2);
81 cpuUtil = cpuUtil(a == 0, :);
82 rAvgTimes = rAvgTimes(a == 0, :, :);
83 avgArvR = avgArvR(a == 0, :, :);
86a = sum(sum(avgArvR, 3), 2) == 0;
88 cpuUtil = cpuUtil(a == 0, :);
89 rAvgTimes = rAvgTimes(a == 0, :, :);
90 avgArvR = avgArvR(a == 0, :, :);
93N = size(cpuUtil, 1); % number of experiments
94M = size(cpuUtil, 2); % number of stations (I in paper)
95R = size(rAvgTimes, 3); % number of
classes (J in paper)
98%% Build Bundle QP by summing over experiments
99% Variables: s_vec of length MR, where s_vec((r-1)*M + i) = s_{ir}
101% For each experiment n:
102% beta_i^n = 1/(1 - rho_i^n) (p.45)
103% E_r^n = sum_i R_{ir}^n (end-to-end delay, Eq. 7 with v=1)
104% w_r^n = lambda_r^n / sum_r lambda_r^n (Eq. 9)
105% delta_r = sum_i s_{ir} * beta_i^n - E_r^n (Eq. 12)
106% epsilon_i = sum_r lambda_{ir}^n * s_{ir} - rho_i^n (Eq. 11)
108% QP: min (1/2) s^T H s + h^T s + const
115 rho_n = cpuUtil(n, :); % 1 x M
116 beta_n = 1 ./ (1 - rho_n); % 1 x M
118 % Per-station arrival rates and response times for this experiment
120 lambda_n = avgArvR(n, 1, 1); % scalar
121 R_n = rAvgTimes(n, 1, 1); % scalar
123 lambda_n = reshape(avgArvR(n, 1, :), 1, R); % 1 x R
124 R_n = reshape(rAvgTimes(n, 1, :), 1, R); % 1 x R
126 lambda_n = reshape(avgArvR(n, :, :), M, R); % M x R
127 R_n = reshape(rAvgTimes(n, :, :), M, R); % M x R
130 % Class weights w_r = lambda_r / sum(lambda) (Eq. 9)
131 % lambda_r = total arrival rate for class r (sum over stations for multi-station)
132 lambda_r = sum(lambda_n, 1); % 1 x R
133 w_n = lambda_r / sum(lambda_r); % 1 x R
135 % End-to-end delay: E_r = sum_i R_{ir} (Eq. 7, assuming v=1)
136 E_n = sum(R_n, 1); % 1 x R
138 % Build A_delta: R x MR (Eq. 7)
139 % Row r has beta_i at column (r-1)*M + i
140 A_delta = zeros(R, MR);
142 A_delta(r, (r-1)*M + (1:M)) = beta_n;
145 % Build A_epsilon: M x MR (Eq. 8)
146 % Row i has lambda_{ir} at column (r-1)*M + i
147 A_eps = zeros(M, MR);
150 A_eps(i, (r-1)*M + i) = lambda_n(i, r);
156 % Accumulate QP matrices (Bundle, Section 4.3)
157 % H^n = 2(A_delta^T W A_delta + A_eps^T A_eps)
158 H = H + 2 * (A_delta
' * W_n * A_delta + A_eps' * A_eps);
159 % h^n = -2(A_delta^T W E^m + A_eps^T rho^m)
160 h = h - 2 * (A_delta
' * W_n * E_n' + A_eps
' * rho_n');
163%% Solve QP: min (1/2) s^T H s + h^T s, s.t. s >= 0 (Eq. 13-17)
165opts = optimoptions('quadprog', 'Display', 'off');
166[s_vec, fObjFun] = quadprog(H, h, [], [], [], [], lb, [], [], opts);
169demEst = reshape(s_vec, M, R);