• No se han encontrado resultados

Algoritmo basado en la carga del sistema

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

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 ).