【问题标题】:netperf socket size vs buffer set for send/recv calls?netperf 套接字大小与发送/接收调用的缓冲区集?
【发布时间】:2021-03-15 03:09:30
【问题描述】:
当我尝试使用 netperf 实现基准测试件时,我碰巧读到了它的 manual。我从哪里得到这个查询
在 TCP_STREAM 特定测试中,有一个选项可以提及 -s 和 -S 来分别指定本地(netperf 客户端)、远程(netperf 服务器)套接字缓冲区大小。那是常规的 BSD 套接字大小吗?还有一个选项可以指定本地发送消息大小-m和远程接收消息大小-M;这是所有 TCP/IP 封装后的总消息大小吗?任何人都可以对此有所了解。如果你能用一个用例来说明为什么我们需要这些单独的参数,那就太好了,因为 BSD 套接字大小似乎是这里的上限。
【问题讨论】:
标签:
linux
sockets
networking
tcp
microbenchmark
【解决方案1】:
套接字缓冲区大小(通过 -s 和 -S 设置)将通过影响接收方的广告窗口(将基于 SO_SNDBUF)或多少数据来控制一次连接上可能有多少未完成的数据发送方可以等待确认(这将基于 SO_SNDBUF)。
发送和接收消息大小(-m 和 -M)控制在任何一次“发送”(-m)中呈现多少数据或在任何一次“接收”(-M)调用中请求多少数据。
由于 TCP 是一种流协议,因此使用大于套接字缓冲区的字节数进行发送调用是完全合法/可能的。当套接字阻塞时(如 netperf 所使用的),它只是意味着发送调用将保留在那里,直到它的最后一个字节被放入发送套接字缓冲区。在接收端,可以在一次接收中处理超过套接字缓冲区的数据,但语义是这样的,调用将返回,但如果有的话,当时碰巧有多少字节,并且会如果调用时套接字缓冲区为空(同样因为 netperf 使用阻塞套接字/调用),则返回返回的字节数。