Network capacity planning - um algoritmo
Autor: J. R. Smolka | Publicado: 2011-10-27T19:19:00-02:00

Vamos primeiro definir: o que é fazer planejamento de capacidade? É garantir que os recursos da sua rede (enlaces de comunicação e nós de comutação de pacotes) sejam capazes de cursar o tráfego previsto sem entrar em congestionamento.

Neste artigo vou apresentar um algoritmo simples para, conhecido o interesse de tráfego (em K/M/Gbps e K/M/Gpps) bidirecional entre todos os pontos de ingresso e egresso de tráfego na rede, calcular o volume de tráfego na HMM (Hora de Maior Movimento) em cada enlace e em cada nó da rede.


Vetor dos nós de comutação:

Os nós de comutação de pacotes da rede (roteadores e switches) são descritos como um vetor (array unidimensional) de estruturas de dados. Cada estrutura S(i) contém um acumulador do volume de tráfego cursado em K/M/Gbps (bits/s) e um acumulador do volume de tráfego cursado em K/M/Gpps (packets/s), para cada hora do dia, conforme o modelo abaixo.








Como regra geral vou usar sempre a seguinte convenção para os itens de hora: cada rótulo hh:00 acumula o tráfego desde a hora hh:00:00 até a hora hh:59:59. Exemplo: o rótulo 13:00 representa os valores desde 13:00:00 até 13:59:59.

Outra dúvida comum é: porque os volumes de tráfego em K/M/Gbps e em K/M/Gpps? Aplicações diferentes geram tamanhos médios de pacote diferentes. Aplicações tipo VoIP geram um K/M/Gpps alto, porém com um K/M/Gbps modesto. O contrário acontece com aplicações como, por exemplo, transferência de arquivos. Como a capacidade dos elementos de comutação não depende somente dos K/M/Gbps trafegados, mas tem um limite muito mais sensível para o K/M/Gpps máximo, ambos os números são importantes.


Matriz de topologia da rede:

Para representar a topologia da rede vamos usar uma matriz (array bidimensional) de estruturas de dados. A numeração dos elementos nas dimensões i e j da matriz de topologia replicam a numeração da dimensão i do vetor de nós de comutação. Desta forma cada estrutura T(i,j) representa a existência (ou não) de um enlace de comunicação entre os elementos i e j do vetor de nós de comutação e o volume de tráfego esperado, em K/M/Gbps e K/M/Gpps, a cada hora, na direção de i para j. Obviamente, se existe o enlace T(i,j) então também tem que existir o enlace T(j,i), que representa o tráfego na direção reversa (de j para i) do enlace. 

Abaixo temos um modelo para o elemento T(i,j)





Matriz de interesse de tráfego:

Cada estrutura I(i,j) desta matriz (array bidimensional) indica o particionamento do tráfego, em K/M/Gbps e K/M/Gpps, por hora do dia, originado no nó de comutação i e direcionado ao nó de comutação j, conforme o modelo abaixo.




Uma situação comum é a existência concomitante do tráfego dos serviços A, B, C, ... cursando pela rede. Neste caso é necessário montar uma matriz de interesse de tráfego para cada serviço individual, e depois executar o algoritmo com a matriz de interesse de tráfego total, ou seja, se IA(i,j), IB(i,j), IC(i,j), ... são as matrizes de interesse de tráfego, respectivamente, para os serviços A, B, C, ..., então o algoritmo deve ser executado sobre a matriz de interesse de tráfego obtida pela operação



Matriz de rotas:

A matriz de rotas é um array tridimensional que descreve a sequência dos nós de comutação que deve ser percorrida pelo tráfego. Visualmente podemos imaginar esta matriz como um cubo.




As dimensões i e j definem, respectivamente, os nós de comutação de início e fim da rota. cada instância da dimensão k declara a identificação (numérica, correspondente à numeração dos nós de comutação) de um dos nós de comutação na rota que vai do nó de comutação i até o nó de comutação j. Consequentemente o primeiro nó de comutação em cada rota é dado, implicitamente, pelo valor da dimensão i. E&nbsp; rota encerra´se quando localizamos um elemento na dimensão k cujo valor seja igual a j.


Condições normais de tráfego x condições de contingência:

A forma mais simples de executar este algoritmo é considerar o conteúdo das estruturas de dados que representem a situação normal de operação. Caso queira-se analisar também o comportamento da rede em situações de contingência é necessário criar novas versões das estruturas de dados, uma para cada situação de contingência que se deseje testar.

Neste caso os valores de tráfego em HMM em cada enlace e em cada nó de comutação será o pior caso obtido em cada ponto da rede, considerados todos os cenários testados.


Como definir o conteúdo da matriz de rotas?

 Esta é, talvez, a parte mais complexa da utilização prática deste algoritmo, porque exige o conhecimento prévio da estrtura de rotas negociada entre os nós de comutação, geralmente pelo uso de algum protocolo de roteamento dinâmico (OSPF, IS-IS, etc.). Mesmo nos casos onde seja usada alguma forma de "circuitização de pacotes" (ex.: MPLS-TE) nem sempre é fácil saber com antecedência as rotas correspondentes ao cenário considerado (normal ou contingência).

