1

到目前为止,我已经尝试过这些方法:

1) 以源 IP/端口和目标 IP/端口为键进行散列。散列中的每个位置都是一个数据包列表。然后将哈希值保存在一个文件中,每个流由一些特殊字符/行分隔。问题:没有足够的内存用于大型跟踪。

2) 使用与上述相同的键进行散列,但仅将文件句柄保存在内存中。然后将每个数据包放入指向正确文件的 hash[key] 中。问题:太多的流/文件(~200k),它也可能耗尽内存。

3) 对源 IP/端口和目标 IP/端口进行哈希处理,然后将信息放入文件中。2和3的区别在于,这里每次操作都会打开和关闭文件,所以我不用担心因为我同时打开太多而导致内存不足。问题:太慢了,文件数量与 2 相同,所以也不切实际。

4) 对源 IP/端口对进行哈希处理,然后对每个流的整个跟踪进行迭代。获取属于该流的数据包并将它们放入输出文件中。问题:假设我有一个包含 200k 流的 60 MB 跟踪。这样,我会处理一个 60 MB 的文件 20 万次。也许在我迭代时删除数据包会使它不那么痛苦,但到目前为止我不确定这是否是一个好的解决方案。

5) 按 IP 源/目标拆分它们,然后为每个文件创建一个文件,用特殊字符分隔流。文件仍然太多(+50k)。

现在我正在使用 Ruby 来做这件事,我猜这可能是个坏主意。目前我已经用 tshark 过滤了这些痕迹,这样它们就只有相关信息,所以我真的不能让它们变得更小。

我考虑过使用 C#/Java/C++ 将所有内容加载到内存中,如 1) 中所述,但我想知道这里是否没有更好的方法,特别是因为即使使用更高效的方法,我以后也可能会耗尽内存如果我必须使用更大的痕迹,语言。

总之,我面临的问题是我的文件太多或内存不足。

我也尝试过搜索一些工具来过滤信息,但我认为没有。我发现的那些只返回一些统计数据,并且不会根据我的需要扫描每个流。

4

1 回答 1

1

鉴于您的情况,我可能会将跟踪写入文件,但使用 LRU(最近最少使用)缓存机制来一次保持有限数量的文件打开。如果您需要访问当前未打开的文件,请关闭最长未看到任何活动的文件,然后打开当前文件。

您可能需要调整 LRU 缓存中的文件数量以获得最佳性能。如果您有大量的短期连接,此技术将特别有效。

于 2010-04-22T07:45:45.047 回答