4.2 El algoritmo de gesti´ on din´ amica del nivel de multiprogramaci´ on
4.2.2 Algoritmo basado en la carga del sistema
El segundo algoritmo desarrollado para el control del tama˜no del pool de conexiones considera la carga del sistema en cada instante a partir de la carga de la base de datos. Middle-R conoce la carga de la base de datos a partir de las peticiones que env´ıa a la
Algoritmo 3 Algoritmo basado en la par´abola de m´ınimos cuadrados Compute the least square parabola
if the system fits the parabolic model then
if current load and throughput are in the ascending side then . Underload
if mplcurrent = mplmax then
Increase mplmax in one, unless MAX POOL SIZE is reached
else
mplmax ← mplcurrent
end if
else if current load and throughput are in the descending side then . Overload
if mplcurrent = mplmax then
Decrease mplmax in one, unless MIN POOL SIZE is reached
else
mplmax ← mplcurrent − 1
end if
else . Saturation
if mplcurrent < mplmax then
mplmax ← mplcurrent
end if end if
else . The system does not fit the parabolic model
Compute the least square curve of grade 1
if the curve is ascending then . Underload
if mplcurrent = mplmax then
Increase mplmax in one, unless MAX POOL SIZE is reached
else
mplmax ← mplcurrent
end if
else if the curve is descending then . Overload
Set mplmax to MIN POOL SIZE
else . Saturation
if mplcurrent < mplmax then
mplmax ← mplcurrent
end if end if end if
load - throughput curve load (tps) t r h o u g h p u t ( t p s ) overload function measurements estimated parabola estimated line
currentload/throughput saturation bound
overload saturation
underload
Figura 4.5: Recta de m´ınimos cuadrados y par´abola c´oncava de m´ınimos cuadrados base de datos y las respuestas que ´esta le manda a peticiones previas. La figura 4.6 muestra como evoluciona la carga de la base de datos en cada instante de tiempo, para cada transacci´on se indica mediante un c´ırculo el inicio de su ejecuci´on y con una l´ınea vertical el final de la ejecuci´on de la transacci´on, si alguna transacci´on no ha terminado su ejecuci´on en el intervalo mostrado se representa con una flecha. De esta forma en un instante Ti en la base de datos se pueden distinguir tres tipos de transacciones:
Ti-1 Ti Ti+1 txnn txnn+1 txnn+2 txnn+4 txnn+3
Figura 4.6: Snapshot de la carga del sistema
Ini: Son las transacciones que Middle-R ha enviado a la base de datos en el instante
Ti para su ejecuci´on. En la figura 4.6, ini corresponde a las transacciones txnn+2, txnn+3 y txnn+4.
Outi: Las transacciones que han terminado su ejecuci´on durante el instante Ti y cuyo
resultado se env´ıa a Middle-R. Las transacciones txnn+1 y txnn+2 de la figura son outi.
Loadi: Son las peticiones que Middle-R envi´o a la base de datos en instantes anteriores al instante Ti, comenzaron a ejecutarse en dichos instantes y que al inicio del
instante Ti todav´ıa no han terminado su ejecuci´on. En la figura 4.6 loadi son las
transacciones txnn y txnn+1.
Middle-R conoce el n´umero de las transacciones ini ya que son las transacciones que
´el env´ıa a la base de datos en el instante Ti, y el n´umero de las transacciones outi, que
corresponde a las respuestas que le llegan desde la base de datos en el instante Ti. El
n´umero de transacciones loadi, aquellas que estaban ejecut´andose en la base de datos
al comienzo del instante Ti y que entraron en la misma en instantes anteriores a Ti se
calcula de la siguiente manera: Cuando se inicia el sistema, la carga de la base de datos (load0) es cero, ya que Middle-R todav´ıa no ha enviado ninguna transacci´on a la base de
datos. En un instante Ti, la carga del sistema (loadi) se calcula sumando a la carga del
instante anterior (loadi−1) las transacciones que Middle-R ha enviado a la base de datos
en el instante Ti−1 (ini−1) y restando las transacciones que han terminado su ejecuci´on
en dicho instante de tiempo (outi−1), es decir, loadi se calcula mediante la siguiente
f´ormula recursiva.
loadi =
(
0, si i = 0
loadi−1+ ini−1− outi−1, si i > 0
La tabla de la figura 4.7 muestra la evoluci´on de la carga del sistema de la figura 4.6, suponiendo Ti−1 como el instante inicial de la ejecuci´on del sistema (i.e. Ti−1 = T0).
load in out
Ti−1 0 2 0
Ti 2 3 2
Ti+1 3 0 2
Figura 4.7: Evoluci´on de la carga del sistema
A partir de la relaci´on entre los valores de load, in y out en cada instante de tiempo es posible deducir el estado en que se encuentra el sistema. El sistema est´a en la fase de infracarga (figura 4.1) si es capaz de procesar todas las transacciones que le que le llegan en un instante dado o dentro de un intervalo de tiempo razonable, en el primer caso loadi ser´a cero ya que no hay ninguna transacci´on pendiente del instante ante-
rior y en el segundo caso se cumple que loadi <= (ini ∗ LOW ER BOUND), donde LOWER BOUND es la constante de tolerancia.
Por otro lado el sistema est´a en el estado de sobrecarga cuando no es capaz de procesar todas las transacciones que le llegan en tiempo razonable, sino que se van acumulando de un instante a otro y por tanto el valor de load crecer´a constantemente, esto se verifica mediante loadi > (ini∗UP P ER BOUND), con UPPER BOUND como
En cualquier otro caso, se puede considerar que el sistema est´a en saturaci´on de acuerdo con la figura 4.1. Como en el caso anterior, el objetivo del algoritmo (descrito en el algoritmo 4) es modificar din´amicamente el tama˜no del pool de conexiones de forma que el sistema no entre en el estado de sobrecarga.
Algoritmo 4 Algoritmo basado en la carga del sistema
load0 ← 0
for every Ti with i > 0 do
Compute current load (loadi ← loadi−1+ ini−1− outi−1)
Get current input (ini)
Get current output (outi)
if loadi <= (ini∗ LOW ER BOUND) then . Underload
if there are no free connections at the pool then
Increase mplmax in one, unless MAX POOL SIZE is reached
else
mplmax← mplcurrent
end if
else if loadi > (ini∗ UP P ER BOUND) then . Overload
if there are no free connections at the pool then
Decrease mplmax in one, unless MIN POOL SIZE is reached
else
mplmax← mplcurrent − 1
end if
else . Saturation
if mplcurrent < mplmax then
mplmax← mplcurrent
end if end if end for
En el algoritmo, la carga de la base de datos al inicio del sistema (load0) es cero.
A partir de ese momento Middle-R calcula la carga de la base de datos en cualquier instante de tiempo a partir de la carga en el instante anterior (loadi−1) y del n´umero de
peticiones que Middle-R ha enviado a la base de datos y del n´umero de respuestas que le han llegado desde la base de datos en dicho instante (ini−1 y outi−1) tal y como se ha explicado antes (loadi ← loadi−1+ ini−1−outi−1). A continuaci´on, Middle-R compara el
valor actual de carga loadi con el n´umero de peticiones que ha enviado a la base de datos ini modificado con las constantes de tolerancia (LOWER BOUND y UPPER BOUND )
para determinar si el sistema est´a en los estados de infracarga o sobrecarga.
Si el sistema est´a en el estado de infracarga y todas las conexiones del pool de co- nexiones actual est´an siendo utilizadas, se incrementa el tama˜no del pool de conexiones en una nueva conexi´on a no ser que se haya alcanzado el tama˜no m´aximo del pool de conexiones (MAX POOL SIZE ). Si hay conexiones del pool de conexiones actual que
no se est´an utilizando, entonces se ajusta el tama˜no del pool al n´umero de conexiones utilizadas. Por otro lado, si el sistema est´a en el estado de sobrecarga y todas las co- nexiones del pool de conexiones actual est´an siendo utilizadas se decrementa el tama˜no del pool en una conexi´on a menos que se haya alcanzado el tama˜no m´ınimo del pool de conexiones (MIN POOL SIZE ). Si hay conexiones del pool de conexiones actual que no se est´an utilizando, entonces se decrementa el tama˜no del pool en el n´umero de co- nexiones que no est´an siendo utilizadas m´as una, con el l´ımite del tama˜no m´ınimo del pool de conexiones (MIN POOL SIZE ).