【问题标题】:Flushing tx udp socket kernel buffers to reduce latency刷新 tx udp 套接字内核缓冲区以减少延迟
【发布时间】:2016-11-19 02:11:12
【问题描述】:

我有一个基于 Linux 的无线网络应用程序,它需要非常严格的延迟。即,与没有数据相比,数据包的延迟到达一点也不好。另外,socket 中的旧数据只能延迟较新的数据。

我正在寻找从传输端是否有任何方法可以检测到套接字堆积了旧数据,在这种情况下刷新/丢弃它并发送新数据。

我知道接收器可以读取所有旧数据并丢弃。但是,这仍然会起到追赶的作用,并不能真正帮助加快速度以及是否有发送方选项可供评估。

感谢您的帮助。

【问题讨论】:

  • 内核已经以最快的速度将数据从发送缓冲区中传输出去,必要时网络已经将其丢弃。
  • @EJP,谢谢!虽然是的,但尝试尽快发送缓冲区,在断开连接并重新连接的情况下,内核将首先发送旧数据,并可能在应用程序空间中丢弃/累积数据包,然后从新数据开始。我希望有一种方法可以通过完全清除旧数据来跳转到新数据。
  • 目前我们使用 debugfs 来读取 tx 队列,并且基于设置的上限阈值,我们不会向队列中添加更多数据,并等到 tx 队列达到低水位后再放入新的data 以防止将旧数据继续加载到流中。我们需要找到一种方法,如果 tx 队列达到上限阈值并立即到达队列底部,则丢弃它。

标签: linux sockets udp latency


【解决方案1】:

尝试在发送端关闭 Nagle 算法。该算法尝试将较小的数据包收集成较大的数据包以减少开销,因此关闭它可能意味着每个数据包都会立即发送。这是一个关闭它的代码sn-p:

void noNagle (int socket)
{
        int on = 1;
        if (setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0)
            bye ("Can not disable nagle algorithm\n");
}

【讨论】:

  • Nagle 算法是 TCP 的一部分,而不是 UDP。
猜你喜欢
  • 2023-03-04
  • 2012-03-03
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多