UDP通过环回发送性能

Ris*_*hiD 7 c sockets linux performance udp

背景

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

我想描述在我的数据路径中发送~5-10 udp数据包的效果,以了解它会增加多少延迟,并对它有多糟糕感到惊讶.我知道这是一个非常模糊的微观基准,但只是想了解它的落脚点.

我的问题

我试图理解为什么需要这么长时间(相对来说)将UDP数据包发送到localhost而不是远程主机.我是否可以进行任何调整以减少发送UDP数据包的延迟?我正在考虑解决方案让我将度量标准集合推送到辅助核心,或者在单独的主机上实际运行statsd守护程序.


我的设置/基准

CentOS 6.5带有一些强大的服务器硬件.
我一直在使用的客户端测试程序可以在这里找到: 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(ip更改为IF)

我用以下设备运行了这个微基准测试.
一些基准结果:

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

小智 -2

如果将其合并到非常紧密的(实时)处理循环中,则磁盘或网络的 I/O 速度会非常慢。解决方案可能是将 I/O 卸载到单独的较低优先级任务。让实时循环通过(最好的无锁)队列将消息传递给 i/o 任务。