UDP发送性能over loopback

背景

我有一个非常高吞吐量/低延迟的networking应用程序(目标是“每个数据包5 usec”),我想添加一些监测/指标。 我听说过这个热潮,似乎是一个简单的方法来收集指标并将它们input我们的时间序列数据库。 发送指标是通过一个小的udp数据包写入守护进程(通常运行在同一台服务器上)来完成的。

我想描述在我的数据path中发送〜5-10 udp数据包的效果,以了解它将添加多less延迟,并且对它有多糟糕感到惊讶。 我知道这是一个非常模糊的微观基准,但只是想了解它的落地位置。

我有这个问题

我想了解为什么需要这么长时间(相对来说)发送UDP数据包到本地主机而不是远程主机。 我可以做些什么来减less发送UDP数据包的延迟吗? 我正在考虑将度量收集推送到辅助核心的解决scheme,或者实际上在单独的主机上运行statsd守护进程。


我的设置/基准

CentOS 6.5与一些强壮的服务器硬件。
我一直在使用的客户端testing程序可以在这里find: https : //gist.github.com/rishid/9178261
用gcc编译4.7.3 gcc -O3 -std=gnu99 -mtune=native udp_send_bm.c -lrt -o udp_send_bm
接收nc -ulk 127.0.0.1 12000 > /dev/null在运行nc -ulk 127.0.0.1 12000 > /dev/null (每个IF更改ip)

我用以下设备运行了这个微型基准testing。
一些基准结果:

  • 回送
    • 数据包大小500 //每发送一次的时间()2159纳秒//总时间2.159518
  • 集成1 Gb主板控制器
    • 数据包大小500 //每发送一次的时间()397纳秒//总时间0.397234
  • 英特尔ixgbe 10 Gb
    • 数据包大小500 //每发送一次的时间()449纳秒//总时间0.449355
  • solarflare 10 Gb与用户空间堆栈(onload)
    • 数据包大小500 //每发送一次的时间()317纳秒//总时间0.317229

写入回送将不是一种有效的方法来进行性能分析的进程间通信。 通常情况下,缓冲区在处理之前会被复制多次,而且由于使用了udp,所以会有丢包的风险。 您也正在向操作系统发出额外的呼叫,因此会增加上下文切换的风险(〜2us)。

目标是“每个数据包5个用户”

这是一个难以实时的要求,还是软要求? 通常,当你在微秒内处理事物时,分析应该是零开销。 你正在使用solarflare ?,所以我认为你是认真的。 我知道要做到这一点的最好方法是进入物理线路,并嗅探流量的指标。 许多产品都是这样做的。

I / O到磁盘或网络是非常缓慢的,如果你把它在一个非常紧密的(实时)处理循环。 解决方案可能是将I / O卸载到单独的低优先级任务。 让实时循环通过(最佳无锁)队列将消息传递给I / O任务。