Live Chat Software by Kayako
Base de Conhecimento
Roteamento em modo Netmap com netmap-rt no ProApps
Postado por Alex Lemos on 26/Apr 17:24

Roteamento em modo Netmap no ProApps

O ProApps a partir do ProApps Routing 2.3.23 (routing-2.3.23) inclui o suporte a roteamento em modo netmap, através do serviço netmap-rt. Esse recurso permite o uso do framework netmap para encaminhamento em camada 3 (L3) de pacotes, e no ProApps está preparado para uso primário em ambiente de roteamento de borda, com BGP e também roteamento OSPF.

Antes de usar o netmap-rt você precisa entender alguns conceitos. O primeiro deles é que nós recomendamos fortemente que esse recurso seja utilizado por usuários ProApps rodando o ProApps Routing em equipamentos ServerU, especialmente L-800 ou superior, para melhor proveito e melhor performance. Se você usa o ProApps Routing em outro hardware, é ideal utilizar em redes Chelsio T5 ou Intel igb(4) que tem o melhor suporte ao framework netmap.

Em modo netmap é importante entender, que os pacotes são acessados, processados e tratados diretamente pela aplicação. Isso quer dizer que o kernel tem uma função bem limitada nesse modo de uso. É quase correto dizer que o kernel é completamente pulado e ignorado em modo netmap, exceto que fica com o kernel o gerenciamento de acesso ao plano de controle (control plane) oferecido pelo framework Netmap, a alocação de memória e controle de acesso ao device netmap propriamente dito - o /dev/netmap. Mas uma vez que a aplicação abra uma porta de rede em modo Netmap, a aplicação toma controle totalmente daquela porta e pula o kernel para qualquer processamento de pacotes a partir daquele instante.

Isso significa na prática que estatísticas de kernel que você está acostumado a consultar com netstat(1) como taxas de pacotes por segundo, taxas de erro, retransmissão não serão mais contabilizadas pelo kernel. Ou seja estarão frequentemente zeradas ou indicando valores baixos, referentes a comunicação da aplicação com o host bridge ou com interface de loopback. Apenas estatístias informadas pelo hardware serão apresentadas pelo netstat(1) por exemplo. Da mesma forma aplicações de monitoramente como nload(8), rate(8) ou até mesmo tcpdump(1) não vão funcionar como você está acostumado. Mas isso não significa que não vão funcionar. Continue lendo.

Temos então dois conceitos que precisam ser compreendidos:

  • kernel-path: caminho dos pacotes que são processados dentro do kernel, ou seja o modo normal de processamento do FreeBSD, onde um pacote passa por momentos distintos como o driver de kernel, o código de roteamento em kernel, código de vlan, ipsec, marcação de pacotes em buffer, firewall ipfw, pf, subsistemas como netgraph, etc.
  • user-path: em modo netmap, o kernel-path é completamente ignorado, então recursos como vlan, ipsec ou filtro precisam ser suportados na aplicação em modo netmap, a isso chamamos o user-path, ou seja recursos que não forem implementados / suportados na aplicação netmap-rt(1) ou qualquer outra aplicação em modo netmap, não serão suportados.
  • host-stack bridge: o framework netmap oferece um modo de comunicação entre a aplicação (user-path) e o kernel (kernel-path) no host local, chamado host-stack bridge, com esse recurso a aplicação não precisa por exemplo implementar suporte a recursos que precisam ser processados pela própria máquina local, a vantagem por exemplo é que daemons como bgpd, ospfd, bird, sshd na própria máquina vão funcionar quando a aplicação implementa o host-bridge sem a necessidade de ser implementados explicitamente.

O netmap-rt

