我有一个非常高吞吐量/低延迟的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。
一些基准结果:
写入回送将不是一种有效的方法来进行性能分析的进程间通信。 通常情况下,缓冲区在处理之前会被复制多次,而且由于使用了udp,所以会有丢包的风险。 您也正在向操作系统发出额外的呼叫,因此会增加上下文切换的风险(〜2us)。
目标是“每个数据包5个用户”
这是一个难以实时的要求,还是软要求? 通常,当你在微秒内处理事物时,分析应该是零开销。 你正在使用solarflare ?,所以我认为你是认真的。 我知道要做到这一点的最好方法是进入物理线路,并嗅探流量的指标。 许多产品都是这样做的。
I / O到磁盘或网络是非常缓慢的,如果你把它在一个非常紧密的(实时)处理循环。 解决方案可能是将I / O卸载到单独的低优先级任务。 让实时循环通过(最佳无锁)队列将消息传递给I / O任务。