前几天,我在这里写了一个问题,但是这个问题是模棱两可的。 所以,我会尝试重写这个问题,解释所有细节。
我以前的消息(封闭消息): http : //goo.gl/aJqQ2
你想做什么?
我试图了解如何在模式2(Balance XOR – 默认选项layer2 )中使用bonding时select正确的mac地址。
我正在与驱动程序绑定。 我想了解所有模式(模式0,1,2,3,4,5和6)的操作。 我理解除了模式2(balance-xor)和4(802.3ad)以外,所有模式是如何工作的。 因为选项xmit_hash_policy不清楚!
我的主要问题是:我怎样才能select一个活跃的奴隶或其他从对方发送stream量到其他同行?
现在,我将详细描述我的疑问:
在我的私人实验室,我有两台电脑(PC1和PC2,运行Linux / Ubuntu的)与4个网卡。 在每台电脑上,我安装了两块网卡(网卡)。
PC1 (bond0)上的Mac地址:
MAC1(eth1): 62:25:BC:06:4F:A6 MAC2(eth2): 62:25:BC:06:59:E6
PC2上的Mac地址(bond0):
MAC4(eth1):62:25:BC:06:5A:1B MAC3(eth2):62:25:BC:06:59:E9
所以,当驱动程序绑定被加载时,我可以在每台PC上看到3个接口(bond0,eth1和eth2)(eth1和eth2是从属设备)。 但是,我的问题从这里开始,由于我无法理解内核如何select接口或其他。
有时,我注意到所有的stream量都放在同一个从设备上( 例如 ,从PC1到PC2,所有stream量将从PC1的eth1被放置在PC2的eth2 {MAC = 62:25:BC:06:59:E9} {MAC = 62:25:BC:06:4F:A6} )。 因此,按照上面的例子,如果我禁用PC2上的eth1,stream量将被发送,即使有一个接口禁用。
PC2上的接口eth1是打开还是closures并不重要。
这种行为是预期的。 但是, 我必须遵循什么策略来select正确的MAC地址(eth1或eth2)? 为什么selectpc2上的eth2? 为什么pc1上的eth1没有被选中? 我想说的是:我怎么知道我使用哪个接口将stream量从PC1发送到PC2?
我有一个公式是:
(source MAC XOR destination MAC) modulo slave count
(这个公式是从bonding.txt中提取的 – 请看下面的报价,最后)
而且我知道散列函数(我想感谢用户@Mark Wagner)
/ * *基于第2层数据的输出设备散列* / static int bond_xmit_hash_policy_l2(struct sk_buff * skb,int count){struct ethhdr * data =(struct ethhdr *)skb-> data;
if (skb_headlen(skb) >= offsetof(struct ethhdr, h_proto)) return (data->h_dest[5] ^ data->h_source[5]) % count; return 0; }
根据上面的例子(我使用PC1上的eth1和PC2上的eth2发送PC1到PC2的stream量)。 因此,我的MAC地址是:
eth1 : 62:25:BC:06:4F:A6 (PC1) eth2 : 62:25:BC:06:59:E9 (PC2)
那么,如何确定我必须在PC2上使用哪个mac地址? 为什么花了eth2而不是eth1?
用户@Mark Wagner试图帮助我,他写了下面的解释:
实际的散列函数是:
/ * *基于第2层数据的输出设备散列* / static int bond_xmit_hash_policy_l2(struct sk_buff * skb,int count){struct ethhdr * data =(struct ethhdr *)skb-> data;
if (skb_headlen(skb) >= offsetof(struct ethhdr, h_proto)) return (data->h_dest[5] ^ data->h_source[5]) % count; return 0;
}
h_dest和h_source是MAC地址。 假设默认情况下,您的债券的MAC地址是PC1:62:25:BC:06:4F:A6和PC2:62:25:BC:06:5A:1B。 count = 2。因此散列函数返回:
0xA6 ^ 0x5A%2 = 0
但我不明白如何计算异或function。 任何人都可以解释我如何计算?
谢谢!
****附录:
bonding.txt中的公式
二层
Uses XOR of hardware MAC addresses to generate the hash. The formula is (source MAC XOR destination MAC) modulo slave count This algorithm will place all traffic to a particular network peer on the same slave. This algorithm is 802.3ad compliant.
XOR真值表: http : //www.tomshardware.com/reviews/safer-6-raid-controllers,1199-2.html
让我试着为你简化这个。 当看着xmit_hash_policy想想:
接下来认为“每个层次的单一会话”。 例:
换一种方式:
通常,当您在两个节点之间进行通信时,您只有一个MAC和一个IP。 所以你只会看到一个单一的界面被使用。
假设您希望增加使用1GbE的两台服务器之间的吞吐量。 每台服务器使用4个NIC和一个绑定接口进行绑定。 这个绑定的接口,比如bond0,有一个IP和一个MAC。 在这种情况下,两台服务器之间的最大速度将达到120MB / s。
接下来,你添加一个子接口。 这基本上是一个虚拟的界面,给你另一个IP地址。 这导致在相同的绑定接口上有两个IP地址。 例如,在linux中,您将拥有bond0和bond0:1,具体取决于您如何configuration它。
如果你在第2层“哈希”,那么多个IP就不会给你任何东西。 您仍然坚持使用单个源MAC和单个目标MAC。 但是,如果你在第3层散列,司机现在可能会平衡你的传输。
如果你有一个使用多个端口的multithreading应用程序,比如说TCP端口,那么你想在第4层散列,这将进一步平衡负载。
您可以使用netperf等工具来说明这一点。 在每种情况下,您都可以使用多个IP地址或多个端口运行netperf,您将看到多个端口的stream量平衡。
但请记住,这只是传输。 接收由交换机控制。 思科可让您自定义散列策略。 下端开关让你做第2层和第3层,高端让你做第2层,第3层和第4层。
场景:
您有备份服务器,并将数据发送到NAS备份设备。 在备份服务器上使用模式4,xmit_hash_policy = layer3 + 4,并在绑定中有4个1GbE NIC。 您的备份软件被configuration为将数据发送到备份设备的IP,但它通过具有多个stream的多个TCP端口进行。
有了这个configuration数据将被发送出所有的接口,假设你有足够的stream来平衡。 它是如何决定哪里去的? 我想你有这个答案,但我不会假装理解如何。 我只知道它是从经验中得来的。
因此,可以说现在您可以以120MB / s * 4的速度传输数据(每个1GbE接口120MB / s)。 但是现在数据碰到了交换机,交换机有一个在第3层configuration了哈希策略的以太通道(Aggregation Group)。(在Cisco上可能是src-ip,dst-ip或者src-dst-ip)。 在这个例子中,我们将使用src-dst-ip。 所以现在交换机是基于源IP地址和目的IP地址进行散列的,这些IP地址总是相同的,所以它总是只能在交换机上select一个目的端口。
所以,你可以以450 + MB / s传输,目标只能以120MB / s接收。
如果交换机可以在第4层散列(思科将是src-port,dst-port或src-dst-port),则您现在可以使用全部4个端口将数据从备份服务器传输到设备。 这是假定备份设备也是绑定的。
但是如果你没有昂贵的思科交换机,又不能在第4层散列呢? 你可以创build额外的IP地址! 然后,将备份服务器configuration为使用4个不同的IP地址运行作业,并且平衡,因为交换机将根据源IP地址和目标IP地址进行散列。
其他交换机厂商有他们自己的哈希algorithm,通常基于IP和MAC(第2层和第3层)的混合。 过去我不得不为这种交换机创build静态arp条目,以便同时存在多个IP地址和多个MAC地址。
希望这可以帮助你更好地理解xmit_hash_policy是如何工作的,至less在实践中是如此。