This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM67A:当两个 DP83867 PHY 同时处于运行状态时、AM67A CPSW3G 带宽减半

Guru**** 2893300 points

Other Parts Discussed in Thread: AM67A, AM62P, BEAGLEY-AI

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1629453/am67a-am67a-cpsw3g-bandwidth-halved-when-two-dp83867-phys-are-active-at-the-same-time

器件型号: AM67A
Thread 中讨论的其他器件: AM62PBeagleY-AI

您好、

 

我们正在具有两个 DP83867 PHY 的定制电路板上使用 AM67A。 在器件树中、两个 PHY 都配置为以下节点。 当我们单独测试任一 PHY 时、我们可以达到接近 1Gbps。 但是、当同时使用两个 PHY 时、即使我们使用两台不同的 PC 和两台不同的 iperf3 服务器、两个端口上的带宽也会显著下降。

我们的测试拓扑是:

PC1 <----- > PHY1 <---->AM67A 板<----- > PHY2 <----- > PC2

iperf3 结果如下。

单 PHY 用法:

PHY1
[ ID]间隔传输比特率 RETR
[5] 0.00-10.00 秒 1.09 GB 933 MB/秒 0 发送方
[5] 0.00-10.00 秒 1.09 GB 932 MB/秒接收器

PHY2
[ ID]间隔传输比特率 RETR
[5] 0.00-10.00 秒 1.10 GB 944 MB/秒 0 发送方
[5] 0.00-10.00 秒 1.10 GB 944 MB/秒接收器

同时使用两个 PHY 时:

PHY1
[ ID]间隔传输比特率 RETR
[5] 0.00-10.00 秒 711 MB 596 Mbits/sec 0 发送器
[5] 0.00-10.00 秒 710 MB 595 MB/秒接收器

PHY2
[ ID]间隔传输比特率 RETR
[5] 0.00-10.00 秒 558 MB 468 Mbits/sec 0 发送器
[5] 0.00-10.00 秒 556 MB 467 Mbits/sec 接收器

两个 PHY 的器件树绑定如下所示:

/* ETHERNET */
&cpsw3g {
	pinctrl-names = "default";
	pinctrl-0 = <&rgmii1_pins_default>, 
				<&rgmii2_pins_default>;
	status = "okay";
};

&cpsw3g_mdio {
	pinctrl-names = "default";
	pinctrl-0 = <&cpsw3g_mdio_pins_default>;
	status = "okay";

	cpsw3g_phy0: ethernet-phy@0x0c {
		reg = <0x0c>;
		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
		ti,min-output-impedance;
	};

	cpsw3g_phy1: ethernet-phy@0 {
		reg = <0x00>;
		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
		ti,min-output-impedance;
	};
};

&cpsw_port1 {
    status = "okay";
    phy-mode = "rgmii-rxid";
    phy-handle = <&cpsw3g_phy0>;
};

&cpsw_port2 {
    status = "okay";
    phy-mode = "rgmii-rxid";
    phy-handle = <&cpsw3g_phy1>;
};

我们想了解这种行为是否与 AM67A CPSW3G 带宽或架构限制有关、或者它更有可能是由我们的电路板设计、时钟、引脚多路复用、RGMII 时序或 DTS 配置引起。

