Pergunta

Eu tenho duas caixas debianas conectadas por um cabo CX4 entre dois cartões de 10 GBE. Um vai gerar dados muito rapidamente (entre 4 gbits/s e 16 gbits/s), e o outro precisa ser capaz de pegar tudo isso e armazená -los em RAM para análise posterior. Sou novo nesse tipo de codificação de baixo nível e aceitaria felizmente alguma idéia sobre qual abordagem ampla para usar (eu preciso de DMA? RDMA?), Ou dicas e truques que possam se aplicar. Obrigado!

Foi útil?

Solução

Se você deseja processar constantemente 1 GB de tráfego, um segundo, você precisa de um ônibus muito largo e uma taxa de processamento muito rápida, e minha experiência vem de Nids. Você precisa de hardware especializado para executar consistentemente o processamento de NIDs 100 MB (1 Gig Ethernet) de dados (10 GB é outro universo). A RAM não vai ajudá-lo, porque você pode preencher um GB em 5 a 10 segundos e 1 GB mantém muitas solicitações.

Se você estiver tentando fazer qualquer forma de processamento de negócios ou web com 10 shows, provavelmente precisará colocar um distribuidor de carga que possa acompanhar 10 GB de tráfego na frente.

PS, devo esclarecer que o NIDS é 1: 1 de tráfego processado na máquina que vê o tráfego - ou seja, pior cenário que você processa todos os bytes da mesma máquina; Enquanto o processamento de negócios/Web é 1: Muitos: muitas máquinas e uma ordem de magnitude muitos bytes para processar.

-Editar-

Agora que você mencionou que há uma lacuna entre a entrega de dados (nenhum NIC padrão de 10 GB pode acompanhar 10 GB de qualquer maneira), precisamos saber qual é o conteúdo do processamento antes que possamos fazer sugestões.

-Edit 2-

O Berkeley DB (um banco de dados com um modelo de dados simples) se comporta como um banco de dados corporativo (em termos de taxa de transação) quando você usa vários threads. Se você deseja gravar no disco a taxas altas, provavelmente deve explorar esta solução. Você provavelmente deseja uma configuração de ataque para aumentar a taxa de transferência - o RAID 0+1 é o melhor em termos de taxa de transferência e proteção de IO.

Outras dicas

As únicas NICs que já ouvi disponíveis para PCs comuns que lidam com o Satated 10 GbE até o espaço para o Usuários para qualquer tipo de pós -processamento são os fabricados pela Napatech - você terá que usar sua API personalizada.

E é melhor você colocar esse cartão como um servidor bastante adulto, com o encanamento de ônibus para suportar esse tipo de velocidade (certamente eu me afastaria de qualquer tipo de chipsets da NVIDIA para essa caixa.)

Antes de planejar qualquer programação especial, você deve fazer alguns testes para ver quanto pode processar com um sistema de baunilha. Configure um arquivo de dados simulado e um processo de envio na máquina produtora e um aceitador/analisador simples na máquina de consumo e faça um monte de perfil - onde você vai enfrentar problemas de dados? Você pode jogar hardware melhor ou ajustar seu processamento para ser mais rápido?

Certifique -se de começar com uma plataforma HW que possa suportar as taxas de dados que você está esperando? Se você está trabalhando com algo como o 82598EB NIC da Intel, verifique se o conectou a um slot do PCIE 2.0, de preferência em um slot x16, para obter largura de banda completa do NIC ao chipset.

Existem maneiras de ajustar os parâmetros do driver da NIC no seu datastream para tirar o máximo proveito da sua configuração. Por exemplo, verifique se você está usando quadros de jumbo no link para minimizar a sobrecarga do TCP. Além disso, você pode brincar com as taxas de acelerador de interrupção do motorista para acelerar o manuseio de baixo nível.

O processamento para o seu conjunto de dados é paralelo? Se você tiver uma tarefa despejando os dados na memória, pode configurar várias outras tarefas para processar pedaços dos dados simultaneamente? Isso faria bom uso de CPUs com vários núcleos.

Por fim, se nada disso for suficiente, use os dados de perfil/tempo que você reuniu para encontrar as partes do sistema que você pode ajustar para melhor desempenho. Não assuma que você sabe onde precisa ajustar: faça backup com dados reais - você pode se surpreender.

Bem, você vai precisar de dinheiro. Uma maneira pode ser comprar uma opção de compartilhamento de carga para dividir dados recebidos em dois computadores e pós-processá-los em um único banco de dados.

Como você tem alguns aspectos que simplificam a situação (ponto a ponto estável entre apenas duas máquinas, sem processamento), eu realmente tentava fazer um método trivial ou óbvio de um único fluxo de TCP entre os sistemas e escrever os dados usando write() para disco. Em seguida, meça o desempenho e o perfil para determinar onde estão quaisquer gargalos.

Para o ponto de partida, leia sobre o C10K (10000 Conexões simultâneas) Problema, que é para isso que a maioria dos servidores de alto desempenho é desenvolvida. Deve fornecer um forte histórico de problemas de servidor de alto desempenho. É claro que você não precisa se preocupar com seleção / pesquisa / epoll para estabelecer novas conexões, o que é uma grande simplificação.

Eu acho que o recente kernel Linux suportou o pacote de 10 GB da Nic-> kernel, mas duvido que haja uma maneira efiante de copiar os dados para o espaço do usuário até jogar com a plataforma i7/xeon 5500

O que parece ser esquecido: se as NICs são 10 GB e você se preocupa com o receptor, você pode descansar (relativamente) fácil: mesmo que a fonte possa gerar dados nessa velocidade, terá os mesmos problemas Linha de 10 GB como receptor, colocando -a da linha para a RAM.

E se as NICs estiverem 10 GB, significa que os bits são relatados a esse ritmo, mas nada é dito sobre o tempo entre pacotes únicos, e ainda não estamos falando de protocolos.

Suponho que essa pergunta, enquanto isso, é obsoleta para o OP, mas se você tiver essa tarefa, comece com uma solução regularmente programada para poder julgar qual aumento de velocidade seria necessário para o seu caso especial (seu caso é sempre especial;- )

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top