【问题标题】:The difference between local send size (-m) and send buffer size (-s) in netperf?netperf 中本地发送大小 (-m) 和发送缓冲区大小 (-s) 的区别?
【发布时间】:2020-10-07 23:54:58
【问题描述】:

我现在正在使用 netperf 在 Ubuntu 机器上进行带宽测试。

我在同一主机上设置了一个 netperf 客户端和一个 netperf 服务器。我在客户端和服务器之间做了一些主机内数据包转发。

但是我发现 netperf 的默认设置无法充分利用主机内带宽。

我之前用iperf3做主机内包转发带宽测试。带宽通常在 35 Gbps 左右。

当我使用netperf做主机内包转发带宽测试时,我得到的带宽只有11Gbps左右,考虑到主机内包转发带宽,这个带宽太小了。下面是 netperf 测试的输出:

在 netperf 的输出中让我感到困惑的是“发送消息大小”的含义。是数据包大小吗?但是通常当我们谈论数据包大小时,我们将其称为 MTU 大小或 MSS 大小。那么netperf中“发送消息大小”的真正含义是什么。

我也尝试将“Send Message Size”的数量改为128KB(131072B),等于“Recv Socket Size”。本次主机内包转发带宽将在35Gbps左右,有望充分利用主机内带宽。那么为什么“发送消息大小”会影响带宽的测量。这真的让我感到困惑。谁能给我一些指导?谢谢。

【问题讨论】:

    标签: performance networking linux-kernel bandwidth


    【解决方案1】:

    “发送消息大小”是任何一次“发送”调用向堆栈呈现的字节数。发送消息的大小越大,将给定数量的数据放入堆栈所需的发送调用次数就越少。

    Netperf 的默认发送消息大小是在数据套接字创建时采用发送套接字缓冲区 (SO_SNDBUF) 大小的值。如果您在 linux 系统上查看:

    sysctl net.ipv4.tcp_wmem

    您将看到第二个值(即初始大小)为 16384 字节。如果你看:

    sysctl net.ipv4.tcp_rmem

    您将看到接收套接字缓冲区 (SO_RCVBUF) 的初始值为 128K。

    Iperf3 的默认发送大小为 128K

    默认情况下(除非对套接字缓冲区大小进行明确的 setsockopt() 调用),Linux 将在连接的整个生命周期内“自动调整”套接字缓冲区的大小。 netperf 显示的是它们在连接开始时的状态。您可以使用“全向输出选择器”让其在连接结束时显示它们的状态

    $ netperf -- -O ? | grep -e "[LR]S[SR]_SIZE" LSS_SIZE_REQ LSS_SIZE LSS_SIZE_END LSR_SIZE_REQ LSR_SIZE LSR_SIZE_END RSS_SIZE_REQ RSS_SIZE RSS_SIZE_END RSR_SIZE_REQ RSR_SIZE RSR_SIZE_END

    LSS = 本地套接字发送 RSR = 远程套接字接收 _REQ 是请求的值 _END 是测试结束时的值

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 2011-12-16
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多