UDP通过环回发送性能

时间:2014-02-23 22:32:11

标签: c linux performance sockets 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(每个IF的IP更改)

我使用以下设备运行此微基准测试。
一些基准测试结果:

  • 环回
    • 数据包大小500 //每个发送时间()2159 nanosec //总时间2.159518
  • 集成1 Gb主板控制器
    • 数据包大小500 //每个发送时间()397 nanosec //总时间0.397234
  • intel ixgbe 10 Gb
    • 数据包大小500 //每个发送时间()449 nanosec //总时间0.449355
  • solarflare 10 Gb with userspace stack(onload)
    • 数据包大小500 //每个发送时间()317 nanosec //总时间0.317229

2 个答案:

答案 0 :(得分:3)

写入环回不是一种有效的方式来进行通信的进程间通信。通常,缓冲区在处理之前将被复制多次,因为您使用的是udp,因此存在丢弃数据包的风险。您还要对操作系统进行额外调用,因此会增加上下文切换的风险(~2us)。

  

目标是<<每包5个usec

这是硬实时要求还是软要求?通常,当您以微秒为单位处理事物时,分析应该是零开销。你正在使用solarflare?所以我觉得你很认真。我知道这样做的最好方法是利用物理线路,并嗅探指标的流量。许多产品都是这样做的。

答案 1 :(得分:-1)

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