背景
我有一个非常高的吞吐量/低延迟网络应用程序(目标是每包<< 5 usec ),我想给它添加一些监视/度量。我听说过statsd的流行,这似乎是收集度量并将其输入我们的时间序列数据库的一种简单方法。发送度量是通过向守护进程(通常运行在同一台服务器上)写入一个小udp数据包来完成的。
我想描述在我的数据路径中发送5-10个udp数据包的影响,以了解它会增加多少延迟,并对它有多么糟糕感到惊讶。我知道这是一个非常模糊的微观基准,但我只是想大致了解一下它的落脚点。
我有个问题
我试图理解为什么要花这么长时间(相对地说)才能将UDP数据包发送到本地主机而不是远程主机。我是否可以进行任何调整以减少发送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更改)。
我用下面的设备运行了这个微基准测试。
一些基准结果:
发布于 2014-02-24 23:14:54
写入回送将不是一种有效的方式来沟通进程间的剖析。通常,缓冲区在被处理之前会被复制多次,并且您会因为使用udp而面临丢弃数据包的风险。您还在操作系统中进行额外的调用,因此增加了上下文切换的风险(~2us)。
目标是每包<< 5 usec
这是一个硬实时要求,还是一个软要求?通常,当您在微秒内处理事情时,分析应该是零开销。你用的是太阳光?所以我觉得你是认真的。我所知道的最好的方法是挖掘物理线路,并嗅探流量以获取度量。许多产品都是这样做的。
发布于 2014-02-23 22:49:31
i/o到磁盘或网络非常慢,如果您将它合并在一个非常紧凑(实时)的处理循环中。解决方案可能是将i/o卸载到单独的低优先级任务。让实时循环通过(最佳无锁定)队列将消息传递给i/o任务。
https://stackoverflow.com/questions/21975577
复制相似问题