No ProApps o roteamento em modo Netmap é implementado pelo netmap-rt(1), um daemon multithread encarregado de implementar o dataplane (plano de dados, onde o roteamento de fato acontece), o controlplane (plano de controle, gerenciamento do serviço, das threads de sincronia de dados, e do controle das threads do plano de dados), em específico o netmap-rt implementa:

  • dataplane: são as threads que fazem o roteamento entre as portas de rede configuradas, tendo threads de controle para RX e outras para TX, são identificadas como netmap-rt{dataplane} ou netmap-rt{netmap-rt} quando inspecionado com top -H
  • controlplane: gerenciam as threads de dataplane e gerenciam o acesso ao cliente (CLI) e ao utilitário netmap-rtctl, são identificadas como netmap-rt{controlplane} ou netmap-rt{netmap-rt} quando inspecionado com top -H

  • monitor: monitora as atividades na tabela de roteamento (FIB) em kernel do FreeBSD e gerencia as diversas threads que fazem a convergência da tabela de roteamento FIB com a netmap FIB, são identificadas como netmap-rt{monitor} quando inspecionado com top -H

  • fib-trigger-qX: são as múltiplas threads que podem vir a existir para gerenciar diversas filas de convergência de rotas da FIB do kernel para a FIB do netmap, ou seja enquanto as threads de monitor monitoram e colocam na fila, as threads de fila vão esvaziando as sincronias pendentes e colocando na FIB acessível a todos dataplane; são identificadas como netmap-rt{fib-trigger-q0} quando inspecionado com top -H onde qX pode variar de q0 até o número de CPU disponível no sistema.

Quando você rodar top -H você verá detalhes das threads, por exemplo:

11958 root 23 0 1411M 87896K kqread 2 0:02 85.42% netmap-rt{netmap-rt}
11958 root 23 0 1411M 87896K kqread 4 0:02 32.19% netmap-rt{netmap-rt}
11958 root 21 0 66804K 10004K select 1 18:42 2.20% snmpd
11958 root 23 0 1411M 87896K nanslp 3 0:00 11.71% netmap-rt{fib-trigger-q0}
11958 root 20 0 1131M 146M nanslp 1 0:21 0.00% netmap-rt{monitor}

Sobre o netmap-rt

O netmap-rt é o roteador IP que implementa o subsistema de roteamento do FreeBSD em modo netmap, um framework de I/O de pacotes extremanete rápido. Ele é baseado no netmap-fwd, uma prova de conceito original para um roteador IPv4 implementado sobre netmap, inicialmente projetado por Patrick Tracanelli e implementado em prova de conceito (pre-alpha) por Luiz Souza em um projeto da ServerU Inc. Devido a uma série de motivos, resolvemos renomear para netmap-rt, um nome único e que não conflita com outros softwares, refletindo também a evolução do PoC original. O netmap-rt também é um roteador DPDK, o que significa que além do modo netmap, pode trabalhar em modo DPDK e se beneficiando da tecnologia da Intel para acesso direto ao dataplane em redes desse fabricante. Esse software é desenvolvido e mantido pela ServerU Inc e pela FreeBSD Brasil e disponível por padrão no ProApps Enterprise Appliance. Ele pode rodar em qualquer sistema FreeBSD compatível ou no ProApps Base mesmo sem a ProApps GUI.

O netmap-rt foi projetado para substituir o kernel routing path de forma transparente, enquanto plenamente compatível com o kernel e as aplicações que o usuário está acostumado a usar para manipular tabela de roteamento, de forma que usuários e daemons de roteamento possam manusear a tabela de roteamento de kernel e interfaces fora do modo netmap, enquanto essas mudanças sempre se refletem no modo netmap. Isso quer dizer que o kernel-path serve também como fallback para roteamento sem depender de configurações ou ajustes exclusivos do roteador em modo netmap. As interfaces de roteamento em modo netmap podem ser seletivamente configuradas, permitindo configuração híbrida onde algumas portas atual em kernel-path enquanto outras em modo netmap, fazendo funções distintas.

Com uma integração e sincronia inteligente entre a FIB do kernel e o roteador netmap, a possibilidade de fazer bridge com o host-stack, daemons de roteamento como BIRD, OpenBGP, OpenOSPF ou Quagga podem ser utilizados de forma transparente e sem nenhum requisitoe special de configuração nesses serviços.

O objetivo principal do netmap-rt é obter benefício de performance das technologias netmap (e DPDK) e alcançar taxas de roteamento de pacotes sem precedentes no FreeBSD em hardware sem aceleração específica para essa função, obtendo melhores resultados em placas de redes profissionais. Focamos o suporte e desenvolvimento primário em redes Intel e Chelsio, mas ganhos de performance são esperados em diversos outros chipset de redes que suportem Netmap. O objetivo desse software é chegar o mais próximo possível de taxas de roteamento em line-rate em redes 10G e 40G com tabela BGP FULL em servidores com ótimo custo de propriedade como a série ServerU Netmap.

