Decodificação eficiente de estruturas binárias e de texto (pacotes)

fundo

Existe uma ferramenta bem conhecida chamadaWireshark. Eu tenho usado por muito tempo. É ótimo, mas o desempenho é o problema. Cenário de uso comum inclui várias etapas de preparação de dados para extrair um subconjunto de dados a ser analisado posteriormente. Sem essa etapa, leva alguns minutos para fazer a filtragem (com grandes rastreamentos, o Wireshark está próximo de ser inutilizável).

A ideia real é criar uma solução melhor, rápida, paralela e eficiente, para ser usada como um agregador / armazenamento de dados.

Requisitos

O requisito real é usar toda a energia fornecida pelo hardware moderno. Devo dizer que há uma sala para diferentes tipos de otimização e espero ter feito um bom trabalho nas camadas superiores, mas a tecnologia é a principal questão no momento. De acordo com o design atual, existem vários sabores de decodificadores de pacotes (dissectors):

decodificadores interativos: lógica de decodificação pode ser facilmente alterada em tempo de execução. Essa abordagem pode ser bastante útil para desenvolvedores de protocolo - a velocidade de decodificação não é tão crítica, mas a flexibilidade e os resultados rápidos são mais importantesdecodificadores incorporáveis: pode ser usado como uma biblioteca. Esse tipo deve ter um bom desempenho e ser flexível o suficiente para usar todas as CPUs e núcleos disponíveisdescodificadores como serviço: pode ser acessado por meio de uma API limpa. Este tipo deve fornecer o melhor desempenho e eficiência da raça

Resultados

Minha solução atual é decodificadores baseados em JVM. A ideia real é reutilizar o código, eliminar a portabilidade, etc., mas ainda assim ter boa eficiência.

Descodificadores interactivos: implementado no GroovyDecodificadores incorporáveis: implementado em JavaDecodificadores como um serviço: Otimizações do Tomcat + + decodificadores incorporáveis ​​em um servlet (entrada binária, saída XML)

Problemas a serem resolvidos

Groovy fornece muito poder e tudo, mas lucra expressividade neste caso particularDecodificação de protocolo em uma estrutura de árvore é um beco sem saída - muitos recursos são simplesmente desperdiçadosO consumo de memória é um pouco difícil de controlar. Eu fiz várias otimizações, mas ainda não estou feliz com os resultados de criação de perfilTomcat com vários sinos e assobios ainda apresenta muita sobrecarga (principalmente manipulação de conexão)

Estou fazendo certo usando JVM em todos os lugares? Você vê alguma outra maneira boa e elegante de atingir o objetivo inicial: obter decodificadores de protocolo fáceis de escrever e altamente escaláveis?

O protocolo, o formato dos resultados, etc, não são fixos.

questionAnswers(3)

yourAnswerToTheQuestion