谢谢。

 
 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hasan、

    [报价 userid=“678945“ url=“~/support/processors-group/processors/f/processors-forum/1629453/am67a-am67a-cpsw3g-bandwidth-halved-when-two-dp83867-phys-are-active-at-the-same-time

    同时使用两个 PHY 时:

    PHY1
    [ ID]间隔传输比特率 RETR
    [5] 0.00-10.00 秒 711 MB 596 Mbits/sec 0 发送器
    [5] 0.00-10.00 秒 710 MB 595 MB/秒接收器

    PHY2
    [ ID]间隔传输比特率 RETR
    [5] 0.00-10.00 秒 558 MB 468 Mbits/sec 0 发送器
    [5] 0.00-10.00 秒 556 MB 467 Mbits/sec 接收器

    [/报价]

    您使用的是哪个 Linux SDK 版本?

    请问您正在运行什么特定的吞吐量测试? (即 iperf TCP 双向还是单向? 如果是单向的,是两个端口上的传入还是传出流量?)

    当两个端口同时使用时产生此吞吐量时、您能否检查 CPU 负载是多少?

    您是否还可以检查从“ethtool -S“和“ip -s link show“开始是否有任何错误或丢弃计数器递增

    [报价 userid=“678945“ url=“~/support/processors-group/processors/f/processors-forum/1629453/am67a-am67a-cpsw3g-bandwidth-halved-when-two-dp83867-phys-are-active-at-the-same-time ]我们想了解这种行为是否与 AM67A CPSW3G 带宽或架构限制有关、或者这是否更有可能是由我们的电路板设计、时钟、引脚多路复用、RGMII 时序或 DTS 配置引起。[/报价]

    我们过去在具有较低 DDR 速率(16 位、而不是 32 位)的 SoC 上注意到、当两个端口同时 发送 (未接收)时 、吞吐量也会下降、并注意到在这些条件下、在至少一个内核上的 CPU 负载往往非常高 (~80%至 90%)。 但是、在 32 位 DDR SoC(例如 AM62P)上、当两个端口同时 发送(未接收)时、我们测试过的每个端口都可实现~900Mbps。  当它在两个端口上传入/接收流量时、虽然我目前没有这方面的确切数据、但 我预计吞吐量的限制可能是由于 CPU 负载较高。 如果 CPU 负载不是很高(不是瓶颈)、则可能是由于许多不同的因素、需要对每个因素进行调查才能排除或排除:

    1.套接字缓冲区大小限制(TCP/UDP 通常有套接字缓冲区大小)

    2. DMA 描述符用尽( DMA 缓冲区的填充速度比内核处理速度快,导致超支)

    3。CPSW3G 内部主机端口 (CPSW3G 有 2 个外部端口和 1 个两个外部端口馈入的内部主机端口导致的潜在限制。 主机端口默认只有 1 个 RX 通道。 从 TX 端开始、由于 AM62P 结果显示、当两个端口都传输流量时、每个端口上的速度~900Mbit/s、已被证明是原因。 RX 端可能仍然是瓶颈)

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hasan:  

    您是否还可以检查“ip-s link show eth0“和 “ip -s link show eth1“的结果?  

    htop输出:   
      0[***$$$$$$$$$$$$$$$$$$$$$$$$ 97.3%]  任务:45、35 thr、153 kthr;4 runn

    这似乎表明至少有一个 CPU 内核饱和/负载过大、这表明这很可能是您看到的吞吐量瓶颈。 在 iperf 测试期间运行“mpstat -P all 1“应该为您提供有关可能导致重负载的更精细的信息。 例如、我期望%soft 参数具有高负载、表明以太网的 softirq 处理可能占用大量 CPU 处理。

    请注意、即使只有一个 CPU 内核饱和/负载过大、而其他内核没有负载过大、这也会被视为瓶颈。 这是因为 softirqs 仅处理一个相关硬件 IRQ 所在的内核、即使启用了 irqbalance(假设%soft 正在接管所有负载)也是如此。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    我在相同条件下重复 iperf 测试。 然后我运行命令`mpstat -P 全部为 1`。 命令输出:

    ....
    
    14:08:41 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
    14:08:42 all 0.00 0.00 5.58 0.00 0.00 22.34 0.00 0.00 0.00 72.08
    14:08:42 0 0.00 0.00 8.16 0.00 0.00 88.78 0.00 0.00 0.00 3.06
    14:08:42 1 0.00 0.00 6.06 0.00 0.00 1.01 0.00 0.00 0.00 92.93
    14:08:42 2 0.00 0.00 2.02 0.00 0.00 0.00 0.00 0.00 0.00 97.98
    14:08:42 3 0.00 0.00 6.12 0.00 0.00 0.00 0.00 0.00 0.00 93.88
    ^C
    Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
    Average: all 0.17 0.00 5.83 0.16 0.00 21.81 0.00 0.00 0.00 72.03
    Average: 0 0.00 0.00 8.28 0.00 0.00 88.16 0.00 0.00 0.00 3.56
    Average: 1 0.22 0.00 5.18 0.00 0.00 0.03 0.00 0.00 0.00 94.56
    Average: 2 0.16 0.00 3.23 0.00 0.00 0.00 0.00 0.00 0.00 96.61
    Average: 3 0.32 0.00 6.65 0.63 0.00 0.00 0.00 0.00 0.00 92.4
    
    ...


    `ip -s link show eth0`
    ```μ s
    3:eth0: MTU 1500 qdisc mq 状态 up 模式默认组缺省值 qlen 1000
      链接/醚 EC:bf:d0:b9:64:e8 brd ff:ff:ff:ff:ff:ff:ff:ff:ff:ff
      RX:  字节 数据包错误丢弃了 未命中的  mcast
       150835223 2277787       0 0    0 0     
      TX:  字节 数据包错误丢弃运营商拼贴
      22529212577 14892498   0    0    0 0     
    ```μ s

    `ip -s link show eth1`
    ```μ s
    4:eth1: MTU 1500 qdisc mq 状态 up 模式默认组缺省值 qlen 1000
      链路/醚 4a:7c:0f:29:A2:F5 brd ff:ff:ff:ff:ff:ff:ff:ff:ff
      RX:  字节数据包错误丢弃了 未命中的  mcast
        42297156 704938   0 0 0 0             
      TX:  字节数据包错误丢弃运营商拼贴
      11702395353 7743050       0 0 0 0         
    ```μ s

    感谢您的关注。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hasan:  

    14:08:41 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
    14:08:42 0 0.00 0.00 8.16 0.00 0.00 88.78 0.00 0.00 0.00 3.06

    正如我所怀疑的那样、至少有一个 CPU 内核(本例中为 CPU0)饱和、其中%soft 对负载的贡献最大。 这是您所看到的吞吐量的瓶颈。 其他 CPU 内核大部分处于空闲状态。 两个端口上流量的以太网 IRQ 很可能都连接到 CPU0、从而导致饱和。 由于以太网 IRQ 的数量是以太网 IRQ 的两倍(两个端口)、CPU 内核的加载速度可能是原来的 2 倍、与仅运行一个端口相比、每个端口的吞吐量可能会降低 50%。

    我想知道我们可以尝试做些什么来尝试平衡处于空闲状态的其他 CPU 内核的负载。 首先、您可以查看“cat /proc/interrupts | grep Ethernet“吗? 运行时、您将看到在两个以太网端口之间共享的总共 8 个 TX IRQ。 不清楚哪个端口使用哪个 TX IRQ、因为这可能会动态更改。 因此、我们想首先检查是否仅在一个内核(即测试中的 CPU 内核 0)上命中所有 TX 中断。 在这种情况下、则将每个 TX IRQ 映射到不同的 CPU 内核、以便对其进行平衡。 确保在映射之前禁用 irqbalance。 然后测试并查看各个内核之间的 CPU 负载是否更加平衡以及吞吐量是否有所改善。 请参阅下面的示例。

    root@am62xx-evm:~# cat /proc/interrupts | grep ethernet                            
    116:          5  397522282          0          0  MSI-INTA 1970707 Level     8000000.ethernet-tx0
    124:          0        292          0          0  MSI-INTA 1970715 Level     8000000.ethernet-tx1
    132:          0          0         15          0  MSI-INTA 1970723 Level     8000000.ethernet-tx2
    140:          0          0          0   55284375  MSI-INTA 1970731 Level     8000000.ethernet-tx3
    148:         12          0          0          0  MSI-INTA 1970739 Level     8000000.ethernet-tx4
    156:          0      29534          0          0  MSI-INTA 1970747 Level     8000000.ethernet-tx5
    164:          0          0         26          0  MSI-INTA 1970755 Level     8000000.ethernet-tx6
    172:          0          0          0      36043  MSI-INTA 1970763 Level     8000000.ethernet-tx7
    206:         55  397547439          0          0  MSI-INTA 1971731 Level     8000000.ethernet-rx0
    
    #Disable irqbalance 
    pkill irqbalance
    
    #Check irqbalance disabled
    ps -eL -o pid,tid,class,rtprio,ni,pri,comm,args | grep irqbalance
    
    #Make sure to change the irq numbers to match yours from /proc/interrupts
    root@am62xx-evm:~# echo 1 > /proc/irq/116/smp_affinity
    root@am62xx-evm:~# echo 2 > /proc/irq/124/smp_affinity
    root@am62xx-evm:~# echo 4 > /proc/irq/132/smp_affinity
    root@am62xx-evm:~# echo 8 > /proc/irq/140/smp_affinity
    root@am62xx-evm:~# echo 1 > /proc/irq/158/smp_affinity
    root@am62xx-evm:~# echo 2 > /proc/irq/156/smp_affinity
    root@am62xx-evm:~# echo 4 > /proc/irq/164/smp_affinity
    root@am62xx-evm:~# echo 8 > /proc/irq/172/smp_affinity

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    首先、您能否查看“cat /proc/interrupts | grep Ethernet“? 运行时、您将看到在两个以太网端口之间共享的总共 8 个 TX IRQ。 [/报价]

    我检查了“cat/proc/interrupts“是否存在以太网中断。 没有预期的 8 个 TX IRQ。  

    $ sudo cat /proc/interrupts | grep -i ethernet
    160:    1337431          0          0          0  MSI-INTA 1970707 Level     8000000.ethernet-tx0
    250:     298791          0          0          0  MSI-INTA 1971731 Level     8000000.ethernet
    365:          0          0          0          0     GICv3 134 Level     8000000.ethernet
    


    我无法尝试后续步骤。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hasan:  

    很奇怪、只有一个 TX IRQ 出现。 为了澄清一下、 在器件树或 dtsi 文件中是否定义了此行?  https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi?h=ti-linux-6.12.y-cicd#n726 您是否对器件树中的 CPSW 节点进行了任何修改?

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:  

    是、它们被定义为相同。 cpsw3g 节点没有额外的配置相关中断。 以下是我所做的配置。

    /* ETHERNET */
    &cpsw3g {
    	pinctrl-names = "default";
    	pinctrl-0 = <&rgmii1_pins_default>, 
    				<&rgmii2_pins_default>;
    	status = "okay";
    };
    
    &cpsw3g_mdio {
    	pinctrl-names = "default";
    	pinctrl-0 = <&cpsw3g_mdio_pins_default>;
    	status = "okay";
    
    	cpsw3g_phy0: ethernet-phy@0x0c {
    		reg = <0x0c>;
    		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
    		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
    		ti,min-output-impedance;
    	};
    
    	cpsw3g_phy1: ethernet-phy@0 {
    		reg = <0x00>;
    		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
    		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
    		ti,min-output-impedance;
    	};
    };
    
    &cpsw_port1 {
        status = "okay";
        phy-mode = "rgmii-rxid";
        phy-handle = <&cpsw3g_phy0>;
    };
    
    &cpsw_port2 {
        status = "okay";
        phy-mode = "rgmii-rxid";
        phy-handle = <&cpsw3g_phy1>;
    };

    cpsw3g 节点定义来自“k3-am62p-main.dtsi“文件。 我分享了下面的相关部分。

    	cpsw3g: ethernet@8000000 {
    		compatible = "ti,am642-cpsw-nuss";
    		#address-cells = <2>;
    		#size-cells = <2>;
    		reg = <0x00 0x08000000 0x00 0x200000>;
    		reg-names = "cpsw_nuss";
    		ranges = <0x00 0x00 0x00 0x08000000 0x00 0x200000>;
    		clocks = <&k3_clks 13 0>;
    		assigned-clocks = <&k3_clks 13 3>;
    		assigned-clock-parents = <&k3_clks 13 11>;
    		clock-names = "fck";
    		power-domains = <&k3_pds 13 TI_SCI_PD_EXCLUSIVE>;
    
    		dmas = <&main_pktdma 0xc600 15>,
    		       <&main_pktdma 0xc601 15>,
    		       <&main_pktdma 0xc602 15>,
    		       <&main_pktdma 0xc603 15>,
    		       <&main_pktdma 0xc604 15>,
    		       <&main_pktdma 0xc605 15>,
    		       <&main_pktdma 0xc606 15>,
    		       <&main_pktdma 0xc607 15>,
    		       <&main_pktdma 0x4600 15>;
    		dma-names = "tx0", "tx1", "tx2", "tx3", "tx4", "tx5", "tx6",
    			    "tx7", "rx";
    
    		ethernet-ports {
    			#address-cells = <1>;
    			#size-cells = <0>;
    
    			cpsw_port1: port@1 {
    				reg = <1>;
    				ti,mac-only;
    				label = "port1";
    				phys = <&phy_gmii_sel 1>;
    				mac-address = [00 00 00 00 00 00];
    				ti,syscon-efuse = <&wkup_conf 0x200>;
    			};
    
    			cpsw_port2: port@2 {
    				reg = <2>;
    				ti,mac-only;
    				label = "port2";
    				phys = <&phy_gmii_sel 2>;
    				mac-address = [00 00 00 00 00 00];
    			};
    		};
    
    		cpsw3g_mdio: mdio@f00 {
    			compatible = "ti,cpsw-mdio","ti,davinci_mdio";
    			reg = <0x00 0xf00 0x00 0x100>;
    			#address-cells = <1>;
    			#size-cells = <0>;
    			clocks = <&k3_clks 13 0>;
    			clock-names = "fck";
    			bus_freq = <1000000>;
    			status = "disabled";
    		};
    
    		cpts@3d000 {
    			compatible = "ti,j721e-cpts";
    			reg = <0x00 0x3d000 0x00 0x400>;
    			clocks = <&k3_clks 13 3>;
    			clock-names = "cpts";
    			interrupts-extended = <&gic500 GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
    			interrupt-names = "cpts";
    			ti,cpts-ext-ts-inputs = <4>;
    			ti,cpts-periodic-outputs = <2>;
    		};
    	};

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hasan、  

    您能否提供完整的引导日志+“cat /proc/interrupts “?

    基于以下版本组件使用的 SDK。
    pv:aArch64 =“6.12.24+git“          
    分支:aArch64 =“v6.12.24-ti-arm64-R43-T3-gem-o1“

    您能否 从 https://www.ti.com/tool/download/SDK-AM67A 中确认 PROCESSOR-SDK-LINUX 是否与 11.00.00.08 相同 ?

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    我已将完整引导日志和“cat /proc/interrupts “输出作为日志文件附加。 我正在使用源自 TI 提供的 SDK 的 SDK、但我不知道确切的相应 TI 标签。

    e2e.ti.com/.../cat_2D00_proc_2D00_interrupts.txt

     
    e2e.ti.com/.../ethernet_2D00_bw_2D00_halved_2D00_boot_2D00_log.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hasan、  

    道林已经不在办公室,接下来将返回。 请期待收到延迟的回复。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hasan:  

    对延迟的回复表示歉意。  我获得了一个也使用 AM67A SoC 的 BeagleY-AI 板、发现它也显示了“cat /proc/interrupts | grep Ethernet“的相同结果、因为只启用了 1 个 TX IRQ。 我计划对该电路板的 DTB 进行反编译、并确定当应为 8 时为什么只启用 1 个 TX IRQ。 我们重申为什么要尝试启用多个 TX IRQ、目标是能够通过将不同的 TX IRQ 映射到不同的 CPU 内核来分散整个内核的 CPU 使用情况、因为目前仅一个 CPU 内核上的吞吐量受到饱和的限制。  

    同时、我们还发现 iperf3 是一个单线程应用程序、这也可能是仅在一个 CPU 内核上存在瓶颈的原因。 使用 iperf2 等多线程应用程序进行测试可能值得一试。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Daolin:

    感谢您在我遇到的硬件上复制并测试了此问题。 我期待着您的建议。 了解硬件限制有助于指导我们的设计决策。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hasan:  

    我只是想更新一下、我已解析 DTB、但等待获得一些关于解析 DTB 的内部反馈。 我需要与之交谈的开发人员可能会在下周前离开办公室、因此这需要一些时间。

    与此同时、我们还发现 iperf3 是一个单线程应用程序、这也可能是仅在一个 CPU 内核上存在瓶颈的原因。 尝试使用多线程应用程序(如 iperf2)进行测试可能是值得的。

    除了尝试 iperf2 而不是 iperf3 之外,您还可以尝试增加合并吗?  

    示例: ethtool -C ethX rx-usec 100

    *但适用于两个 eth 端口

    -道林