Em termos práticos é necessário observar o comportamento real da rede em cada situação desejada, ou simular o comportamento dos algoritmos de roteamento dinâmico para definir quais rotas devem ser inseridas na matriz.


Que valores usar na(s) matriz(es) de interesse de tráfego?

Uma vez que buscamos o dimensionamento dos elementos da rede de tal forma que, mesmo em HMM, eles não apresentem congestionamento (e, talvez, para que não entrem em congestionamento mesmo em certas situações de contingência), temos que pensar um pouco sobre que valores de tráfego devemos considerar para cada hora do dia (por serviço, se for o caso).

O comportamento do tráfego medido em uma determinada hora não é constante. Existem diferenças, para a mesma hora, entre os diferentes dias da semana, feriados, etc. Quando tabhulamos estas variações obtemos (muito provavelmente) uma distribuição de frequência normal, para a qual calculamos o valor médio e o desvio padrão.

Minha sugestão, já que estamos projetando para o pico de tráfego em HMM, em cada hora considere como valor do tráfego (em bps e pps) o valor médio mais quatro desvios-padrão. Desta forma a probabilidade que qualquer tráfego observado seja menor ou igual a este valor é de, aproximadamente 99,69%

O algoritmo:


Pois bem... agora podemos iniciar o processamento dos dados.

Tudo começa pelo percurso sistematicamente da matriz de interesse de tráfego e, para cada par (i,j) de origem e destino de tráfego, Acumular (para todas as horas do dia) o tráfego nos nóe e links ao longo da rota que une o nó de comutação i ao nó de comutação j.

Vou representar os trechos do algoritmo usando a linguagem REXX. A sintaxe é muito simples e intuitiva. Não creio que isso venha a dificultar a compreensão pelos interessados. Não está mostrada a parte inicial de leitura dos dados nas respectivas estruturas.








Um detalhe da implementação mostrada: a linguagem REXX permite que o contexto das variáveis de um procedimento seja ou não visível para os procedimentos que ele invoca. A forma sintática que estou apresentando expõe todo o espaço de variáveis do procedimento invocador para os procedimentos invocados.

Como o primeiro nó de comutação na rota de i para j é o próprio nó i, a primeira coisa a fazer é acumular o tráfego (de todas as horas) no nó de comutação i. A seguir fazemos o percurso da rota até encontrar o elemento que contém o valor j, que marca o final da rota. Para cada elemento ao longo da rota (nós de comutação e enlaces) acumulamos o tráfego de i para j indicado na matriz de interesse de tráfego.

Uma observação sintática: a construção "DO WHILE" na linguagem REXX executa o teste da condição&nbsp; de controle no final do loop, o que resulta em pelo menos uma execução das instruções contidas no loop. O loop será executado enquanto o resultado da condição de controle for o valor lógico "VERDADEIRO"






Resta agora detalhar cada um do procedientos de acumulação do tráfego. Vejamos primeiro a acumulação por nó.

O nó alvo da acumulação é passado para o procedimento como um parâmetro, que é recuperado pela instrução "PARSE ARG". A variável índice da variação das horas começa do valor 1 (indicando o período das 00:00:00 às 00:59:59), somente porque a linguagem REXX não aceita valores de índice iguais a zero.

Aliás, o uso da hora como índice transforma, na prática, o vetor de nós de comutação em um array bidimensional, e a matriz de interesse de tráfego em um array tridimensional.




O procedimento de acumulação por enlace é logicamente semelhante ao procedimento de acumulação de tráfego por no, com a diferença que os parâmetros de entrada são dois: ponta A e ponta B do enlace. Da mesma forma que no procedimento anterior, a matriz de topologia transforma-se, na prática, em um array tridimensional, com o acréscimo do indice de hora.




Não estão mostrados os procedimentos para exibição/impressão dos resultados.


Como avaliar os resultados?

Após a execução do algoritmo o vetor dos nós de comutação e a matriz de topologia contém o tráfego acumulado sobre cada elemento, conforme indicado pela matriz de interesse de tráfego.

Para cada elemento representado nestas estruturaas de dados a sequência temporal dos valores indicará qual hora representa a HMM daquele elemento (que não é, necessariamente, a mesma sobre toda a rede).

O valor a ser considerado para dimensionamento dos nós de comutação é o valor de K/M/Gbps e K/M/Gpps na HMM daquele elemento. A especificação do roteador ou switch para este ponto da rede deve atender, no mínimo, a esta demanda de tráfego.

Para o dimensionamento dos enlaces é necessário comparar os valores de K/M/Gbps em HMM de cada enlace nas duas direções (porque o volume de tráfego sobre o enlace pode ser assimétrico). O valor para dimensionamento do enlace (i,j) deve ser o maior valor de HMM entre esta direção e a direção reversa (j,i).

No próximo artigo vou apresentar um caso-exemplo de utilização deste algoritmo. Inté...