Por quê renomear?

O primeiro motivo para o netmap-rt(1) ter um novo nome, diferente do nome utilizado na prova de conceito (PoC) não é técnico. O nome netmap-fwd foi utilizado diversas vezes como o nome original da aplicação bridge (netmap bridge) escrita por Luigi Rizzo, autor original do netmap framework, e, embora essas duas aplicações compartilharam o mesmo nome, histioricamente são completamente não relacionadas e fazem coisas diferentes. Dessa forma números de performance e estatísticas publicadas com esse nome geram uma grande e indesejada confusão para referências acadêmicas, científicas e outros trabalhos relacionados.

Em segundo lugar, netmap-fwd era apenas uma prova de conceito. Agora temos a cosa toda, completamente repensada e o netmap-rt(1) não é apenas um encaminhador de pacotes. Com suporte a ACL, com recursos de Policy Based Routing, com coletor de métricas para observabilidade de rede e outros recursos, decidimos por um nome mais apropriado.

Recursos do netmap-rt

O netmap-rt incluso no ProApps Routing oferece os seguintes recursos:

  • Roteamento IPv4 implementado sobre o framework Netmap
  • Multithreaded
  • Monitor de disparos de sincronia de tabela de roteamento FIB com a FIB do netmap-rt via gatilhos RTM_MESSAGE
  • Filas multithread para sincronia de roteamento paralelo com adptação inteligente de atualizações em lote (atualizações individuais são tratadas de forma distinta das atualizações volumétricas)
  • Utilitário netmap-rtctl para automação e interação
  • Controles de couple, decouplerecouple da tabela FIB
  • ACL (Lista de Controle de Acesso) para filtros básicos e PBR
  • PBR (Policy Based Routing) implementado como ação de uma ACL
  • DXR (Direct / Range Routing Lookups) ou RADIX como métodos de pesquisa na tabela de roteamento
  • DXR como método de lookup para as ACLs
  • Pronto para roteamento BGP, OSPF
  • Suporte a IEEE 802.1q (VLAN)
  • Console interativativo baseado em socket local
  • Recurso de route dump que permite salvar a tabela de roteamento em um arquivo de texto em uma thread dedicada para debug sem interrupção do roteamento
  • Comando route get inteligente que compara e informa couple status entre o Netmap FIB e a kernel FIB
  • Interação completamente transparente entre a FIB de kernel permitindo que aplicações de linha de comando, usuários e serviços manipulem a tabela de roteamento sem qualquer necessidade de adaptação para o modo netmap
  • Suporte IEEE 802.1ad (Q-in-Q)
  • Modo Intel DPDK (via DPDK Netmap Compatibility Layer), compat_netmap
  • Melhorias importadas do idpdk-fwd quando rodando em modo DPDK (beta)
  • Controle da aplicação sobre recursos de hardware acceleration desejados nas placas de rede

Disponibilidade do netmap-rt

Você pode usar o netmap-rt diretamente no ProApps Enterprise Appliance disponível a partir do ProApps Routing 2.3.23, para saber a versão instalada do seu componente routing, digite:

% pkg info routing
routing-2.3.23
Name : routing
Version : 2.3.23
Installed on : Mon Apr 6 18:37:31 2016 BRT
Origin : proapps/routing
Architecture : freebsd:10:x86:64
Prefix : /usr/local
Categories : proapps
Licenses :
Maintainer : jmelo@serveru.us
WWW : http://www.proapps.com.br
Comment : ProApps Routing meta port
Annotations :
repo_type : binary
repository : ProApps
Flat size : 5.52MiB
Description :
ProApps Routing meta port
WWW: http://www.proapps.com.br

E para saber se o netmap-rt está instalado, digite:

