2012-01-08 9 views
5

Dado que tres servidores A, B, C en los que A puede manejar el 50% del tráfico, B puede manejar el 30% del tráfico y C puede manejar el 20% del tráfico generar una fórmula para distribuir la carga de manera eficiente. La carga actual de los servidores también es una entrada a la función.Encontrar el servidor menos cargado

No he podido encontrar la "fórmula" que está pidiendo. ¿Hay alguna respuesta específica a esta pregunta?

+0

Me parece recordar esta pregunta que se hizo hace unos meses en SO. Podría haberse migrado a ServerFault. Siempre tuve curiosidad por lo que fue la respuesta. – selbie

+0

El título de esta pregunta se llama "encontrar el servidor menos cargado", pero el texto implica la creación de un algoritmo de equilibrio de carga? En cualquier caso, si la carga actual es una entrada a la ecuación, entonces ¿por qué no es la respuesta, "elegir el servidor menos cargado". ¿Cargar y el tráfico no significan lo mismo? – selbie

+0

Supongo que calcula la carga actual de cada servidor utilizando la cantidad de conexiones de red/tráfico, y luego enruta las conexiones nuevas al servidor con la carga más pequeña. –

Respuesta

5

Existen algunas maneras diferentes de distribuir la carga que podrían aplicarse aquí.

Caso 1. La asignación aleatoria sesgada proporcionalmente a cada carga de los servidores:

for each request 
    let x = uniformly distributed random number between 0 and 1 
    if x <= 0.5 
    goto A 
    else if x <= 0.8 
    goto B 
    else 
    goto C 

Caso 2. Round-Robin sesgada proporcionalmente a cada carga de los servidores:

let x = new list 
push A on x 5 times 
push B on x 3 times 
push C on x 2 times 

for each request 
    y = pop x 
    goto y 
    push y to back of x 

Caso 3. Olvídate de la supuesta capacidad y encuesta para la carga actual

let La = A, load of A 
let Lb = B, load of B 
let Lc = C, load of C 

goto argmin (La,Lb,Lc) 
2

Básicamente, calcule un costo relativo para ser ve en cada uno de los servidores, y durante un período fijo pequeño, sume el costo total de las solicitudes enviadas a dicho servidor. Algo como:

Cost_A = 20/50 
Cost_B = 20/30 
Cost_C = 20/20 

Running_Total_A = 0 
Running_Total_B = 0 
Running_Total_c = 0 

while true: 
    If One minute has passed: 
    Running_Total_A = 0 
    Running_Total_B = 0 
    Running_Total_c = 0 

    IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_A): 
    Running_Total_A += Cost_A 
    RouteTo(A) 
    ELSE IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_B): 
    Running_Total_B += Cost_B 
    RouteTo(B) 
    ELSE IF (Min(Running_Total_A,Running_Total_B,Running_Total_C) == Running_Total_C): 
    Running_Total_C += Cost_C 
    RouteTo(C) 
Cuestiones relacionadas