【问题标题】:Specifying UDP receive buffer size at runtime in Linux在 Linux 中在运行时指定 UDP 接收缓冲区大小
【发布时间】:2011-01-06 15:29:03
【问题描述】:

在 Linux 中,可以使用以下命令为网络数据包(例如 UDP)指定系统的默认接收缓冲区大小:

sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>

但我想知道,应用程序(例如,c)是否可以通过在运行时指定每个 UDP 套接字的接收缓冲区大小来覆盖系统的默认值?

【问题讨论】:

    标签: linux sockets udp buffer


    【解决方案1】:

    您可以增加默认值,但不能增加超过最大值。使用setsockopt 更改SO_RCVBUF 选项:

    int n = 1024 * 1024;
    if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
      // deal with failure, or ignore if you can live with the default size
    }
    

    请注意,这是便携式解决方案;它应该适用于任何 POSIX 平台以增加接收缓冲区的大小。 Linux 已经有一段时间了autotuning(从 2.6.7 开始,reasonable maximum buffer sizes 从 2.6.17 开始),它会根据负载自动调整接收缓冲区的大小。在具有自动调整功能的内核上,建议您不要使用setsockopt 设置接收缓冲区大小,因为这将禁用内核的自动调整功能。但是,在其他平台上可能仍需要使用 setsockopt 调整缓冲区大小。

    【讨论】:

    • 正是我要找的 :) 我还想知道,如果我将缓冲区大小指定为一个较小的值,它会是静态的吗?或者系统是否会动态调整缓冲区大小以处理流量压力(如果有)?
    • 我已经扩展了我的答案,提到了 Linux TCP 自动调整;在 Linux 上,如果启用了自动调整,您可能不应该使用 setsockopt 调整缓冲区大小;但在其他系统上,您可能仍然需要。
    • 自动调整仅适用于 TCP 还是同时适用于 TCP 和 UDP?
    • @PiotrekDe 是的,请参阅 Socket.setReceiveBufferSize()Socket.setSendBufferSize()DatagramSocket.setReceiveBufferSize()DatagramSocket.setSendBufferSize()
    • @kumar,根据答案autotuning中提到的链接,它似乎只适用于 TCP
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多