% pkg info netmap-rt
netmap-rt-v0.3c
Name : netmap-rt
Version : v0.3c
Installed on : Thu Apr 14 18:18:59 2016 BRT
Origin : net/netmap-rt
Architecture : freebsd:10:x86:64
Prefix : /usr/local
Categories : net
Licenses : EULA
Maintainer : patrick@serveru.us
WWW : http://www.ServerU.us
Comment : IP router implementing FreeBSD routing on top of Netmap
Shared Libs required:
libevent-2.0.so.5
libucl.so.3
Annotations :
Flat size : 108KiB
Description :
IP router implementing FreeBSD routing on top of Netmap
WWW: http://www.ServerU.us

Usando o netmap-rt

Para instalar o netmap-rt em um ProApps que ainda não tenha o recurso, use o pkg:

pkg install libucl libevent2
pkg add <url_to_this_package>

Adicione a seguinte entrada no /etc/rc.conf:

netmap_rt_enable="YES"
#netmap_rt_flags="-v" #optional additional flags

Revise o 

/usr/local/etc/netmap-rt.conf

e ajuste-o conforme suas necessidades. Em particular você pode manter os recursos de aceleração LRO (não desliga-los) em algumas placas de rede em particular. Você também pode testar os métodos de pesquisa na tabela de roteamento DXR ou RADIX e escolher o que se comportar melhor no seu ambiente.

A configuração mais importante no netmap-rt.conf é a lista de interfaces de rede que deve ser usada. As interfaces que não estiverem listadas na configuração não serão usadas pelo netmap-rt, ou seja o roteamento ficará em kernel-path, enquanto as listadas serão gerenciadas pelo netmap-rt(1):

interfaces="ix0 ix1 igb1 igb2 igb3 vlan10 vlan12"

Inicie o serviço como de costume no FreeBSD:

# service netmap-rt start

Os logs são desviados via syslog para o /var/log/messages.

A partir de agora você deve manipular as tabelas de roteamento pelo comando route(8) na CLI (linha de comando) exatamente como sempre fez. Se você manipular a tabela do netmap-rt diretamente, as mudanças não serão refletidas em kernel, por isso recomendamos que manipulações sempre aconteçam com o comando route(8) normalmente, enquanto você pode inspecionar as tabelas de roteamento do netmap-rt com o utilitário netmap-rtctl.

O netmap-rtctl

Como usar e explorar o roteamento netmap via netmap-rtctl:

usage: netmap-rtctl -f [netmap-rt.conf] -s [socket] <command> <command arg>

Comandos e exemplo de uso do netmap-rtctl:

netmap-rtctl arp

Mostra tabela ARP cacheada pelo netmap-rt

netmap-rtctl ifconfig

Mostra configurações observados em modo de execução na interface informada

netmap-rtctl route get <destionation>
netmap-rtctl route delete <destination>
netmap-rtctl route add <destination> <gateway>
netmap-rtctl route add <destionation> -iface <interface>

Comandos de manipulação de roteas, similar ao route(8)

netmap-rtctl route

Imprime a tabela de roteamento, mas CUIDADO: é uma thread que bloqueia a árvore RADIX ou DXR em modo walktree, faz o engine de roteamento pausar, NÃO USE em produção, use apenas para debug ou troubleshooting, em produção use o netmap-rt-ctl route dump para salvar a tabela de roteamento em um arquivo

netmap-rtctl route dump

Faz dump da tabela de roteamento convergida no netmap-rt em um arquivo, que por padrão é o /var/db/netmap-rt-dump (ajustável no netmap-rt.conf)

netmap-rtctl fib couple|decouple|recouple

Permite gerencia a convergência da tabela FIB do kernel na do netmap-rt

netmap-rtctl status

Imprime contadores e informações de status

netmap-rtctl cli

Mostra contadores da CLI interativa e dos clientes netmap-rtctl conectados

netmap-rtctl shutdown

Desliga o netmap-rt de forma clean e correta.

netmap-rtctl acl list

Imprime a lista de controle de acesso carregada

netmap-rtctl acl reload

Recarrega o arquivo de regras de controle de acesso

netmap-rtctl acl enable|disable

Por padrão o sistema de controle de acesso (ACL) e filtros são ligados sempre que o arquivo acl_conf existe e tem regras válidas, mas você pode desligar e religar a qualquer momento em tempo de execução e passar os pacotes diretamente pro engine de roteamento

netmap-rtctl help

Ajuda básica do utilitário de linha de comando

Porta de Gerência

