中断合并高带宽数据包捕获?

我有一个应用程序,从一个以太网卡捕获数据包。 偶尔会看到数据包丢失(我们怀疑是由于网卡或内核的缓冲区溢出)。 我试图弄清楚打开中断合并是否会帮助或恶化这种情况。 一方面,由于处理的中断应该较less,因此CPU的工作量应该较less,另一方面,如果IRQ不是经常处理的话,缓冲区溢出的可能性就越大。 这是否意味着我应该打开它并增加rmem_max设置的大小?

已更新为包含OS / HW详细信息:

戴尔PowerEdge 1950双核四核至强X5460 @ 3.16GHz博通NetXtreme II BCM5708 Linux操作系统

proc/sys/net/core dev_weight 64 netdev_budget 300 rmem_default 110592 somaxconn 128 wmem_max 16777216 xfrm_aevent_rseqth 2 message_burst 10 netdev_max_backlog 65536 rmem_max 16777216 warnings 1 xfrm_acq_expires 30 xfrm_larval_drop 1 message_cost 5 optmem_max 20480 rps_sock_overflow_entries 0 wmem_default 110592 xfrm_aevent_etime 10 

不知道你为什么丢包,不可能知道它是否会有帮助。 你的分析从根本上说是正确的 – 如果中断到达(服务)的次数减less,缓冲区填充的可能性就更大,所有的事情都是平等的。 如果你不知道为什么你会丢失数据包,那么你不知道做出这样的改变是否会改善情况。

就我个人而言,我发现把高质量的网卡和优秀的驱动程序投入到高质量的服务器中,使我所有的问题都消失了。 通过debugging数据,花费更多的时间。

好吧,你还没有给出一些基本的信息(如特定的操作系统发行版或内核版本)。 这很重要,因为sysctl / kernel设置默认在不同的发行版上是不同的,某些Linux系统中并没有公开某些可调参数。 您从2008年开始使用服务器,那么我们如何知道您的操作系统和内核不是来自同一个时代?

看看你的networking参数,但是,我会增加默认的缓冲区大小。 最近我部署的高频交易系统设置有更高的wmem_defaultrmem_default设置。 尝试“8388608”开始,看看是否有帮助。 这是一个基本的变化,但通常是第一步…

我也会考虑改变你的(可能是自定义的)应用程序的实时优先级。 您是否在应用程序或包装脚本中使用了任何forms的CPU关联( taskset ,cgroups)? 你的应用程序的实时优先级怎么样? 查看chrt命令及其选项,以查看适合您的情况的选项。 你的应用程序是multithreading的吗?

幸运的是,5400系列CPU没有超线程处理,但是您的其他BIOS设置如何? 你是否禁用了电源pipe理和C状态? 系统上是否有不必要的守护进程? irqbalance运行?

现在,至于你使用的硬件,如果这个如果是HFT使用的话,你就落后了; 从字面上看,三款处理器在CPU和架构上都有所改变… Nehalem(5500系列)在技术上比你使用的5400系列有了大幅度的提升。 Westmere(5600)更好。 Sandy Bridge在5500/5600上做了足够大的改动,以刺激我的环境中的另一个硬件更新。

这听起来像你正在使用机载网卡。 与Broadcom打交道时,我们需要跳过一些圈子……但是,你还没有到那个时候。 遇到丢包时,CPU的负载情况如何? 您在捕获过程中遇到什么types的数据stream量? 这可能只是你的系统没有跟上的情况。

这里有很多旋钮可以调整/调整。 但是,更好地理解你正在使用的内容将有助于我们缩小范围。

编辑:你提到红帽。 EL5和EL6的选项不同,但上述build议在理论上是适用的。

编辑:这是很好,你在RHEL 6.有很多你可以做的。 尝试设置您的应用程序的优先级和testing。 另一个有用的指导是RHEL MRG调优指南 。 并不是所有的function都可用于你的内核,但是这会给你一些想法和解释,你可以修改一些更确定的性能。