Can Boost ASIO可用于构建低延迟应用,例如HFT(高频交易)吗?
因此Boost.ASIO使用特定于平台的最佳解复用机制:IOCP,epoll,kqueue,poll_set,/ dev/poll
也可以使用带TOE(TCP/IP卸载引擎)的Ethernet-Adapter和OpenOnload(内核旁路BSD套接字).
但是可以使用Boost.ASIO + TOE + OpenOnload构建低延迟应用程序吗?
我开始阅读著名的 Martin Fowler 书(企业应用程序架构模式)
我不得不提一下,我正在阅读翻译成我的母语的书,所以这可能是我误解的一个原因。
我找到了他们的定义(回译成英文):
响应时间- 处理一些外部请求的
时间 延迟- 获得任何响应之前的最短时间。
对我来说也是一样。你能强调一下区别吗?
在同一个码头容器中运行的两场战争之间有什么选择可以实现低延迟通信?
我基本上需要在另一场战争中调用一个服务,但不能承担将其称为Web服务的开销.
由于它们在同一个JVM中运行,我希望避免使用RMI/JMS等,但我不知道我还有其他选择吗?
我看过servlet之间的通信,但是因为不推荐使用直接方法调用,这似乎不是正确的选择?
我也发现了kyronet,但是有更好的解决方案,因为它在同一个JVM中吗?
我正在寻找的是像Apache Camel的VM组件(Web应用程序之间的seda),但由于只有一个应用程序使用Camel,因此不是一个选择.
我知道我可能要在战争之间分享一些DTO,但请不要建议将服务拉入共享库,如果这是一个选项,我不会问这个问题:)
编辑:
嵌入EJB容器也许不是一种选择.
hibernate batching/hibernate.order_updates/hibernate.order_inserts默认是否被禁用?批量大小为50时是否有任何缺点?对于order_updates/order_inserts参数也是如此.是否存在不应启用此功能的用例?使用此功能时是否会对性能产生影响?
我只能看到这些设置在我需要减少查询计数时有很大帮助,尤其是在我的应用程序和数据库服务器之间具有高延迟的云环境中.
我正在构建一个 FPV 机器人,我想通过本地 Wi-Fi 连接使用网络浏览器来控制它。
我正在使用带有 Raspbian Stretch 的 raspberry pi 3B+。我建立了自己的电机控制和功率调节器帽子。
经过大量研究测试,我决定使用 node.JS 作为 http 服务器和 socket.io 来提供与我的机器人的低延迟双向通信。该堆栈实现了大约 7 毫秒的延迟。
我需要将低延迟视频从连接到 RPI 的 USB 摄像头传输到浏览器。我的目标是在 10FPS 下达到至少 640x480 的分辨率,延迟为 50 毫秒或更好。我很高兴牺牲视觉忠诚度来从我的机器人那里获得更快的响应。
如果可能的话,我想在 UDP 中进行流式传输以提高流的可靠性。
如果可能,我想流式传输现代网络浏览器可以本地解码的视频。我想使用 H264 编解码器和 HTML5 视频标签。如果没有其他选择,我可以回退使用 javascript 播放器。
我进行了广泛的研究并尝试了许多工具。
其中,我尝试了 VLC、mjpg 流光、gstreamer 和 raspivid。有几次我进入了网络浏览器可以查看的流,但充其量我在 320x240 时得到了 700 毫秒的延迟。离我的目标很远很远。
目前我正在研究 WebRTC 解决方案。
我想对 NODE.JS 包或其他解决方案提出建议,以提供 UDP H264 视频流,该视频流可由 HTML5 视频标签解码,目标延迟为 50 毫秒。
谢谢
感谢您的回答!我会不断更新这个问题,一旦解决,我会发布解决方案。
推单个框架
我尝试了一种不同的方法,通过 websocket 推送单个 200KB 640x480 jpg …
我们的应用程序是通过Java中的TCP/IP套接字快速读取数据.我们正在使用带有非阻塞套接字和选择器的NIO库来指示读取的准备情况.平均而言,读取和处理读取数据的总处理时间是亚毫秒.然而,我们经常看到10-20毫秒的尖峰.(在Linux上运行).
使用tcpdump,我们可以看到tcpdump读取2条谨慎消息之间的时差,并将其与我们的应用程序时间进行比较.我们看到tcpdump似乎没有延迟,而应用程序可以显示20毫秒.
我们非常确定这不是GC,因为GC日志几乎没有显示Full GC,而且在JDK 6中(根据我的理解),默认GC是并行的,所以它不应该暂停应用程序线程(除非执行Full GC) .
它几乎看起来像Java的Selector.select(0)方法有一些延迟返回准备读取,因为在TCP层,数据已经可以读取(并且tcpdump正在读取它).
附加信息:在峰值负载时,我们每条消息处理大约6,000 x 150字节平均值,或每秒大约900 MB.
我们一直在分析和分析我们的应用程序,以尽可能减少延迟.我们的应用程序由3个独立的Java进程组成,它们都运行在同一台服务器上,它们通过TCP/IP套接字相互传递消息.
我们将第一个组件的处理时间缩短到25μs,但我们发现TCP/IP套接字(在本地主机上)写入下一个组件总是需要大约50μs.我们看到另一个异常行为,因为接受连接的组件可以写得更快(即<50μs).目前,除套接字通信外,所有组件的运行时间均小于100μs.
不是TCP/IP专家,我不知道可以做些什么来加快这个速度.Unix Domain Sockets会更快吗?MemoryMappedFiles?什么其他机制可能是一种更快的方式将数据从一个Java进程传递到另一个Java进程?
更新6/21/2011我们创建了2个基准测试应用程序,一个用Java编写,一个用C++编写,用于更紧密地比较TCP/IP并进行比较.Java应用程序使用NIO(阻塞模式),而C++使用Boost ASIO tcp库.结果或多或少相当,C++应用程序比Java快约4μs(但在其中一项测试中,Java胜过C++).此外,两个版本的每条消息的时间都有很多变化.
我认为我们同意共享内存实现最快的基本结论.(虽然我们也想评估Informatica产品,只要它符合预算.)
我已经成功地在我的ubuntu机器上安装了icecast和darkice,并能够在我的局域网上直播.但令我失望的是它有15秒到20秒的延迟.这是非常糟糕的表现.我不认为这是因为我的局域网连接,因为即使我试图在同一台ubuntu机器上听也有延迟!
我试图将icecast配置为没有突发大小,这意味着没有缓冲,这有助于我将延迟减少到大约6秒到8秒.所以,如果您有任何建议或非常好的配置值,那将对我有很大的帮助.
PS我正在播放的格式是mp3.有人建议我应该使用opus编解码器,但我不认为icecast或darkice支持它.
我的应用程序包含几个"旋转"的延迟关键线程,即从不阻塞.这样的线程预计占用一个CPU核心的100%.然而,现代操作系统似乎经常将线程从一个核心转移到另一个核心.因此,例如,使用此Windows代码:
void Processor::ConnectionThread()
{
while (work)
{
Iterate();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有在任务管理器中看到"100%占用"核心,整体系统负载为36-40%.
但如果我把它改成这个:
void Processor::ConnectionThread()
{
SetThreadAffinityMask(GetCurrentThread(), 2);
while (work)
{
Iterate();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我确实看到其中一个CPU核心被100%占用,整体系统负载也降低到34-36%.
这是否意味着我应该倾向于SetThreadAffinityMask"旋转"线程?如果我SetThreadAffinityMask在这种情况下改进延迟添加?我还应该为"旋转"线程做些什么来改善延迟?
我正在将我的应用程序移植到Linux,所以这个问题更多的是关于Linux,如果这很重要.
upd发现此幻灯片显示将忙等待线程绑定到CPU可能会有所帮助:

我正在尝试使用 FFMPEG 创建低延迟 CMAF 视频流。为此,我想lhls在 FFMPEG 中启用该选项,以便#EXT-X-PREFETCH在 HLS 清单中写入标签。
https://www.ffmpeg.org/ffmpeg-all.html
启用低延迟 HLS(LHLS)。添加 #EXT-X-PREFETCH 标签和当前 >segment 的 URI。Apple 没有 LHLS 的官方规范。与此同时,>hls.js 玩家正在尝试标准化一个开放的 LHLS 规范。>草案规范可在https://github.com/video-dev/hlsjs->rfcs/blob/lhls-spec/proposals/0001-lhls.md此选项也将尝试>遵守上述开放规范, 直到 Apple 的规范正式 > 支持它。仅在启用流和 hls_playlist 选项时适用。这是一个实验性功能。
ffmpeg -re -i ~/Documents/videos/BigBuckBunny.mp4 \
-map 0 -map 0 -map 0 -c:a aac -c:v libx264 -tune zerolatency \
-b:v:0 2000k -s:v:0 1280x720 -profile:v:0 high \
-b:v:1 1500k -s:v:1 640x340 -profile:v:1 main \
-b:v:2 500k -s:v:2 320x170 -profile:v:2 …Run Code Online (Sandbox Code Playgroud) low-latency ×10
java ×4
c++ ×2
tcp ×2
boost ×1
boost-asio ×1
ffmpeg ×1
hibernate ×1
html ×1
icecast ×1
interprocess ×1
ipc ×1
latency ×1
mpeg-dash ×1
nio ×1
node.js ×1
orm ×1
performance ×1
server ×1
sockets ×1
throughput ×1
video ×1