Como o netmap-rt coloca a porta em modo netmap, recomendamos que uma porta de rede seja dedicada para gerência, permitindo acesso ssh e acesso a ProApps GUI através dessa porta e que essa porta fique fora do modo netmap (ou seja não listado nas interfaces= no netmap-rt.conf) e deve ser alcancável diretamente da sua rede (não depender de rotas estáticas por exemplo, tão pouco dinâmicas), especialmente porque mediante início ou shutdown da aplicação netmap, haverá interrupção temporária de conectividade quando alternar entre o modo kernel-path e o modo netmap. Algumas sessões BGP podem cair nessa alterância de modo de operação dependendo da configuração de keep alive e tempo de vida configurado com os peers BGP.

Limitações Conhecidas

  • IPv6 tem suporte experimental, não recomendamos uso em ambiente BGP/OSPF ainda, ao invés disso use o kernel-path em portas e vlans dedicadas ao IPv6 que devem ficar fora do netmap-rt.
  • (*)Não é possível subir túneis IPSEC (VPN) em modo Netmap, não está implementado suporte ipsec ao netmap-rt.
  • O uso do netmap-rt em modo DPDK requer configuração explícita e manual do loader.conf, abra um chamado de suporte para ser instruído caso queira testar.
  • O suporte a ACL é considerado beta e testado principalmente para blackholePBR.
  • Falta adicionar uma coluna de estatísticas de uso por entrada de rede similar a coluna use do comando netstat(1).
  • Telemetria e hooks de netflow precisam ser concluídos para incluir números de AS

(*) Essa atividade não está no TODO para o netmap-rt, todas as outras estão.

Reporte feedback:

http://support.serveru.us/

http://suporte.freebsdbrasil.com.br

Versão:

Software version v0.3c

Uso Preliminar no ProApps e Estado Atual

A ativação do netmap-rt no ProApps no momento não pode ser feita pelo ProApps GUI (interface gráfica) ainda. Isso porque o Status atual do netmap-rt é considerado BETA. Nós temos utilizado seletivamente em alguns clientes desde Dezembro/2015 e é nosso modo primário de roteamento na FreeBSD Brasil. A disponibilidade preliminar no ProApps tem obetivo de aumentar a base de usuários e recomendamos que seja adotado nesse momento por clientes com mais facilidade em linha de comando. O ProApps Routing pode continuar sendo utilizado normalmente já que a integração do netmap-rt com BGP e outros recursos é transparente, apenas a configuração (netmap-rt.conf) e troubleshooting requer acesso CLI.

Se você quiser usar o netmap-rt em seu ambiente abra um chamado para ser acompanhado por nossa equipe de suporte.

Performance

O netmap-rt oferece ganho de até 10x na performance de roteamento se comparado com o modo de roteamento em kernel. Em um ambiente de testes com uma ServerU Netmap L-800 com 4x10GbE e 6x1GbE em testes bilaterais utilizando pkt-gen em modo RX e pkt-gen em modo TX, os números observados são:

  # CPU ix(4) pps ix(4) bps ncxl(4) pps ncxl(4) bps vlan(4) pps vlan(4) bps
ProApps netmap-rt 1 1.7Mpps 20Gbps 1.7Mpps 20Gbps 1.5Mpps 20Gbps
FreeBSD kernel (fastforwarding) 1 200Kpps 2Gbps 200Kpps 2Gbps 180Kpps 1.8Gbps
FreeBSD kernel (melifaro routing) 1 400Kpps 4Gbps 440Kpps 4Gbps 393Kpps 4Gbps
Brocade vRouter 5600 (DPDK) 1 1.8Mpps 20Gbps - - 1.6Mpps 20Gbps
               
ProApps netmap-rt 8 9Mpps 23Gbps 11Mpps 28Gbps 8Mpps 23Gbps
FreeBSD kernel (fastforwarding) 8 900Kpps 18Gbps 1.1Mpps 20Gbps 740MKpps 18Gbps
FreeBSD kernel (melifaro routing) 8 3.6Mpps 20Gbps 3.6Mpps 20Gbps 3.1Mpps 20Gbps
Brocade vRouter 5600 (DPDK) 8 6.8Mpps 23Gbps - - 6.2Mpps 20Gbps

Configuração do netmap-rt

