在繁忙的接口上进行tcpdumping时有很多丢弃的软件包


11

我的挑战

我需要做很多数据的tcpdump-实际上是从处于混杂模式的2个接口中,这些接口能够看到大量流量。

把它们加起来

  • 从2个接口以混杂模式记录所有流量
  • 这些接口分配IP地址
  • pcap文件必须每1G旋转一次
  • 当存储10 TB的文件时,开始截断最旧的文件

我目前正在做什么

现在我像这样使用tcpdump:

ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER

$FILTER包含SRC / DST过滤器,这样可以使用-i any。这样做的原因是,我有两个接口,我想在一个线程中而不是两个线程中运行转储。

compress.sh 负责将tar分配给另一个CPU内核,压缩数据,为其提供合理的文件名,然后将其移动到存档位置。

我不能指定两个接口,因此我选择使用过滤器并从any接口中转储。

现在,我不做任何内务处理,但是我计划监视磁盘,并且当我剩下100G时,我将开始擦除最早的文件-这应该没问题。

现在; 我的问题

我看到丢包了。这是从运行了几个小时的转储中收集的大约250个gpcap文件:

430083369 packets captured
430115470 packets received by filter
32057 packets dropped by kernel  <-- This is my concern

如何避免丢失这么多数据包?

我已经尝试或查看的这些东西

改变的价值/proc/sys/net/core/rmem_max/proc/sys/net/core/rmem_default它确实帮助-实际上它采取的照顾只是一半左右的丢弃的数据包。

我也研究过gulp - gulp的问题在于,它在一个进程中不支持多个接口,如果该接口没有IP地址,则会感到生气。不幸的是,在我看来,这是一个破坏交易的因素。

下一个问题是,当流量通过管道时,我无法自动旋转。获取一个巨大的10 TB文件效率不高,而且我没有一台可以运行Wireshark的具有10TB + RAM的计算机,因此就可以了。

你有什么建议吗?甚至可能是更好的方式来完全减少流量。


在我的情况下,我正在使用选项-s0,将其更改为-s1600(在MTU上方)为我解决了该问题。
LatinSuD

Answers:


11

tcpdump将传入数据存储在环形缓冲区中。如果缓冲区在tcpdump处理其内容之前溢出,则您将丢失数据包。

默认的环形缓冲区大小可能是2048(2MiB)。

要增加缓冲区大小,请添加以下-B选项:

tcpdump -B 4096 ...

您还应该尝试使用更快的磁盘存储。


我将尝试更改缓冲区大小。我几乎可以肯定,磁盘存储速度不是问题。它在转储和dd写入17 gig文件时以大约15M / sec的速度写入数据:复制了17179869184字节(17 GB),23.5737 s,729 MB / s(使用bs = 8k count = 2048k)
Hansen

7

我最终找到了可以使用的解决方案。丢弃的软件包已从.0047%降低到.00013%-起初看起来并不多,但是当我们谈论数百万个数据包时,它的确很多。

解决方案包括几件事。一种是按照迈克尔·汉普顿的建议更改环形缓冲区的大小。

另外,我创建了一个ramfs并进行了实时转储,重写了我的compress脚本,以确保将转储从ramfs移到磁盘。这只减少了很少的数量,但是值得注意的是,即使磁盘的所有测试和基准测试都表明,磁盘不应成为瓶颈,但数量却很少。我想这里的访问时间非常重要。

禁用超线程还比您想象的要多。


您是说“禁用超线程”有很大帮助吗?有什么帮助?谢谢。
贫穷的开发者,2015年

坦白说,我已经不记得具体细节了。从那时起我就改变了工作场所,但是从我写的文章看来,禁用超线程可以解决这个问题。
汉斯·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.