Linux客户端中的UDP客户端周期性sendto()延迟

时间:2017-01-31 23:33:23

标签: c linux sockets udp

我正在使用glibc 2.23在Linux中用C开发UDP客户端。我的应用程序在一个循环中发送小数据包(11个字节),速率为20,000个数据包/秒。

为了确保客户端达到其承诺的发送速率,我检查了我的应用程序,当我看到一个奇怪的行为时测量UDP发送时间。发送数据包(调用sendto()函数)所需的时间通常是“13”左右。

但是大约每30毫秒,有一个呼叫需要大约50个usec和大约每1500毫秒,有一个呼叫需要160 usec。数字是近似值,是长达1分钟的平均值。

下图显示了应用程序5秒运行的延迟值。 sendto() call delay as a function of runtime

以下是我尝试过的事情:

  • 使用affinity将我的应用程序固定到核心以避免上下文切换
  • 将UDP发送/接收缓冲区大小从100K更改为1G(较小的缓冲区大小会略微减少延迟量,但不会减少频率)
  • 将IPV4格式更改为IPV6(无差异)

也尝试过:

  • 已停用arp(地址解析协议)
  • 在服务器和客户端位于同一台计算机以及两台不同的计算机(通过交换机连接)时进行测试,结果没有区别
  • 在10G和1G网卡之间切换,结果没有区别
  • 在通过虚拟网桥连接的同一台计算机上的两个docker实例上运行客户端和服务器,结果没有区别。

我想知道是否有人经历过这样的行为?

我很欣赏有关避免代价高昂的电话的原因或解决方案的任何建议吗?

0 个答案:

没有答案