我注意到,broadcom 和 Intel NIC 都允许您调整传输和接收缓冲区的数量(缓冲区数量越多,内存使用量也就越大)。
这些缓冲区如何工作:
- 它们的尺寸是多少?
- 如果有的话,缓冲区与 TCP 或以太网会话有什么关系?(即每个会话 1 个缓冲区或一个缓冲区池?)
答案1
嗯,关于网卡缓冲区有一些建议,一般来说越多越好:
http://book.opensourceproject.org.cn/sysadmin/apache/apachetomcat/opensource/090.html
将 Web 服务器上网络接口卡上的接收缓冲区设置为最大值。这样可以减少丢包数量并减少 TCP 重传。您可以通过转到“开始”|“设置”|“控制面板”|“网络和拨号连接”来设置此参数。选择活动 LAN 连接(通常称为“本地连接”)。右键单击以选择“属性”。单击网络接口卡旁边的“配置”按钮。将接收缓冲区设置为最大值 1024。
...
您可能想知道执行上述操作的利弊。弊端是操作系统需要为 NIC 接收缓冲区和用户端口分配更多内存。
答案2
RX 和 TX 缓冲区通常等于一个以太网帧。如果您将 RX 缓冲区数配置为 512,则驱动程序将留出足够的缓冲区来处理 512 个以太网帧。由于不同的 NIC 使用不同的缓冲区描述符数据结构,因此内存量会略有不同,但通常您应该将缓冲区大小乘以 MTU 来估算所需的内存量。
戴夫
答案3
如果您有代码访问权限,那么还有有用的 SO_RCVBUF 选项,尤其是在 Windows 上。
顺便问一下,有人知道 NIC 的 RX 缓冲区与 SO_RCVBUF 选项之间的关系是什么?(WskControlSocket/getsockopt)