O netmap-rt usa o /usr/local/etc/netmap-rt.conf como arquivo primário de configuração, segue referência:

#
# Copyright (c) 2016, ServerU Inc.
# All rights reserved.
#
# netmap-rt configuration file.
#
#
#
# pidfile - Set the pidfile path.
#
pidfile = "/var/run/netmap-rt.pid";
#
# event_backend - netmap event backend
# Only kqueue and poll are supported.
# Only poll works with 11-CURRENT due to a bug in kqueue support.
#
event_backend = "kqueue";
#
# cli_max_clients - Maximum number of cli connections.
#
cli_max_clients = 10;
#
# cli_socket_path - Path to cli socket.
#
cli_socket_path = "/var/run/netmap-rt.sock";
#
# arp_max_tries - Number of ARP request retransmits.
# Retransmit not faster than one request per second.
#
arp_max_tries = 5;
#
# disable_hw_acceleration - Disable selected hardware acceleration features
# which should not be used in netmap mode. Supported vales are:
# txcsum rxcsum tso4 tso6 lro.
#
disable_hw_acceleration = "txcsum rxcsum tso4 tso6 lro";
#
# acl_conf - Path to access control list configuration file.
#
acl_conf = "/usr/local/etc/netmap-rt-acl.conf";
#
# route_dump_file - where `netmap-rtctl route dump` will dump routing table to.
#
route_dump_file = "/var/db/netmap-rt-dump";
#
# lookup_method - supported values: radix, dxr (default = radix), only used
# on routing lookups, ACL lookups is always dxr.
#
lookup_method = "radix";
#
#
#
interfaces = "ix0 ix1 vlan101 vlan190 vlan900 ncxl0 ncxl1";

O arquivo de configuração /usr/local/etc/netmap-rt-acl.conf tem o seguinte formato:

src-ip;src-port;dst-ip;dst-port;proto;iplen;action

Uma entrada por linha, por exemplo:

any;any;any;123;udp;any;drop
any;any;any;80;tcp;any;nexthop 177.10.156.193
201.19.202.0/24;53;any;any;udp;drop
;;;;udp;0-19;drop log

Delimitadores aceitos são apenas ; enquanto # é um comentário, pode ser usado no final de uma linha de configuração ou em uma nova linha. A expressão any ou a ausência (em branco) de valor faz aquele critério não ser testado. As ações possíveis são deny|dropallow|pass nexthop <gw>, podem ser acompanhados da expressão log para gerar logs (syslog) conforme exemplos acima.

Troubleshooting e Monitoração

Já que o netstat(1) e outros utilitários de monitoração dependem de recursos do kernel que não oferecerão mais muitas informações, você deve sempre usar o netmap-rtctl show stats para consultar a saúde geral do subsistema de roteamento netmap. Se quiser monitorar taxas de pps, de bps ou inspecionar tráfego use alguma aplicação compatível com pcap.

Desde 2013 o ProApps oferece uma versão própria do Netmap, isso significa que alguns recursos avançados, outros exclusivos e alguns que ainda não entraram no -STABLE ou mesmo no -CURRENT há estão disponíveis no ProApps. Entre esses recursos o uso antecipado do modo monitor do netmap foi adotado. Para utilitários como tcpdump(1), nload(8), rate(1), você pode tirar proveito do modo monitor nas interfaces, usando da seguinte forma:

tcpdump -nv -i netmap:ncxl0/rtz
rate -i netmap:ix0/rtz -R -b

A sintaxe geral do modo monitor no netmap é netmap:<if>/<monitor_mode> enquanto os modos suportados são r para RX, t para TX e para o modo zerocopy. Note que pode haver impacto de performance ao usar o modo monitor nas interfaces, então sempre seja seletivo no modo r ou t e sempre tente usar em modo zerocopy. Dentro do netmap o modo zerocopy copia os pacotes para a interface monitor em um momento onde nem todas aplicações podem usufruir, mas para aplicações em modo pcap sempre será suficiente.

(4 votos)
Este artigo foi útil
Este artigo não foi útil

Comentários (0)
Postar um novo comentário
 
 
Nome completo:
Email:
Comentários:
Help Desk Software by Kayako suporte.freebsdbrasil.com.br:443/index.php?