微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

netperf中的本地发送大小-m和发送缓冲区大小-s之间的差异?

如何解决netperf中的本地发送大小-m和发送缓冲区大小-s之间的差异?

我现在正在使用netperf在Ubuntu计算机上进行一些带宽测试。

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

但是我发现netperf的认设置不能完全利用主机内带宽。

我以前使用iperf3进行主机内数据包转发带宽测试。而且带宽通常约为35 Gbps。

当我使用netperf进行主机内数据包转发带宽测试时,我获得的带宽仅为11 Gbps,考虑主机内数据包转发带宽时,该带宽太小。以下是netperf测试的输出

enter image description here

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

我还尝试将“发送消息大小”的数量更改为128KB(131072B),该数量等于“接收套接字大小”。这次主机内数据包转发带宽将约为35 Gbps,这有望充分利用主机内带宽。那么,为什么“发送消息大小”会影响带宽的测量。这真的让我感到困惑。谁能给我一些指导?谢谢。

解决方法

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

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 是测试结束时的值

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。