Project

General

Profile

Wiki

Maybe start reading here

Ver aqui "o que significa o load average no Linux"

Limitação: A MIB UCD não indica o número de cores, e o load não está ajustado a este parâmetro!

Proposta de algoritmo de balanceamento

  • Um sistema composto por N hosts, N >= 1.
  • Cada host classificado com duas métricas:
    • load, a leitura por snmp da carga de processador no último minuto;
    • round-trip, o tempo que levou a fazer essa leitura para um determinado host.
  • Normalizam-se as duas métricas num valor apenas, com alguma fórmula, que permita ordenar os hosts por ordem de "mais livre" a "menos livre".
  • Não interessa seleccionar "o mais livre", pois
    • Seria necessário avaliar em tempo real, a cada pedido, qual o mais livre.
    • Não é exequível, aumentaria imenso o tempo de resposta.
  • A avaliação é feita de "tempos a tempos"
    • Logo seleccionar "o mais livre" causaria que, num período entre avaliações, seria sempre o mesmo servidor a receber todos os pedidos.
  • Então é preciso criar uma relação entre o valor resultado da avaliação e uma percentagem, o que permite dizer algo como:
    • "novos pedidos serão encaminhados para o"
      • "servidor mais livre com probabilidade 60%"
      • "segundo servidor mais livre com probabilidade 20%"
      • "terceiro servidor mais livre com probabilidade 10%"
      • etc.
  • É necessário criar uma fórmula, com base no "load" e no "round trip" que nos permita algo como:
    • Quantificar a carga máxima possível do sistema (todos os hosts)
    • Quantificar a carga de uma máquina, logo determinar a carga livre dessa máquina
    • Concluir que "a máquina X só está a contribuir com 40%, logo devia receber 60% dos pedidos a seguir"
  • É preciso ter em conta que uma máquina pode ser mais potente que outra, as percentagens já têm de ser "normalizadas", pois uma máquina a contribuir 40% absolutos pode de facto estar na sua carga máxima!
    dizer que, de toda a carga do sistema, 60% está livre num servidor
        loads[0].load = 41l; loads[0].round_trip = 41l;
        loads[1].load = 40l; loads[1].round_trip = 40l;
        loads[2].load = 4l; loads[2].round_trip = 4l;
        loads[3].load = 5l; loads[3].round_trip = 5l;
        loads[4].load = 10l; loads[4].round_trip = 10l;
        loads[5].load = 50l; loads[5].round_trip = 50l;
        sum_load = 100l;
        sum_rt = 100l;
        n_up_servers = 5;
        peers->number = 5;