我们有一个Linux防火墙,带有两个面向外的10Gbe适配器(Intel 82599EB)和一个面向内部的10Gbe适配器(Intel 82598EB)。
我遇到的问题是防火墙只能以非常低的速率转发入站stream量:大约<2 Mbps。 但是,从防火墙到“内部”机器的直接连接速度为〜6 Gbps,而从外部机器直接连接到防火墙的速度为〜1 Gbps。 有一些调整要清楚,但他们performance出Gbps的速度。
我们最近将英特尔ixgbe驱动程序从版本2.1.4更新到3.7.14,因为2.1.4驱动程序的稳定性问题(locking),这似乎是吞吐量问题开始的时候。
我也尝试了3.7.17版本,但是它的性能与3.7.14相似。 在恢复到2.1.4的驱动程序(重新编译为更新的内核,IXGBE_NO_LRO和IXGBE_NO_NAPI),我能够获得〜Gbps的吞吐量(在TCP上有3个线程的情况下,利用iperf获得约900 Mbps的吞吐量)。
这解决了眼前的问题,但我宁愿能够使用当前版本的驱动程序,因为我想跟上bug修复等等,所以,我的问题是
具体来说,我怎样才能找出内核/ iptables /networking驱动程序等在转发数据包时花费他们的时间?
任何有关的意见,将不胜感激。
真的很奇怪,你只能得到1 Gbps的路由性能(即使是严格的过滤通常意味着在同一个设备的内核空间中有2个拷贝,可能是路由的4倍) – 一年前有一个LKML的post,你可以得到120Gbps的路由性能在使用ixgbe设备的2.6.3X系列上。 我主要使用英特尔10GbE网卡,通常在交换基础设施上使用iperf获得1000MByte / s +。
首先,您需要检查系统在端点之间如何使用类似iperf的普通TCP进行检查。 这应该给你一个基线。 记住,如果你需要10Gbps的线速,很多东西都会起作用。 在Nehalem之前的平台上,这甚至是不可能实现的。 此外,系统负载应该与NUMA布局相匹配,并且必须将NIC连接到相同的PCI复合体(如果卡在<8 Gbps时,这一点很重要)。 ixgbe源代码发行版有一个IRQ固定脚本(这也禁用像省电和irqbalancer这只会搞砸高速caching,而不是拓扑感知)的东西,应该将RX-TX队列平均布置在所有核心(没有检查他们在一段时间)。
关于你的定时问题,你需要一个内核与分析支持和像oprofile一样的系统级别分析器。
在您启用数据包过滤或路由并发布之前,将您的端点解决scheme解决。
几个月前,我花了很多精力来优化用于线速千兆路由和大量小包的Linux。 这是为了负载均衡器(IPVS)而不是NAT防火墙。 这里有一些基于此的技巧。
我还没有看到每个内核networkingfunction花费的时间,例如交换vs路由vs防火墙vs什么。
Iptables实际上是Linux系统的高效防火墙。 它可以处理大量的stream量,而不会因为你写了一个好的规则而开始瓶颈。
你可以做的一件事是通过刷新所有规则来禁用iptables,并将默认的FORWARD策略设置为ACCEPT 。 这样你可以消除任何关于你的iptables实现的担心。 之后,您可以查看networking驱动程序,并尝试debugging问题,如果它仍然存在。
作为一个build议,小心,不要禁用iptables在公众可访问的机器上,除非你知道你在做什么。
单向灌注性能可能由TCP分段卸载和NIC上的其他设置引起。 在很多情况下可能会出现这种情况,例如虚拟机或VPNstream量通过物理网卡。 使用ethtool并检查性能很容易,所以值得尝试(确保在两个端点上禁用它进行testing)。
/usr/sbin/ethtool -K eth0 tso off /usr/sbin/ethtool -K eth0 lro off
这是一个更多的背景:
http://www.peerwisdom.org/2013/04/03/large-send-offload-and-network-performance/ https://social.technet.microsoft.com/Forums/windowsserver/en-US/bdc40358- -大送-被启用很慢,networking性能与英特尔网卡-时,TCP卸载-45c8-4c4b-883B-a695f382e01a /?论坛= winserverhyperv