V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
creeeeezy
V2EX  ›  NAS

请教网络聚合失败的问题

  •  
  •   creeeeezy · 35 天前 · 2105 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    家里的网络架构大致如下,Windows server 上通过 NIC teaming 将两个 2.5G 网口聚合在一起。

    但实测的时候,从 Mac 上无论是 iperf3 还是 smb 传文件都只达到了 2.5G 的速度。

    请教各位帮忙看看问题可能出在哪?

    https://i0.img2ipfs.com/ipfs/QmYMNRPfXaXVx6TzqL4fWjpAEAtwGu5Pu5zmU8UT56z37Y?filename=%E6%88%AA%E5%B1%8F2024-11-21%2010.58.57.png

    第 1 条附言  ·  35 天前
    之前 Windows server 这台机器装的 NAS 系统提供的网卡聚合,是可以让速度达到 5G 的。底层应该是 Linux 的网卡 bonding
    31 条回复    2024-11-23 00:06:48 +08:00
    0x663
        1
    0x663  
       35 天前
    数据先流转到路由器然后再分发给你的 mac 吧?我觉得可能是这样,你换个 10G 得路由器试试。
    mohumohu
        2
    mohumohu  
       35 天前
    小米的是傻瓜交换机吧,支持聚合吗?
    shika
        3
    shika  
       35 天前 via Android
    聚合模式是什么?
    opengps
        4
    opengps  
       35 天前
    聚合提高网速本身得有多个连接,你 smb 拷贝文件有可能只是在用一个连接
    chachi
        5
    chachi  
       35 天前
    用 win 作为客户端测试下
    mac 的 smb 有点一言难尽
    Karte
        6
    Karte  
       35 天前
    先确定下是每个端口都有 10G, 还是总工 10G
    realpg
        7
    realpg  
       35 天前
    只能跑 2.5G 是正常的 能跑到 5G 才不对
    dode
        8
    dode  
       35 天前
    试试 smb 多链路
    dreamage
        9
    dreamage  
       35 天前
    iperf3 -c <server_ip> -P <num_threads> 搞 10 个线程试试
    creeeeezy
        10
    creeeeezy  
    OP
       35 天前
    @0x663 之前 Windows server 这台机器装的 NAS 系统提供的网卡聚合,是可以让速度达到 5G 的。底层应该是 Linux 的网卡 bonding
    creeeeezy
        11
    creeeeezy  
    OP
       35 天前
    @realpg 之前 Windows server 这台机器装的 NAS 系统提供的网卡聚合,是可以让速度达到 5G 的。底层应该是 Linux 的网卡 bonding
    creeeeezy
        12
    creeeeezy  
    OP
       35 天前
    @Karte 每个端口 10G 。并且就算是总共,也要能跑到 5G 才合理吧?
    creeeeezy
        13
    creeeeezy  
    OP
       35 天前
    @shika 用的 NIC Teaming ,聚合模式是 SwitchIndependent ,负载均衡是 Dynamic
    creeeeezy
        14
    creeeeezy  
    OP
       35 天前
    @mohumohu NIC Teaming 应该不需要交换机支持的
    LGA1150
        15
    LGA1150  
       35 天前 via Android
    L2 聚合一般使用哈希来均衡流量,需要多个客户端或多条 TCP 连接才有效果。要想均衡单条 TCP 只能用 balance-rr 模式,且有可能因为 TCP 乱序导致负优化。
    LGA1150
        16
    LGA1150  
       35 天前
    @LGA1150 #15 补充:Windows Server 不支持 balance-rr 模式
    shika
        17
    shika  
       35 天前 via Android   ❤️ 1
    我查了半天的结论是,在交换机侧不做配置的情况下,无论是 windows 的 nic 组合还是 Linux 的 bonding ,似乎都不能实现你想要的带宽叠加(Linux 的 bonding mode 5 和 6 有点儿不太确定)。想问一下,NAS 系统下你是如何测试带宽的呢,带宽叠加可能是 SMB 多通道的功劳,而不是 Linux 的网卡 bonding 。
    creeeeezy
        18
    creeeeezy  
    OP
       35 天前
    @LGA1150 嗯,原来如此。

    之前我在 NAS 系统下,确实用的 balance-rr 模式。
    creeeeezy
        19
    creeeeezy  
    OP
       35 天前
    @shika 我是 `iperf3 -c xxx -P 4` 测试的。但确实是用的上面兄弟说的 balance-rr 模式。
    creeeeezy
        20
    creeeeezy  
    OP
       35 天前
    @LGA1150
    @shika

    那这么看来很多 NAS 设备宣传吹嘘的多个网口链路聚合,其实都是没什么卵用的了
    kuanat
        21
    kuanat  
       35 天前   ❤️ 4
    OP 描述的现象的实质与单链路和多链路没有关系,我这里简单解释一下,就以 OP 的环境为例,L2 交换机没有端口聚合的功能。

    L2 交换机的工作原理是根据 MAC 将数据包发送到特定的物理端口上,物理端口对应设备的 MAC 是通过记忆或者 arp 协议来更新的。L2 链路聚合会使聚合的 NIC 设备共享相同的 MAC 。

    设想客户端 MacBook 通过 smb 协议访问 Win/Linux 资源,这是个单链路的请求,到达交换机端口的时候,不同交换机可能有不同处理方式,不管怎么样,都只会通过一个口到达 Win/Linux 。

    由于 Win 不支持 round robin 的平衡模式,所以返回数据一样只会走聚合链路中的一个。这是常说的单链路无法超过单一接口最大速率的情况。Linux bonding 的区别在于,返回数据(包)会轮流经由两个网卡发送,所以可以同时利用两个 NIC 的带宽。当这些数据包到达交换机的时候,又会被交换到客户端的那一个端口上。

    能够实现这个效果的原理就在于 linux bonding balance-rr 这个实现。其他的负载平衡方式主要看 hash 参数,也有些自适应的模式能达到类似效果。更底层的原因是 linux 网络栈是内核实现,来源不同的包只要具有相同的元组就可以被内核转交给应用程序正常处理,而应用程序构造的数据包交由内核之后,经由什么途径发出与应用程序无关。

    这个实现对交换机没有要求,如果交换机可以对两个端口做聚合会更好一些,这样就不需要反复更新 MAC 与端口的绑定。可能存在的问题是乱序,即顺序包经由两个 NIC 到达交换机时先后顺序错乱了。双 NIC 聚合可能还好,数量越多 rr 模式越可能产生乱序。


    PS

    上面说得可能有些抽象,如果有 socket 编程经验可能更容易理解一些。

    关键点是网络栈是内核实现,协议/IP/端口这些都是属于内核的,而不是属于某个应用的,同样也不属于某个网络设备。应用只能通过 bind 之类的方法获得 IP 端口的使用权,内核收到的数据包,把内部应用层的部分交给应用程序。应用程序处理完毕后,发出的数据包实际还要回内核,由内核包装上外层协议并完成路由(一般说的四表五链),最终到达网络设备 NIC 的时候,再做 L2 层封装上 MAC 等等发送出去。

    所以本质上应用层面上的单链路是否经由物理层面的单通道发送是不相关的两件事,正因为这种架构上的解耦,最终才能够实现单链路带宽翻倍的效果,同时还不需要特定的交换机支持。
    porrt8
        22
    porrt8  
       34 天前
    @kuanat 请教下如果是跑 iperf 多线程模式的话,会被认作是多链路并使端口聚合在数据表现上生效嘛?
    creeeeezy
        23
    creeeeezy  
    OP
       34 天前
    @kuanat 大体看懂了,感谢老哥讲解。
    Ipsum
        24
    Ipsum  
       34 天前 via Android
    交换机不支持 lacp 怕是很难做呀
    kk2syc
        25
    kk2syc  
       34 天前
    @creeeeezy #20 厂家宣传吹嘘的场景是需要一台网管型交换机的,两个端口做 LACP 汇聚或者静态汇聚,设备面也要支持对应的模式。
    shika
        26
    shika  
       34 天前 via Android
    balance-rr 模式交换机侧可以不做配置吗?涨知识了
    @kuanat
    mingtdlb
        27
    mingtdlb  
       34 天前
    聚合得看是哪一种,主备就不行。还有,聚合一般是基于流的负载分担,so 你多起两个 iperf ,才知道能不能满速
    kuanat
        28
    kuanat  
       34 天前
    @porrt8 #22

    没有关系,多链路的数据包也可以经过多网卡发送。多线程的情况下可以在不支持 rr 平衡模式的时候提供更好的带宽利用率,只是每个线程都无法超过单个网卡的最大带宽。
    kuanat
        29
    kuanat  
       34 天前   ❤️ 1
    @shika #26

    balance-rr 还有 tlb/alb 都不需要特定交换机支持,具体可以看 linux bonding 的文档。

    但这个行为确实与交换机有关,当启用 balance-rr 的时候,在交换机看来多个端口对应设备的 MAC 地址在反复切换,交换机会有异常的表现。一般来说管理功能越高级的越可能出问题,傻瓜型的往往没有影响。
    shika
        30
    shika  
       34 天前 via Android
    @kuanat 感谢解答!
    0xD800
        31
    0xD800  
       33 天前
    高手好多,希望有朝一日我也能跟你们讨论。!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2668 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:31 · PVG 23:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.