背景
有一个著名的工具叫做Wireshark。我已经使用它很多年了。这很棒,但性能是问题。常见的使用场景包括几个数据准备步骤,以便提取数据子集以供稍后分析。如果没有这一步,过滤需要几分钟的时间(有很大的痕迹,Wireshark 几乎无法使用)。
实际的想法是创建一个更好的解决方案,快速、并行和高效,用作数据聚合器/存储。
要求
实际要求是使用现代硬件提供的所有电源。我应该说有不同类型的优化空间,我希望我在上层做得很好,但技术是现在的主要问题。根据当前的设计,有几种数据包解码器(解析器):
- 交互式解码器:解码逻辑可以在运行时轻松更改。这种方法对协议开发人员非常有用——解码速度不是那么关键,但灵活性和快速结果更重要
- 嵌入式解码器:可以用作库。这种类型应该具有良好的性能并且足够灵活以使用所有可用的 CPU 和内核
- 解码器即服务:可以通过干净的 API 访问。这种类型应该提供最好的品种性能和效率
结果
我目前的解决方案是基于 JVM 的解码器。实际的想法是重用代码,消除移植等,但仍然有很好的效率。
- 交互式解码器:在 Groovy 上实现
- 可嵌入解码器:在 Java 上实现
- 解码器即服务:Tomcat + 优化 + 嵌入到 servlet 中的解码器(二进制输入,XML 输出)
需要解决的问题
- Groovy 提供了强大的功能和一切,但在这种特殊情况下很幸运
- 将协议解码为树形结构是一条死胡同——太多的资源被浪费了
- 内存消耗有点难以控制。我做了一些优化,但仍然对分析结果不满意
- 各种花里胡哨的 Tomcat 仍然会引入很多开销(主要是连接处理)
我在任何地方都使用 JVM 做得对吗?您是否看到任何其他好的和优雅的方式来实现最初的目标:获得易于编写、高度可扩展和高效的协议解码器?
结果的协议、格式等不固定。