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

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

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

已更新,包括操作系统/硬件详细信息:

Dell PowerEdge 1950,双四核 Xeon X5460 @ 3.16GHz Broadcom 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

答案1

如果不知道丢包的原因,就不可能知道这样做是否有用。您的分析从根本上来说是正确的——如果中断到达(得到服务)的频率较低,则缓冲区填满的可能性更大,其他条件相同。但是,如果您不知道丢包的原因,就无法判断进行这种更改是否会改善这种情况。

就我个人而言,我发现将优质网卡和优质驱动程序安装到优质服务器中可以解决我的所有问题。这比花几天时间苦苦研究调试数据便宜多了。

答案2

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

wmem_default不过,查看您的网络参数,我会增加默认缓冲区大小。我最近部署的高频交易系统设置有更高的rmem_default设置。尝试使用“8388608”启动,看看是否有帮助。这是一个基本的更改,但通常是第一步...

我还会考虑更改您的(可能是自定义的)应用程序的实时优先级。您是否使用任何形式的 CPU 亲和性(任务集您的应用或包装器脚本中是否包含实时优先级 (cgroups)?您的应用的实时优先级如何?查看chrt 命令及其选项看看哪种方法适合您的情况。您的应用程序是多线程的吗?

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

现在,至于您使用的硬件,如果这是用于 HFT,那么您就落后了;CPU 和架构变化确实有三次飞跃……Nehalem(5500 系列)比您使用的 5400 系列在技术上有了很大的飞跃。Westmere(5600)甚至更好。Sandy Bridge 比 5500/5600 有了很大的变化,足以促使我的环境中再次进行硬件更新。

听起来你也使用板载网卡。处理 Broadcom 时,我们需要克服一些困难……但你还没有到那一步。当你遇到丢包时,CPU 负载如何?你在捕获过程中遇到什么类型的数据流速率?这可能这只是你的系统没有跟上的情况。

这里有很多旋钮需要调整/微调。不过,更好地了解您正在使用的内容将有助于我们缩小范围。

编辑:您提到了 Red Hat。EL5 和 EL6 的选项不同,但上述建议在理论上确实适用。

编辑:你使用 RHEL 6 很好。你可以做很多事情。尝试设置应用程序的优先级并进行测试。另一个有用的指南是RHEL MRG 调整指南。并非所有功能都可用于您的内核,但是这将为您提供一些想法和解释,让您了解可以修改哪些内容以获得更确定的性能。

相关内容